pure-ftpd-1.0.49.orig/0000755000175000017500000000000013451111314013400 5ustar rackerackepure-ftpd-1.0.49.orig/src/0000755000175000017500000000000013451111314014167 5ustar rackerackepure-ftpd-1.0.49.orig/src/messages_en.h0000644000175000017500000003335113446174132016651 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Timeout" #define MSG_CAPABILITIES "Unable to switch capabilities" #define MSG_CLIENT_CLOSED_CNX "Client closed the connection" #define MSG_CLIENT_READ_ERR "Read error from the client" #define MSG_CANT_OPEN_CNX "Can't open connection" #define MSG_CANT_CREATE_DATA_SOCKET "Can't create the data socket" #define MSG_DEBUG_CLIENT_IS "The client address is" #define MSG_SYNTAX_ERROR_IP "Syntax error in IP address" #define MSG_PORT_SUCCESSFUL "PORT command successful" #define MSG_ONLY_IPV4V6 "Only IPv4 and IPv6 are supported (1,2)" #define MSG_ONLY_IPV4 "Only IPv4 is supported (1)" #define MSG_TIMEOUT_PARSER "Timeout - try typing a little faster next time" #define MSG_LINE_TOO_LONG "Line too long" #define MSG_LOG_OVERFLOW "The client tried to overflow the command line buffer" #define MSG_GOODBYE "Goodbye. You uploaded %llu and downloaded %llu kbytes." #define MSG_DEBUG_COMMAND "Command" #define MSG_IS_YOUR_CURRENT_LOCATION "is your current location" #define MSG_NOT_LOGGED_IN "You aren't logged in" #define MSG_AUTH_UNIMPLEMENTED "This security scheme is not implemented" #define MSG_NO_FILE_NAME "No file name" #define MSG_NO_DIRECTORY_NAME "No directory name" #define MSG_NO_RESTART_POINT "No restart point" #define MSG_ABOR_SUCCESS "Since you see this ABOR must've succeeded" #define MSG_MISSING_ARG "Missing argument" #define MSG_GARBAGE_FOUND "Garbage found after value" #define MSG_VALUE_TOO_LARGE "Value too large" #define MSG_IDLE_TIME "Idle time set to %lu seconds" #define MSG_SITE_HELP "The following SITE commands are recognized" #define MSG_BAD_CHMOD "Invalid permissions" #define MSG_UNKNOWN_EXTENSION "is an unknown extension" #define MSG_XDBG_OK "XDBG command succeeded, debug level is now %d" #define MSG_UNKNOWN_COMMAND "Unknown command" #define MSG_TIMEOUT_NOOP "Timeout (no operation for %lu seconds)" #define MSG_TIMEOUT_DATA "Timeout (no new data for %lu seconds)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "You're already logged in" #define MSG_ANY_PASSWORD "Any password will work" #define MSG_ANONYMOUS_LOGGED "Anonymous user logged in" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Anonymous user logged in the virtual FTP" #define MSG_USER_OK "User %s OK. Password required" #define MSG_CANT_DO_TWICE "We can't do that in the current session" #define MSG_UNABLE_SECURE_ANON "Unable to set up secure anonymous FTP" #define MSG_BANDWIDTH_RESTRICTED "Your bandwidth usage is restricted" #define MSG_NO_PASSWORD_NEEDED "Any password will work" #define MSG_NOTRUST "Sorry, but I can't trust you" #define MSG_WHOAREYOU "Please tell me who you are" #define MSG_AUTH_FAILED "Login authentication failed" #define MSG_AUTH_TOOMANY "Too many authentication failures" #define MSG_NO_HOMEDIR "Home directory not available - aborting" #define MSG_NO_HOMEDIR2 "%s does not exist or is unreachable" #define MSG_START_SLASH "Starting in /" #define MSG_USER_GROUP_ACCESS "User %s has group access to" #define MSG_FXP_SUPPORT "This server supports FXP transfers" #define MSG_RATIO "You must respect a %u:%u (UL/DL) ratio" #define MSG_CHROOT_FAILED "Unable to set up a secure chroot() jail" #define MSG_CURRENT_DIR_IS "OK. Current directory is %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Current restricted directory is %s" #define MSG_IS_NOW_LOGGED_IN "%s is now logged in" #define MSG_CANT_CHANGE_DIR "Can't change directory to %s" #define MSG_PATH_TOO_LONG "Path too long" #define MSG_CANT_PASV "You cannot use PASV on IPv6 connections. Use EPSV instead." #define MSG_CANT_PASSIVE "Unable to open a passive connection" #define MSG_PORTS_BUSY "All reserved TCP ports are busy" #define MSG_GETSOCKNAME_DATA "Unable to identify the local data socket" #define MSG_GETPEERNAME "Unable to identify the local socket" #define MSG_INVALID_IP "Sorry, invalid address given" #define MSG_NO_EPSV "Please use an IPv6-conformant client with EPSV support" #define MSG_BAD_PORT "Sorry, but I won't connect to ports < 1024" #define MSG_NO_FXP "I won't open a connection to %s (only to %s)" #define MSG_FXP "FXP transfer: from %s to %s" #define MSG_NO_DATA_CONN "No data connection" #define MSG_ACCEPT_FAILED "The connection couldn't be accepted" #define MSG_ACCEPT_SUCCESS "Accepted data connection" #define MSG_CNX_PORT_FAILED "Could not open data connection to port %d" #define MSG_CNX_PORT "Connecting to port %d" #define MSG_ANON_CANT_MKD "Sorry, anonymous users are not allowed to create directories" #define MSG_ANON_CANT_RMD "Sorry, anonymous users are not allowed to remove directories" #define MSG_ANON_CANT_RENAME "Anonymous users are not allowed to move/rename files" #define MSG_ANON_CANT_CHANGE_PERMS "Anonymous users can not change perms" #define MSG_GLOB_NO_MEMORY "Out of memory during globbing of %s" #define MSG_PROBABLY_DENIED "(This probably means \"Permission denied\")" #define MSG_GLOB_READ_ERROR "Read error during globbing of %s" #define MSG_GLOB_NO_MATCH "No match for %s in %s" #define MSG_CHMOD_FAILED "Could not change perms on %s" #define MSG_CHMOD_SUCCESS "Permissions changed on %s" #define MSG_CHMOD_TOTAL_FAILURE "Sorry, but I couldn't change any permission" #define MSG_ANON_CANT_DELETE "Anonymous users can not delete files" #define MSG_ANON_CANT_OVERWRITE "Anonymous users may not overwrite existing files" #define MSG_DELE_FAILED "Could not delete %s" #define MSG_DELE_SUCCESS "Deleted %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "No file deleted" #define MSG_LOAD_TOO_HIGH \ "The load was %3.2f when you connected. We do not allow downloads\n" \ "by anonymous users when the load is that high. Uploads are always\n" \ "allowed." #define MSG_OPEN_FAILURE "Can't open %s" #define MSG_OPEN_FAILURE2 "Can't open that file" #define MSG_STAT_FAILURE "Can't find file size" #define MSG_STAT_FAILURE2 "Can't check for file existence" #define MSG_REST_TOO_LARGE_FOR_FILE "Restart offset %lld is too large for file size %lld." #define MSG_REST_RESET "Restart offset reset to 0" #define MSG_NOT_REGULAR_FILE "I can only retrieve regular files" #define MSG_NOT_MODERATED \ "This file has been uploaded by an anonymous user. It has not\n" \ "yet been approved for downloading by the site administrators." #define MSG_RATIO_DENIAL \ "Sorry, but the upload/download ratio is %u:%u .\n" \ "You currently uploaded %llu Kb and downloaded %llu Kb.\n" \ "Please upload some goodies and try leeching later." #define MSG_NO_MORE_TO_DOWNLOAD "Nothing left to download" #define MSG_WINNER "The computer is your friend. Trust the computer" #define MSG_KBYTES_LEFT "%.1f kbytes to download" #define MSG_ABORTED "Transfer aborted" #define MSG_DATA_WRITE_FAILED "Error during write to data connection" #define MSG_DATA_READ_FAILED "Error during read from data connection" #define MSG_MMAP_FAILED "Unable to map the file into memory" #define MSG_WRITE_FAILED "Error during write to file" #define MSG_TRANSFER_RATE_M "%.3f seconds (measured here), %.2f Mbytes per second" #define MSG_TRANSFER_RATE_K "%.3f seconds (measured here), %.2f Kbytes per second" #define MSG_TRANSFER_RATE_B "%.3f seconds (measured here), %.2f bytes per second" #define MSG_SPACE_FREE_M "%.1f Mbytes free disk space" #define MSG_SPACE_FREE_K "%f Kbytes free disk space" #define MSG_DOWNLOADED "downloaded" #define MSG_REST_NOT_NUMERIC "REST needs a numeric parameter" #define MSG_REST_ASCII_STRICT "Reply marker must be 0 in ASCII mode" #define MSG_REST_ASCII_WORKAROUND "Restarting at %lld. But we're in ASCII mode" #define MSG_REST_SUCCESS "Restarting at %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Prohibited directory name" #define MSG_SANITY_FILE_FAILURE "Prohibited file name: %s" #define MSG_MKD_FAILURE "Can't create directory" #define MSG_MKD_SUCCESS "The directory was successfully created" #define MSG_RMD_FAILURE "Can't remove directory" #define MSG_RMD_SUCCESS "The directory was successfully removed" #define MSG_TIMESTAMP_FAILURE "Can't get a time stamp" #define MSG_MODE_ERROR "Only ASCII and binary modes are supported" #define MSG_CREATE_FAILURE "Unable to create file" #define MSG_ABRT_ONLY "ABRT is the only legal command while uploading" #define MSG_UPLOAD_PARTIAL "partially uploaded" #define MSG_REMOVED "removed" #define MSG_UPLOADED "uploaded" #define MSG_GMTIME_FAILURE "Couldn't get the local time" #define MSG_TYPE_8BIT_FAILURE "Only 8-bit bytes are supported, we're not 10 years ago" #define MSG_TYPE_UNKNOWN "Unknown TYPE" #define MSG_TYPE_SUCCESS "TYPE is now" #define MSG_STRU_FAILURE "Only F(ile) is supported" #define MSG_MODE_FAILURE "Please use S(tream) mode" #define MSG_RENAME_ABORT "Aborting previous rename operation" #define MSG_RENAME_RNFR_SUCCESS "RNFR accepted - file exists, ready for destination" #define MSG_FILE_DOESNT_EXIST "Sorry, but that file doesn't exist" #define MSG_RENAME_ALREADY_THERE "RENAME Failed - destination file already exists" #define MSG_RENAME_NORNFR "Need RNFR before RNTO" #define MSG_RENAME_FAILURE "Rename/move failure" #define MSG_RENAME_SUCCESS "File successfully renamed or moved" #define MSG_NO_SUPERSERVER "Please run pure-ftpd within a super-server (like tcpserver)" #define MSG_NO_FTP_ACCOUNT "Unable to find the 'ftp' account" #define MSG_CONF_ERR "Configuration error" #define MSG_NO_VIRTUAL_FILE "Missing virtual users file name" #define MSG_ILLEGAL_THROTTLING "Illegal value for throttling" #define MSG_ILLEGAL_TRUSTED_GID "Illegal trusted gid for chroot" #define MSG_ILLEGAL_USER_LIMIT "Illegal user limit" #define MSG_ILLEGAL_FACILITY "Unknown facility name" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Invalid LDAP configuration file" #define MSG_ILLEGAL_LOAD_LIMIT "Illegal load limit" #define MSG_ILLEGAL_PORTS_RANGE "Illegal ports range" #define MSG_ILLEGAL_LS_LIMITS "Illegal 'ls' limits" #define MSG_ILLEGAL_FORCE_PASSIVE "Illegal forced IP for passive connections" #define MSG_ILLEGAL_RATIO "Illegal upload/download ratio" #define MSG_ILLEGAL_UID_LIMIT "Illegal uid limit" #define MSG_ILLEGAL_OPTION "Unknown run-time option" #define MSG_LDAP_MISSING_BASE "Missing LDAPBaseDN in the LDAP configuration file" #define MSG_LDAP_WRONG_PARMS "Wrong LDAP parameters" #define MSG_NEW_CONNECTION "New connection from %s" #define MSG_WELCOME_TO "Welcome to" #define MSG_MAX_USERS "%lu users (the maximum) are already logged in, sorry" #define MSG_NB_USERS "You are user number %u of %u allowed." #define MSG_WELCOME_TIME "Local time is now %02d:%02d. Server port: %u." #define MSG_ANONYMOUS_FTP_ONLY "Only anonymous FTP is allowed here" #define MSG_RATIOS_EVERYONE "RATIOS ARE ENABLED FOR EVERYONE:" #define MSG_RATIOS_ANONYMOUS "ANONYMOUS USERS ARE SUBJECT TO AN UL/DL RATIO:" #define MSG_RATIOS_RULE "to download %u Mb, uploading %u Mb of goodies is mandatory." #define MSG_INFO_IDLE_M "You will be disconnected after %lu minutes of inactivity." #define MSG_INFO_IDLE_S "You will be disconnected after %lu seconds of inactivity." #define MSG_CANT_READ_FILE "Sorry, we were unable to read [%s]" #define MSG_LS_TRUNCATED "Output truncated to %u matches" #define MSG_LS_SUCCESS "%u matches total" #define MSG_LOGOUT "Logout." #define MSG_AUTH_FAILED_LOG "Authentication failed for user [%s]" #define MSG_ILLEGAL_UMASK "Invalid umask" #define MSG_STANDALONE_FAILED "Unable to start a standalone server" #define MSG_NO_ANONYMOUS_LOGIN "This is a private system - No anonymous login" #define MSG_ANONYMOUS_ANY_PASSWORD "Any password will work" #define MSG_MAX_USERS_IP "Too many connections (%lu) from this IP" #define MSG_ACTIVE_DISABLED "Active mode is disabled" #define MSG_TRANSFER_SUCCESSFUL "File successfully transferred" #define MSG_NO_DISK_SPACE "Disk full - please upload later" #define MSG_OUT_OF_MEMORY "Out of memory" #define MSG_ILLEGAL_TRUSTED_IP "Illegal trusted IP address" #define MSG_NO_ASCII_RESUME "ASCII resume is unsafe, please delete the file first" #define MSG_UNKNOWN_ALTLOG "Unknown logging format" #define MSG_ACCOUNT_DISABLED "Can't login as [%s]: account disabled" #define MSG_SQL_WRONG_PARMS "Wrong SQL parameters" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Invalid SQL configuration file" #define MSG_SQL_MISSING_SERVER "Missing server in the SQL configuration file" #define MSG_SQL_DOWN "The SQL server seems to be down" #define MSG_ILLEGAL_QUOTA "Invalid quota" #define MSG_QUOTA_FILES "%llu files used (%d%%) - authorized: %llu files" #define MSG_QUOTA_SIZE "%llu Kbytes used (%d%%) - authorized: %llu Kb" #define MSG_QUOTA_EXCEEDED "Quota exceeded: [%s] won't be saved" #define MSG_AUTH_UNKNOWN "Unknown authentication method" #define MSG_PDB_BROKEN "Unable to read the indexed puredb file (or old format detected) - Try pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s is an alias for %s." #define MSG_ALIASES_UNKNOWN "Unknown alias %s." #define MSG_ALIASES_BROKEN_FILE "Damaged aliases file" #define MSG_ALIASES_LIST "The following aliases are available :" #define MSG_PERUSER_MAX "I can't accept more than %lu connections as the same user" #define MSG_IPV6_OK "IPv6 connections are also welcome on this server." #define MSG_TLS_INFO "TLS: Enabled %s with %s, %d secret bits cipher" #define MSG_TLS_WEAK "TLS: Cipher too weak" #define MSG_TLS_NEEDED "Sorry, cleartext sessions and weak ciphers are not accepted on this server.\n" \ "Please reconnect using TLS security mechanisms." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/crypto-sha1.c0000644000175000017500000001505213450665407016530 0ustar rackeracke/* * SHA-1 in C * By Steve Reid * 100% Public Domain * * Test Vectors (from FIPS PUB 180-1) * "abc" * A9993E36 4706816A BA3E2571 7850C26C 9CD0D89D * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" * 84983E44 1C3BD26E BAAE4AA1 F95129E5 E54670F1 * A million repetitions of "a" * 34AA973C D4C4DAA4 F61EEB2B DBAD2731 6534016F */ #include #if (defined(WITH_LDAP) || defined(WITH_MYSQL) || defined(WITH_PGSQL)) && !defined(USE_SYSTEM_CRYPT_SHA1) #include "ftpd.h" #include "crypto.h" #include "crypto-sha1.h" #include "utils.h" #ifdef WITH_DMALLOC # include #endif /* #define SHA1HANDSOFF * Copies data before messing with it. */ #define SHA1HANDSOFF #define rol(value, bits) (((value) << (bits)) | ((value) >> (32 - (bits)))) /* blk0() and blk() perform the initial expand. */ /* I got the idea of expanding during the round function from SSLeay */ #ifndef WORDS_BIGENDIAN # define blk0(i) (block->l[i] = (rol(block->l[i],24)&0xFF00FF00) \ |(rol(block->l[i],8)&0x00FF00FF)) #else # define blk0(i) block->l[i] #endif #define blk(i) (block->l[i&15] = rol(block->l[(i+13)&15]^block->l[(i+8)&15] \ ^block->l[(i+2)&15]^block->l[i&15],1)) /* (R0+R1), R2, R3, R4 are the different operations used in SHA1 */ #define R0(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk0(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R1(v,w,x,y,z,i) z+=((w&(x^y))^y)+blk(i)+0x5A827999+rol(v,5);w=rol(w,30); #define R2(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0x6ED9EBA1+rol(v,5);w=rol(w,30); #define R3(v,w,x,y,z,i) z+=(((w|x)&y)|(w&x))+blk(i)+0x8F1BBCDC+rol(v,5);w=rol(w,30); #define R4(v,w,x,y,z,i) z+=(w^x^y)+blk(i)+0xCA62C1D6+rol(v,5);w=rol(w,30); /* Hash a single 512-bit block. This is the core of the algorithm. */ static void SHA1Transform(uint32_t state[5], const unsigned char buffer[64]) { uint32_t a, b, c, d, e; typedef union { unsigned char c[64]; uint32_t l[16]; } CHAR64LONG16; CHAR64LONG16 *block; #ifdef SHA1HANDSOFF CHAR64LONG16 workspace; block = &workspace; memcpy(block, buffer, 64); #else block = (CHAR64LONG16 *) buffer; #endif /* Copy context->state[] to working vars */ a = state[0]; b = state[1]; c = state[2]; d = state[3]; e = state[4]; /* 4 rounds of 20 operations each. Loop unrolled. */ R0(a, b, c, d, e, 0); R0(e, a, b, c, d, 1); R0(d, e, a, b, c, 2); R0(c, d, e, a, b, 3); R0(b, c, d, e, a, 4); R0(a, b, c, d, e, 5); R0(e, a, b, c, d, 6); R0(d, e, a, b, c, 7); R0(c, d, e, a, b, 8); R0(b, c, d, e, a, 9); R0(a, b, c, d, e, 10); R0(e, a, b, c, d, 11); R0(d, e, a, b, c, 12); R0(c, d, e, a, b, 13); R0(b, c, d, e, a, 14); R0(a, b, c, d, e, 15); R1(e, a, b, c, d, 16); R1(d, e, a, b, c, 17); R1(c, d, e, a, b, 18); R1(b, c, d, e, a, 19); R2(a, b, c, d, e, 20); R2(e, a, b, c, d, 21); R2(d, e, a, b, c, 22); R2(c, d, e, a, b, 23); R2(b, c, d, e, a, 24); R2(a, b, c, d, e, 25); R2(e, a, b, c, d, 26); R2(d, e, a, b, c, 27); R2(c, d, e, a, b, 28); R2(b, c, d, e, a, 29); R2(a, b, c, d, e, 30); R2(e, a, b, c, d, 31); R2(d, e, a, b, c, 32); R2(c, d, e, a, b, 33); R2(b, c, d, e, a, 34); R2(a, b, c, d, e, 35); R2(e, a, b, c, d, 36); R2(d, e, a, b, c, 37); R2(c, d, e, a, b, 38); R2(b, c, d, e, a, 39); R3(a, b, c, d, e, 40); R3(e, a, b, c, d, 41); R3(d, e, a, b, c, 42); R3(c, d, e, a, b, 43); R3(b, c, d, e, a, 44); R3(a, b, c, d, e, 45); R3(e, a, b, c, d, 46); R3(d, e, a, b, c, 47); R3(c, d, e, a, b, 48); R3(b, c, d, e, a, 49); R3(a, b, c, d, e, 50); R3(e, a, b, c, d, 51); R3(d, e, a, b, c, 52); R3(c, d, e, a, b, 53); R3(b, c, d, e, a, 54); R3(a, b, c, d, e, 55); R3(e, a, b, c, d, 56); R3(d, e, a, b, c, 57); R3(c, d, e, a, b, 58); R3(b, c, d, e, a, 59); R4(a, b, c, d, e, 60); R4(e, a, b, c, d, 61); R4(d, e, a, b, c, 62); R4(c, d, e, a, b, 63); R4(b, c, d, e, a, 64); R4(a, b, c, d, e, 65); R4(e, a, b, c, d, 66); R4(d, e, a, b, c, 67); R4(c, d, e, a, b, 68); R4(b, c, d, e, a, 69); R4(a, b, c, d, e, 70); R4(e, a, b, c, d, 71); R4(d, e, a, b, c, 72); R4(c, d, e, a, b, 73); R4(b, c, d, e, a, 74); R4(a, b, c, d, e, 75); R4(e, a, b, c, d, 76); R4(d, e, a, b, c, 77); R4(c, d, e, a, b, 78); R4(b, c, d, e, a, 79); /* Add the working vars back into context.state[] */ state[0] += a; state[1] += b; state[2] += c; state[3] += d; state[4] += e; } /* SHA1Init - Initialize new context */ void SHA1Init(SHA1_CTX * context) { /* SHA1 initialization constants */ context->state[0] = 0x67452301; context->state[1] = 0xEFCDAB89; context->state[2] = 0x98BADCFE; context->state[3] = 0x10325476; context->state[4] = 0xC3D2E1F0; context->count[0] = context->count[1] = 0; } /* Run your data through this. */ void SHA1Update(SHA1_CTX * context, const unsigned char *data, size_t len) { size_t i; size_t j; j = context->count[0]; if ((context->count[0] += len << 3) < j) { context->count[1] += (len >> 29) + 1; } j = (j >> 3) & 63; if ((j + len) > 63) { memcpy(&context->buffer[j], data, (i = 64 - j)); SHA1Transform(context->state, context->buffer); for (; i + 63 < len; i += 64) { SHA1Transform(context->state, &data[i]); } j = 0; } else { i = 0; } memcpy(&context->buffer[j], &data[i], len - i); } /* Add padding and return the message digest. */ void SHA1Final(unsigned char digest[20], SHA1_CTX * context) { size_t i; unsigned char finalcount[8]; for (i = 0; i < 8; i++) { finalcount[i] = (unsigned char) ((context->count[(i >= 4 ? 0 : 1)] >> ((3 - (i & 3)) * 8)) & 255); /* Endian independent */ } SHA1Update(context, (const unsigned char *) "\200", 1); while ((context->count[0] & 504) != 448) { SHA1Update(context, (const unsigned char *) "\0", 1); } SHA1Update(context, finalcount, 8); /* Should cause a SHA1Transform() */ if (digest != NULL) { for (i = 0; i < 20; i++) { digest[i] = (unsigned char) ((context->state[i >> 2] >> ((3 - (i & 3)) * 8)) & 255); } } /* Wipe variables */ pure_memzero(context->buffer, 64); pure_memzero(context->state, 20); pure_memzero(context->count, 8); pure_memzero(&finalcount, 8); } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/ptracetest.c0000644000175000017500000000506013450665410016524 0ustar rackeracke /* * This little program checks whether your operating system allows a process * to attach to another process whose uid is only identical because it * revoked its privileges. * * If it detects that your operating system may be unsafe, then it's probably * better to avoid usage of privilege separation if untrusted users have * shell access. * * Compile and run with : * * make ptracetest * ./ptracetest * * (C)opyleft 2003-2009 Jedi/Sector One . */ #include #include "ftpd.h" #ifdef HAVE_SYS_WAIT_H # include #endif #define TEST_GID 65534 #define TEST_UID 65534 #define ZIPPER "|/-\\ " #if !defined(HAVE_PTRACE) || !defined(HAVE_SYS_PTRACE_H) || !(defined(PT_ATTACH) || defined(PTRACE_ATTACH)) int main(void) { fputs("Sorry, this test can't be compiled in this platform\n", stderr); return 255; } #else # include int main(void) { pid_t pid; int rtn = 1; if (geteuid() != (uid_t) 0) { fputs("Sorry, you need to run this program as root\n", stderr); return 254; } if (setgid((gid_t) TEST_GID) || setegid((gid_t) TEST_GID) || setuid((uid_t) TEST_UID) || seteuid((uid_t) TEST_UID)) { perror("Error while switching gid/uid"); return 254; } if ((pid = fork()) == (pid_t) -1) { perror("Unable to fork"); return 254; } if (pid == (pid_t) 0) { size_t t = (size_t) 0U; fputs("Checking for traceability after uid change ", stdout); fflush(stdout); do { putchar(ZIPPER[t]); putchar('\b'); fflush(stdout); (void) sleep(1U); t++; } while (t < sizeof ZIPPER - (size_t) 1U); putchar('\n'); _exit(0); } else { int status; long ret; # ifdef PT_ATTACH ret = ptrace(PT_ATTACH, pid, NULL, NULL); # else ret = ptrace(PTRACE_ATTACH, pid, NULL, NULL); # endif while (wait(&status) != pid); if (ret < 0L) { puts("\n" "*** YOUR OPERATING SYSTEM LOOKS SAFE ***\n" "\n" "You can probably enable privilege separation, even if\n" "untrusted users also have shell access."); rtn = 0; } else { puts("\n" "*** YOUR OPERATING SYSTEM MAY BE _UNSAFE_ ***\n" "\n" "Enabling privilege separation is ok as long as untrusted\n" "users don't have shell access."); } } return rtn; } #endif pure-ftpd-1.0.49.orig/src/quotas.c0000644000175000017500000001033113450665410015657 0ustar rackeracke#include #ifdef QUOTAS # include "ftpd.h" # include "dynamic.h" # include "ftpwho-update.h" # include "globals.h" # include "messages.h" # include "quotas.h" # include "safe_rw.h" # ifdef WITH_DMALLOC # include # endif int hasquota(void) { if (guest != 0 || (user_quota_files >= ULONG_LONG_MAX && user_quota_size >= ULONG_LONG_MAX)) { return -1; } return 0; } int quota_update(Quota *quota, const long long files_add, const long long size_add, int *overflow) { int fd; Quota old_quota = { 0ULL, 0ULL }; Quota dummy_quota; struct flock lock; ssize_t readnb; int err = -1; char buf[84]; char *bufpnt = buf; int dummy_overflow; ssize_t left = (ssize_t) (sizeof buf - 1U); size_t buf_len; if (hasquota() != 0 || chrooted == 0) { return -2; } if (overflow == NULL) { overflow = &dummy_overflow; } if (quota == NULL) { quota = &dummy_quota; } *overflow = 0; *quota = old_quota; if ((fd = open("/" QUOTA_FILE, O_RDWR | O_CREAT | O_NOFOLLOW, (mode_t) 0600)) == -1) { return -1; } lock.l_whence = SEEK_SET; lock.l_start = (off_t) 0; lock.l_len = (off_t) 0; lock.l_pid = getpid(); lock.l_type = F_WRLCK; while (fcntl(fd, F_SETLKW, &lock) < 0) { if (errno != EINTR) { goto byenounlock; } } do { while ((readnb = read(fd, bufpnt, left)) < (ssize_t) 0 && errno == EINTR); if (readnb < (ssize_t) 0) { goto bye; } bufpnt += readnb; left -= readnb; } while (left > (ssize_t) 0 && readnb != (ssize_t) 0); *bufpnt = 0; if ((bufpnt = strchr(buf, ' ')) == NULL) { goto skipparse; } *bufpnt = 0; old_quota.files = quota->files = strtoull(buf, NULL, 10); old_quota.size = quota->size = strtoull(bufpnt + 1, NULL, 10); skipparse: if ((files_add | size_add) == 0LL) { goto okbye; } if (files_add < 0LL) { if (quota->files > (unsigned long long) -files_add) { quota->files -= (unsigned long long) (-files_add); } else { quota->files = 0ULL; } } else if (files_add >= 0LL) { quota->files += (unsigned long long) files_add; if (quota->files > user_quota_files) { *overflow = 1; } } if (size_add < 0LL) { if (quota->size > (unsigned long long) -size_add) { quota->size -= (unsigned long long) (-size_add); } else { quota->size = 0ULL; } } else if (size_add >= 0LL) { quota->size += size_add; if (quota->size > user_quota_size) { *overflow = 2; } } if ((old_quota.size != quota->size || old_quota.files != quota->files) && !SNCHECK(snprintf(buf, sizeof buf, "%llu %llu\n", quota->files, quota->size), sizeof buf) && lseek(fd, (off_t) 0, SEEK_SET) != (off_t) -1 && ftruncate(fd, (off_t) 0) == 0) { buf_len = strlen(buf); if (safe_write(fd, buf, buf_len, -1) != (ssize_t) buf_len) { (void) ftruncate(fd, (off_t) 0); goto bye; } } okbye: err = 0; bye: lock.l_type = F_UNLCK; while (fcntl(fd, F_SETLK, &lock) < 0 && errno == EINTR); byenounlock: close(fd); return err; } void displayquota(Quota * const quota_) { Quota quota; double pct; if (hasquota() != 0) { return; } if (quota_ == NULL) { if (quota_update("a, 0LL, 0LL, NULL) != 0) { return; } } else { quota = *quota_; } if (user_quota_files < ULONG_LONG_MAX) { pct = (double) quota.files * 100.0 / (double) user_quota_files; addreply(0, MSG_QUOTA_FILES, quota.files, (int) pct, (unsigned long long) user_quota_files); } if (user_quota_size < ULONG_LONG_MAX) { pct = (double) quota.size * 100.0 / (double) user_quota_size; addreply(0, MSG_QUOTA_SIZE, quota.size / 1024ULL, (int) pct, (unsigned long long) user_quota_size / 1024ULL); } } #endif pure-ftpd-1.0.49.orig/src/messages_es.h0000644000175000017500000003570113446174132016657 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Timeout" #define MSG_CAPABILITIES "No se han podido alternar capacidades" #define MSG_CLIENT_CLOSED_CNX "El cliente cerró la conexión" #define MSG_CLIENT_READ_ERR "Error de lectura del cliente" #define MSG_CANT_OPEN_CNX "No se puede abrir conexión" #define MSG_CANT_CREATE_DATA_SOCKET "No se puede crear el socket de datos" #define MSG_DEBUG_CLIENT_IS "La dirección del cliente es" #define MSG_SYNTAX_ERROR_IP "Error de sintaxis en la dirección IP" #define MSG_PORT_SUCCESSFUL "Comando PORT con éxito" #define MSG_ONLY_IPV4V6 "Sólo IPv4 e IPv6 están soportados (1,2)" #define MSG_ONLY_IPV4 "Sólo IPv4 está soportado (1)" #define MSG_TIMEOUT_PARSER "Timeout - intenta escribir más rápido la próxima vez" #define MSG_LINE_TOO_LONG "Línea demasiado larga" #define MSG_LOG_OVERFLOW "El cliente intentó desbordar el buffer de la línea de comandos" #define MSG_GOODBYE "Adiós. Has transmitido %llu y descargado %llu kbytes." #define MSG_DEBUG_COMMAND "Comando" #define MSG_IS_YOUR_CURRENT_LOCATION "es tu localización actual" #define MSG_NOT_LOGGED_IN "No estás dentro del sistema" #define MSG_AUTH_UNIMPLEMENTED "Extensiones de seguridad no implementadas" #define MSG_NO_FILE_NAME "No existe nombre de archivo" #define MSG_NO_DIRECTORY_NAME "No existe nombre de directorio" #define MSG_NO_RESTART_POINT "No existe punto de reinicio" #define MSG_ABOR_SUCCESS "Mientras ves esto ABOR debería haber tenido éxito" #define MSG_MISSING_ARG "Falta argumento" #define MSG_GARBAGE_FOUND "Encontrada basura después del valor" #define MSG_VALUE_TOO_LARGE "Valor demasiado grande" #define MSG_IDLE_TIME "Tiempo inactivo puesto a %lu segundos" #define MSG_SITE_HELP "Los siguientes comandos SITE son reconocidos" #define MSG_BAD_CHMOD "Permisos no válidos" #define MSG_UNKNOWN_EXTENSION "es una extensión desconocida" #define MSG_XDBG_OK "Comando XDBG con éxito, el nivel de depuración es ahora %d" #define MSG_UNKNOWN_COMMAND "Comando desconocido" #define MSG_TIMEOUT_NOOP "Timeout (sin realizar operaciones durante %lu segundos)" #define MSG_TIMEOUT_DATA "Timeout (sin nuevos datos durante %lu segundos)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "Ya estás dentro del sistema" #define MSG_ANY_PASSWORD "Cualquier clave funcionará" #define MSG_ANONYMOUS_LOGGED "Usuario Anónimo dentro del sistema" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Usuario Anónimo dentro del FTP virtual" #define MSG_USER_OK "Usuario %s OK. Clave requerida" #define MSG_CANT_DO_TWICE "No podemos hacer esto en la sesión actual" #define MSG_UNABLE_SECURE_ANON "No se pudo establecer FTP anónimo seguro" #define MSG_BANDWIDTH_RESTRICTED "Tu utilización de ancho de banda está restringida" #define MSG_NO_PASSWORD_NEEDED "No necesito ninguna clave, querido anónimo cobarde" #define MSG_NOTRUST "Lo siento, pero no te creo" #define MSG_WHOAREYOU "Por favor, dime quién eres" #define MSG_AUTH_FAILED "Autentificación fallida, lo siento" #define MSG_AUTH_TOOMANY "Demasiados fallos de autentificación" #define MSG_NO_HOMEDIR "Directorio Home no disponible - abortando" #define MSG_NO_HOMEDIR2 "%s no existe o es inalcanzable" #define MSG_START_SLASH "Comenzando en /" #define MSG_USER_GROUP_ACCESS "Usuario %s tiene acceso de grupo a" #define MSG_FXP_SUPPORT "Este servidor soporta transferencias FXP" #define MSG_RATIO "Debes respetar una proporción %u:%u (UL/DL)" #define MSG_CHROOT_FAILED "Imposible establecer una jaula segura chroot()" #define MSG_CURRENT_DIR_IS "OK. El directorio actual es %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. El directorio restringido actual es %s" #define MSG_IS_NOW_LOGGED_IN "%s está ahora dentro del sistema" #define MSG_CANT_CHANGE_DIR "No puedo cambiar al directorio %s" #define MSG_PATH_TOO_LONG "Ruta demasiado larga" #define MSG_CANT_PASV "No puedo abrir una conexión pasiva con ese comando obsoleto" #define MSG_CANT_PASSIVE "Imposible abrir una conexión pasiva" #define MSG_PORTS_BUSY "Todos los puertos TCP reservados están ocupados" #define MSG_GETSOCKNAME_DATA "Imposible identificar el socket local de datos" #define MSG_GETPEERNAME "Imposible identificar el socket local" #define MSG_INVALID_IP "Lo siento, dirección dada inválida" #define MSG_NO_EPSV "Por favor, utiliza un cliente compatible IPv6 con soporte EPSV" #define MSG_BAD_PORT "Lo siento, pero no me conectaré a puertos < 1024" #define MSG_NO_FXP "No abriré una conexión a %s (sólo a %s)" #define MSG_FXP "Transferencia FXP : desde %s hacia %s" #define MSG_NO_DATA_CONN "No existe conexión de datos" #define MSG_ACCEPT_FAILED "La conexión no se pudo aceptar" #define MSG_ACCEPT_SUCCESS "Conexión de datos aceptada" #define MSG_CNX_PORT_FAILED "No se pudo abrir conexión de datos con el puerto %d" #define MSG_CNX_PORT "Conectando al puerto %d" #define MSG_ANON_CANT_MKD "Lo siento, los usuarios anónimos no pueden crear directorios" #define MSG_ANON_CANT_RMD "Lo siento, los usuarios anónimos no pueden borrar directorios" #define MSG_ANON_CANT_RENAME "Los usuarios anónimos no pueden mover/renombrar archivos" #define MSG_ANON_CANT_CHANGE_PERMS "Los usuarios anónimos no pueden cambiar permisos" #define MSG_GLOB_NO_MEMORY "Sin memoria durante globbing de %s" #define MSG_PROBABLY_DENIED "(Esto probablemente significa \"Permiso denegado\")" #define MSG_GLOB_READ_ERROR "Error de lectura durante %s" #define MSG_GLOB_NO_MATCH "No corresponde %s en %s" #define MSG_CHMOD_FAILED "No se pudieron cambiar los permisos en %s" #define MSG_CHMOD_SUCCESS "Permisos cambiados en %s" #define MSG_CHMOD_TOTAL_FAILURE "Lo siento, pero no pude cambiar ningún permiso" #define MSG_ANON_CANT_DELETE "Los usuarios anónimos no pueden borrar archivos" #define MSG_ANON_CANT_OVERWRITE "Los usuarios anónimos no pueden sobreescribir archivos existentes" #define MSG_DELE_FAILED "No se pudo borrar %s" #define MSG_DELE_SUCCESS "Borrado %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "Archivo no borrado" #define MSG_LOAD_TOO_HIGH \ "La carga era %3.2f cuando conectaste. No permitimos descargas\n" \ "de usuarios anónimos cuando la carga es tan alta. Las transmisiones se\n" \ "permiten siempre." #define MSG_OPEN_FAILURE "No se puede abrir %s" #define MSG_OPEN_FAILURE2 "No se puede abrir ese archivo" #define MSG_STAT_FAILURE "No se encuentra el tamańo del archivo" #define MSG_STAT_FAILURE2 "No se puede comprobar la existencia del archivo" #define MSG_REST_TOO_LARGE_FOR_FILE "El desplazamiento de reinicio %lld es demasiado grande para el tamańo de archivo %lld." #define MSG_REST_RESET "Desplazamiento de reinicio puesto a 0" #define MSG_NOT_REGULAR_FILE "Sólo puedo recuperar archivos comunes" #define MSG_NOT_MODERATED \ "Este archivo ha sido transmitido por un usuario anónimo. Todavía no ha\n" \ "sido aprobado por los administradores del sitio para poder ser descargado." #define MSG_RATIO_DENIAL \ "Lo siento, pero la proporción transmisión/descarga es %u:%u .\n" \ "Actualmente has transmitido %llu Kb y descargado %llu Kb.\n" \ "Por favor, transmite algunas cosas y trata de seguir descargando más tarde." #define MSG_NO_MORE_TO_DOWNLOAD "No queda nada por descargar" #define MSG_WINNER "El ordenador es tu amigo. Confía en el ordenador" #define MSG_KBYTES_LEFT "%.1f kbytes quedan por descargar" #define MSG_ABORTED "Transferencia abortada" #define MSG_DATA_WRITE_FAILED "Error al escribir en la conexión de datos" #define MSG_DATA_READ_FAILED "Error al leer de la conexión de datos" #define MSG_MMAP_FAILED "Imposible mapear el archivo en memoria" #define MSG_WRITE_FAILED "Error al escribir el archivo" #define MSG_TRANSFER_RATE_M "%.3f segundos (medidos aquí), %.2f Mbytes por segundo" #define MSG_TRANSFER_RATE_K "%.3f segundos (medidos aquí), %.2f Kbytes por segundo" #define MSG_TRANSFER_RATE_B "%.3f segundos (medidos aquí), %.2f bytes por segundo" #define MSG_SPACE_FREE_M "%.1f Mbytes de espacio libre en el disco" #define MSG_SPACE_FREE_K "%f Kbytes de espacio libre en el disco" #define MSG_DOWNLOADED "descargado" #define MSG_REST_NOT_NUMERIC "REST necesita un parámetro numérico" #define MSG_REST_ASCII_STRICT "Marca de respuesta debe ser 0 en modo ASCII" #define MSG_REST_ASCII_WORKAROUND "Reanudando en %lld. Pero estamos en modo ASCII" #define MSG_REST_SUCCESS "Reanudando en %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Nombre de directorio prohibido" #define MSG_SANITY_FILE_FAILURE "Nombre de archivo prohibido: %s" #define MSG_MKD_FAILURE "No puedo crear el directorio" #define MSG_MKD_SUCCESS "Directorio creado con éxito" #define MSG_RMD_FAILURE "No puedo borrar el directorio" #define MSG_RMD_SUCCESS "Directorio borrado con éxito" #define MSG_TIMESTAMP_FAILURE "No puedo conseguir una marca de tiempo" #define MSG_MODE_ERROR "Sólo los modos ASCII y binary están soportados" #define MSG_CREATE_FAILURE "Imposible crear archivo" #define MSG_ABRT_ONLY "ABRT es el único comando legal mientras se transmite" #define MSG_UPLOAD_PARTIAL "parcialmente transmitido" #define MSG_REMOVED "borrado" #define MSG_UPLOADED "transmitido" #define MSG_GMTIME_FAILURE "No puedo conseguir la hora local" #define MSG_TYPE_8BIT_FAILURE "Sólo los bytes de 8-bit están soportados, no estamos hace 10 ańos" #define MSG_TYPE_UNKNOWN "Desconocido TYPE" #define MSG_TYPE_SUCCESS "TYPE es ahora" #define MSG_STRU_FAILURE "Sólo F(ile) está soportado" #define MSG_MODE_FAILURE "Por favor, use el modo S(tream)" #define MSG_RENAME_ABORT "Abortando operación anterior de renombrado" #define MSG_RENAME_RNFR_SUCCESS "RNFR aceptado - archivo existe, preparado para destino" #define MSG_FILE_DOESNT_EXIST "Lo siento, pero ese archivo no existe" #define MSG_RENAME_ALREADY_THERE "RENAME falló - el archivo de destino ya existe" #define MSG_RENAME_NORNFR "Se necesita RNFR antes que RNTO" #define MSG_RENAME_FAILURE "Fallo al renombrar/mover" #define MSG_RENAME_SUCCESS "Archivo renombrado o movido con éxito" #define MSG_NO_SUPERSERVER "Por favor, ejecuta pure-ftpd dentro de un super-servidor (como tcpserver)" #define MSG_NO_FTP_ACCOUNT "Imposible encontrar la cuenta 'ftp'" #define MSG_CONF_ERR "Error de configuración" #define MSG_NO_VIRTUAL_FILE "Falta el archivo de nombres de usuarios virtuales" #define MSG_ILLEGAL_THROTTLING "Valor ilegal para flujo" #define MSG_ILLEGAL_TRUSTED_GID "El GID de confianza chroot es ilegal" #define MSG_ILLEGAL_USER_LIMIT "Límite de usuario ilegal" #define MSG_ILLEGAL_FACILITY "Nombre de facilidad desconocido" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Archivo de configuración LDAP inválido" #define MSG_ILLEGAL_LOAD_LIMIT "Límite de carga ilegal" #define MSG_ILLEGAL_PORTS_RANGE "Rango de puertos ilegal" #define MSG_ILLEGAL_LS_LIMITS "Límites 'ls' ilegales" #define MSG_ILLEGAL_FORCE_PASSIVE "IP forzada para conexiones pasivas ilegal" #define MSG_ILLEGAL_RATIO "Proporción de transmisión/recepción ilegal" #define MSG_ILLEGAL_UID_LIMIT "Límite uid ilegal" #define MSG_ILLEGAL_OPTION "Opción de ejecución desconocida" #define MSG_LDAP_MISSING_BASE "No se encuentra LDAPBaseDN en el archivo de configuración LDAP" #define MSG_LDAP_WRONG_PARMS "Parámetros LDAP incorrectos" #define MSG_NEW_CONNECTION "Nueva conexión desde %s" #define MSG_WELCOME_TO "Bienvenido a" #define MSG_MAX_USERS "%lu usuarios (el máximo) están el sistema, lo siento" #define MSG_NB_USERS "Eres el usuario número %u de %u permitidos" #define MSG_WELCOME_TIME "La hora local es ahora %02d:%02d. Puerto del servidor: %u." #define MSG_ANONYMOUS_FTP_ONLY "Sólo se permite FTP anónimo" #define MSG_RATIOS_EVERYONE "LAS PROPORCIONES ESTÁN ESTABLECIDAS PARA TODOS :" #define MSG_RATIOS_ANONYMOUS "USUARIOS ANÓNIMOS ESTÁN SUJETOS A UNA PROPORCIÓN UL/DL :" #define MSG_RATIOS_RULE "para descargar %u Mb, es obligatorio subir %u Mb de archivos." #define MSG_INFO_IDLE_M "Serás desconectado después de %lu minutos de inactividad." #define MSG_INFO_IDLE_S "Serás desconectado después de %lu segundos de inactividad." #define MSG_CANT_READ_FILE "Lo siento, somos incapaces de leer [%s]" #define MSG_LS_TRUNCATED "Salida truncada a %u ocurrencias" #define MSG_LS_SUCCESS "%u ocurrencias en total" #define MSG_LOGOUT "Fin de sesión." #define MSG_AUTH_FAILED_LOG "Autentificación fallida para el usuario [%s]" #define MSG_ILLEGAL_UMASK "Umask inválida" #define MSG_STANDALONE_FAILED "No se ha podido ejecutar un servidor independiente" #define MSG_NO_ANONYMOUS_LOGIN "Este es un sistema privado - No se permiten usuarios anónimos" #define MSG_ANONYMOUS_ANY_PASSWORD "Cualquier clave funcionará" #define MSG_MAX_USERS_IP "Demasiadas conexiones (%lu) desde esta IP" #define MSG_ACTIVE_DISABLED "Modo activo está desactivado" #define MSG_TRANSFER_SUCCESSFUL "Archivo transmitido con éxito" #define MSG_NO_DISK_SPACE "Disco lleno - por favor, sube archivos más tarde" #define MSG_OUT_OF_MEMORY "Sin memoria" #define MSG_ILLEGAL_TRUSTED_IP "Dirección IP en quien confiar no válida" #define MSG_SQL_WRONG_PARMS "Parámetros SQL incorrectos" #define MSG_NO_ASCII_RESUME "Reanudar en modo ASCII es inseguro. Por favor, borra antes el fichero" #define MSG_UNKNOWN_ALTLOG "Formato de registro desconocido" #define MSG_ACCOUNT_DISABLED "No se puede conectar como [%s] : cuenta deshabilitada" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Fichero de configuración SQL inválido" #define MSG_SQL_MISSING_SERVER "No se encuentra el servidor del archivo de configuración SQL" #define MSG_SQL_DOWN "El servidor SQL parece que no funciona" #define MSG_ILLEGAL_QUOTA "Cuota inválida" #define MSG_QUOTA_FILES "%llu archivos utilizados (%d%%) - autorizados: %llu archivos" #define MSG_QUOTA_SIZE "%llu Kbytes utilizados (%d%%) - autorizados: %llu Kb" #define MSG_QUOTA_EXCEEDED "Cuota excedida : [%s] no será guardado" #define MSG_AUTH_UNKNOWN "Método de autentificación desconocido" #define MSG_PDB_BROKEN "No se puede leer el fichero indexado puredb (o formato antiguo detectado) - Prueba a ejecutar pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s es un alias para %s." #define MSG_ALIASES_UNKNOWN "Alias desconocido %s." #define MSG_ALIASES_BROKEN_FILE "Fichero de alias dańado" #define MSG_ALIASES_LIST "Los siguientes alias están disponibles :" #define MSG_PERUSER_MAX "No puedo aceptar más de %lu conexiones del mismo usuario" #define MSG_IPV6_OK "Las conexiones IPv6 también son bienvenidas en este servidor" #define MSG_TLS_INFO "TLS: Activado %s con %s, %d bits de cifrado" #define MSG_TLS_WEAK "TLS: Cifrado demasiado débil" #define MSG_TLS_NEEDED "Lo siento. No se aceptan sesiones sin cifrar en este servidor.\n" \ "Por favor, vuelva a conectar utilizando mecanismos de seguridad TLS." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/alt_arc4random.c0000644000175000017500000001353413450665407017253 0ustar rackeracke#include #if !defined(__OpenBSD__) && !defined(__CloudABI__) && !defined(__wasi__) #include "crypto.h" #include "ftpd.h" #include "safe_rw.h" #include "alt_arc4random.h" #include "utils.h" #define RNG_RESERVE_LEN 512 #define CHACHA20_KEYBYTES 32 #define CHACHA20_BLOCKBYTES 64 #define ROTL32(x, b) (uint32_t)(((x) << (b)) | ((x) >> (32 - (b)))) #define CHACHA20_QUARTERROUND(A, B, C, D) \ A += B; \ D = ROTL32(D ^ A, 16); \ C += D; \ B = ROTL32(B ^ C, 12); \ A += B; \ D = ROTL32(D ^ A, 8); \ C += D; \ B = ROTL32(B ^ C, 7) static void CHACHA20_ROUNDS(uint32_t st[16]) { int i; for (i = 0; i < 20; i += 2) { CHACHA20_QUARTERROUND(st[0], st[4], st[8], st[12]); CHACHA20_QUARTERROUND(st[1], st[5], st[9], st[13]); CHACHA20_QUARTERROUND(st[2], st[6], st[10], st[14]); CHACHA20_QUARTERROUND(st[3], st[7], st[11], st[15]); CHACHA20_QUARTERROUND(st[0], st[5], st[10], st[15]); CHACHA20_QUARTERROUND(st[1], st[6], st[11], st[12]); CHACHA20_QUARTERROUND(st[2], st[7], st[8], st[13]); CHACHA20_QUARTERROUND(st[3], st[4], st[9], st[14]); } } static void chacha20_update(uint8_t out[CHACHA20_BLOCKBYTES], uint32_t st[16]) { uint32_t ks[16]; int i; memcpy(ks, st, 4 * 16); CHACHA20_ROUNDS(st); for (i = 0; i < 16; i++) { ks[i] += st[i]; } memcpy(out, ks, CHACHA20_BLOCKBYTES); st[12]++; } static void chacha20_init(uint32_t st[16], const uint8_t key[CHACHA20_KEYBYTES]) { static const uint32_t constants[4] = { 0x61707865, 0x3320646e, 0x79622d32, 0x6b206574 }; memcpy(&st[0], constants, 4 * 4); memcpy(&st[4], key, CHACHA20_KEYBYTES); memset(&st[12], 0, 4 * 4); } static int chacha20_rng(uint8_t* out, size_t len, uint8_t key[CHACHA20_KEYBYTES]) { uint32_t st[16]; size_t off; chacha20_init(st, key); chacha20_update(&out[0], st); memcpy(key, out, CHACHA20_KEYBYTES); off = 0; while (len >= CHACHA20_BLOCKBYTES) { chacha20_update(&out[off], st); len -= CHACHA20_BLOCKBYTES; off += CHACHA20_BLOCKBYTES; } if (len > 0) { uint8_t tmp[CHACHA20_BLOCKBYTES]; chacha20_update(tmp, st); memcpy(&out[off], tmp, len); } return 0; } struct rng_state { int initialized; int fd; size_t off; uint8_t key[CHACHA20_KEYBYTES]; uint8_t reserve[RNG_RESERVE_LEN]; }; static struct rng_state rng_state; static int random_dev_open(void) { struct stat st; static const char *devices[] = { "/dev/urandom", "/dev/random", NULL }; const char **device = devices; int fd; do { fd = open(*device, O_RDONLY); if (fd != -1) { if (fstat(fd, &st) == 0 && #ifdef __COMPCERT__ 1 #elif defined(S_ISNAM) (S_ISNAM(st.st_mode) || S_ISCHR(st.st_mode)) #else S_ISCHR(st.st_mode) #endif ) { #if defined(F_SETFD) && defined(FD_CLOEXEC) (void) fcntl(fd, F_SETFD, fcntl(fd, F_GETFD) | FD_CLOEXEC); #endif return fd; } (void) close(fd); } else if (errno == EINTR) { continue; } device++; } while (*device != NULL); errno = EIO; return -1; } void alt_arc4random_stir(void) { if (rng_state.initialized == 0) { rng_state.fd = -1; } if (rng_state.fd == -1 && (rng_state.fd = random_dev_open()) == -1) { abort(); } if (safe_read(rng_state.fd, rng_state.key, sizeof rng_state.key) <= (ssize_t) 0) { abort(); } rng_state.off = RNG_RESERVE_LEN; rng_state.initialized = 1; } void alt_arc4random_buf(void* buffer, size_t len) { unsigned char *buffer_ = (unsigned char*)buffer; size_t off; size_t remaining; size_t partial; int ret; if (!rng_state.initialized) { alt_arc4random_stir(); } off = 0; remaining = len; while (remaining > 0) { if (rng_state.off == RNG_RESERVE_LEN) { while (remaining >= RNG_RESERVE_LEN) { chacha20_rng(&buffer_[off], RNG_RESERVE_LEN, rng_state.key); off += RNG_RESERVE_LEN; remaining -= RNG_RESERVE_LEN; } if (remaining == 0) { break; } chacha20_rng(&rng_state.reserve[0], RNG_RESERVE_LEN, rng_state.key); rng_state.off = 0; } partial = RNG_RESERVE_LEN - rng_state.off; if (remaining < partial) { partial = remaining; } memcpy(&buffer_[off], &rng_state.reserve[rng_state.off], partial); memset(&rng_state.reserve[rng_state.off], 0, partial); rng_state.off += partial; remaining -= partial; off += partial; } } uint32_t alt_arc4random(void) { uint32_t v; alt_arc4random_buf(&v, sizeof v); return v; } uint32_t alt_arc4random_uniform(const uint32_t upper_bound) { uint32_t min; uint32_t r; if (upper_bound < 2U) { return 0; } min = (1U + ~upper_bound) % upper_bound; /* = 2**32 mod upper_bound */ do { r = alt_arc4random(); } while (r < min); /* r is now clamped to a set whose size mod upper_bound == 0 * the worst case (2**31+1) requires 2 attempts on average */ return r % upper_bound; } int alt_arc4random_close(void) { rng_state.initialized = 0; pure_memzero(rng_state.key, sizeof rng_state.key); if (rng_state.fd != -1) { return close(rng_state.fd); } return 0; } #else #include "alt_arc4random.h" int alt_arc4random_close(void) { return 0; } #endif pure-ftpd-1.0.49.orig/src/ftpwho-read.c0000644000175000017500000000451213450665410016567 0ustar rackeracke#include #ifdef PER_USER_LIMITS # include "ftpd.h" # include "ftpwho-update.h" # include "globals.h" # include "ftpwho-read.h" # ifdef WITH_DMALLOC # include # endif static int checkproc(const pid_t proc) { return kill(proc, 0) == 0 || errno == EPERM; } static int scoreboard_cleanup(const char * const file) { pid_t pid; if (strlen(file) <= sizeof SCOREBOARD_PREFIX) { return -1; } pid = (pid_t) strtoul(file + sizeof SCOREBOARD_PREFIX, NULL, 10); if (checkproc(pid) == 0) { (void) unlink(file); return -1; } return 0; } unsigned int ftpwho_read_count(const char * const user) { int fd; unsigned int count = 0; DIR *dir; struct dirent *entry; char foundaccount[MAX_USER_LENGTH + 1U]; if (chdir(SCOREBOARD_PATH) != 0 || (dir = opendir(".")) == NULL) { return 0; } while ((entry = readdir(dir)) != NULL) { if (strncmp(entry->d_name, SCOREBOARD_PREFIX, sizeof SCOREBOARD_PREFIX - 1U) != 0 || scoreboard_cleanup(entry->d_name) != 0 || (fd = open(entry->d_name, O_RDONLY | O_NOFOLLOW)) == -1) { continue; } /* * If the client wants to send signals in order to get [p]read() * interrupted, choose the secure option of counting extra * connections. lseek() can't be interrupted, though. */ # ifdef HAVE_PREAD if (pread(fd, foundaccount, sizeof foundaccount, offsetof(FTPWhoEntry, account)) != sizeof foundaccount) { count++; goto nextone_close; } # else if (lseek(fd, (off_t) offsetof(FTPWhoEntry, account), SEEK_SET) == (off_t) -1) { goto nextone_close; } if (read(fd, foundaccount, sizeof foundaccount) != sizeof foundaccount) { count++; goto nextone_close; } # endif foundaccount[(sizeof foundaccount) - 1] = 0; if (strcasecmp(foundaccount, user) == 0 && count < UINT_MAX) { count++; } nextone_close: (void) close(fd); } closedir(dir); # ifdef DEBUG addreply(0, "The [%s] account is already logged %u time%c", user, count, count > 0 ? 's' : 0); # endif return count; } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/ipstack.h0000644000175000017500000000630013446174132016010 0ustar rackeracke#ifndef __IPSTACK_H__ #define __IPSTACK_H__ 1 #ifdef OLD_IP_STACK # ifndef EAI_FAMILY # define EAI_FAMILY (-1) # define EAI_FAIL (-2) # define EAI_SYSTEM (-3) # define EAI_MEMORY (-4) # endif # ifndef NI_NUMERICHOST # define NI_NUMERICHOST (1 << 0) # define NI_MAXHOST 1025 # define NI_MAXSERV 32 # define NI_NUMERICSERV 2 # endif # ifndef AI_PASSIVE # define AI_PASSIVE (1 << 0) # endif # ifndef HAVE_STRUCT_ADDRINFO struct addrinfo { int ai_flags; int ai_family; int ai_socktype; int ai_protocol; int ai_addrlen; struct sockaddr *ai_addr; char *ai_canonname; struct addrinfo *ai_next; }; # endif # if !defined(HAVE_GETADDRINFO) && !defined(HAVE_GETNAMEINFO) # define sockaddr_storage sockaddr_in # define ss_family sin_family # ifdef HAVE_SIN_LEN # define ss_len sin_len # define HAVE_SS_LEN 1 # endif # define sockaddr_in6 sockaddr_in # define sin6_port sin_port # define sin6_addr sin_addr # define in6_addr in_addr # define s6_addr s_addr # endif # ifndef AF_INET6 # define AF_INET6 AF_UNSPEC # define PF_INET6 AF_INET6 # endif # ifndef IN6ADDR_ANY_INIT # define IN6ADDR_ANY_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 } } } # endif # ifndef IN6ADDR_LOOPBACK_INIT # define IN6ADDR_LOOPBACK_INIT { { { 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,1 } } } # endif # ifndef INET6_ADDRSTRLEN # define INET6_ADDRSTRLEN 46 # endif # ifndef IN6_IS_ADDR_UNSPECIFIED # define IN6_IS_ADDR_UNSPECIFIED(a) 0 # endif # ifndef IN6_IS_ADDR_LOOPBACK # define IN6_IS_ADDR_LOOPBACK(a) 0 # endif # ifndef IN6_IS_ADDR_MULTICAST # define IN6_IS_ADDR_MULTICAST(a) 0 # endif # ifndef IN6_IS_ADDR_LINKLOCAL # define IN6_IS_ADDR_LINKLOCAL(a) 0 # endif # ifndef IN6_IS_ADDR_SITELOCAL # define IN6_IS_ADDR_SITELOCAL(a) 0 # endif # ifndef IN6_IS_ADDR_V4MAPPED # define IN6_IS_ADDR_V4MAPPED(a) 0 # endif # ifndef IN6_IS_ADDR_V4COMPAT # define IN6_IS_ADDR_V4COMPAT(a) 0 # endif # ifndef IN6_ARE_ADDR_EQUAL # define IN6_ARE_ADDR_EQUAL(a,b) 0 # endif # if !defined(HAVE_INET_NTOP) && !defined(inet_ntop) # define inet_ntop(AF, SRC, DST) inet_aton(SRC, (struct in_addr *) (DST)) # endif # if !defined(HAVE_INET_PTON) && !defined(inet_pton) int inet_pton(int af, const char *src, void *dst); # endif # ifndef HAVE_GETNAMEINFO int getnameinfo(const struct sockaddr *sa_, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags); # endif # ifndef HAVE_GETADDRINFO int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res); void freeaddrinfo(struct addrinfo *res); # endif #endif in_port_t * storage_port(struct sockaddr_storage * const ss); const in_port_t * storage_port_const(const struct sockaddr_storage * const ss); in_port_t * storage_port6(struct sockaddr_storage * const ss); const in_port_t * storage_port6_const(const struct sockaddr_storage * const ss); struct in_addr * storage_sin_addr(struct sockaddr_storage * const ss); const struct in_addr * storage_sin_addr_const(const struct sockaddr_storage * const ss); struct in6_addr * storage_sin_addr6(struct sockaddr_storage * const ss); const struct in6_addr * storage_sin_addr6_const(const struct sockaddr_storage * const ss); #endif pure-ftpd-1.0.49.orig/src/messages_hu.h0000644000175000017500000003501713446174132016664 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Id?túllépés" #define MSG_CAPABILITIES "Képesség váltás sikertelen" #define MSG_CLIENT_CLOSED_CNX "A Kliens bontotta a kapcsolatot" #define MSG_CLIENT_READ_ERR "Kliens oldali olvasási hiba" #define MSG_CANT_OPEN_CNX "A kapcsolat nem jött létre" #define MSG_CANT_CREATE_DATA_SOCKET "Az adatcsatorna nem jött létre" #define MSG_DEBUG_CLIENT_IS "A Kliens címe" #define MSG_SYNTAX_ERROR_IP "Szintax hiba az IP címben" #define MSG_PORT_SUCCESSFUL "PORT parancs sikeres" #define MSG_ONLY_IPV4V6 "Csak IPv4 és IPv6 támogatott (1,2)" #define MSG_ONLY_IPV4 "Csak IPv4 támogatott (1)" #define MSG_TIMEOUT_PARSER "Id?túllépés - próbálj meg kicsit gyorsabban gépelni legközelebb" #define MSG_LINE_TOO_LONG "A sor túl hosszú" #define MSG_LOG_OVERFLOW "A Kliens megpróbálta túlcsordítani a parancsvonali buffert" #define MSG_GOODBYE "Viszlát. Te feltöltöttél %llu és letöltöttél %llu kbájtot." #define MSG_DEBUG_COMMAND "Parancs" #define MSG_IS_YOUR_CURRENT_LOCATION "a pillanatnyi helyzeted" #define MSG_NOT_LOGGED_IN "Nemvagy belépve" #define MSG_AUTH_UNIMPLEMENTED "Ez a biztonsági séma nincsen implementálva" #define MSG_NO_FILE_NAME "Nincs ilyen fájlnév" #define MSG_NO_DIRECTORY_NAME "Nincs ilyen könyvtárnév" #define MSG_NO_RESTART_POINT "Nincs újraindítási pont" #define MSG_ABOR_SUCCESS "Megszakítás (ABOR) sikeres volt" #define MSG_MISSING_ARG "Hiányzó meghatározás" #define MSG_GARBAGE_FOUND "Szemét található az érték után" #define MSG_VALUE_TOO_LARGE "Az érték túl nagy" #define MSG_IDLE_TIME "Üresjárati id? beállítva %lu másodpercre" #define MSG_SITE_HELP "A következ? SITE parancsok ismerhet?ek fel" #define MSG_BAD_CHMOD "Érvénytelen engedélyek" #define MSG_UNKNOWN_EXTENSION "egy érvénytelen kiterjesztés" #define MSG_XDBG_OK "XDBG parancs sikeres, debug szint %d" #define MSG_UNKNOWN_COMMAND "Ismeretlen parancs" #define MSG_TIMEOUT_NOOP "Id?túllépés (nincs m?velet %lu másodperce)" #define MSG_TIMEOUT_DATA "Id?túllépés (nincs új adat %lu másodperce)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "Már bejelentkeztél" #define MSG_ANY_PASSWORD "Akármilyen jelszó megfelel" #define MSG_ANONYMOUS_LOGGED "Anonymous felhasználó lépett be" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Anonymous felhasználó lépett be a virtuális FTP-n keresztül" #define MSG_USER_OK "Felhasználó %s rendben. Kérem a jelszót" #define MSG_CANT_DO_TWICE "Ez képtelenség a jelenlegi folyamatban" #define MSG_UNABLE_SECURE_ANON "A biztonságos anonymous FTP kapcsolat felépítése sikertelen volt" #define MSG_BANDWIDTH_RESTRICTED "A sávszélesség használatod korlátozva van" #define MSG_NO_PASSWORD_NEEDED "Akármilyen jelszó megfelel" #define MSG_NOTRUST "Sajnálom, de nemtudok megbízni benned" #define MSG_WHOAREYOU "Kérlek mondd meg ki vagy te" #define MSG_AUTH_FAILED "Azonosítás sikertelen, sajnálom" #define MSG_AUTH_TOOMANY "Túl sok sikertelen azonosítás" #define MSG_NO_HOMEDIR "A kezd?mappa nem elérhet?, megszakítás" #define MSG_NO_HOMEDIR2 "%s nem létezik vagy elérhetetlen" #define MSG_START_SLASH "Indítás itt /" #define MSG_USER_GROUP_ACCESS "A %s felhasználó csoportja" #define MSG_FXP_SUPPORT "Ez a szerver támogatja az FXP átvitelt" #define MSG_RATIO "Tisztelned kell az %u:%u (UL/DL) arányokat" #define MSG_CHROOT_FAILED "A biztonságos chroot() jail létrehozása sikertelen" #define MSG_CURRENT_DIR_IS "Rendben. %s a jelenlegi könyvtár" #define MSG_CURRENT_RESTRICTED_DIR_IS "Rendben. %s a jelenlegi korlátozott könyvtár" #define MSG_IS_NOW_LOGGED_IN "%s belépett" #define MSG_CANT_CHANGE_DIR "A %s könyvtárba váltás sikertelen" #define MSG_PATH_TOO_LONG "Az elérési út túl hosszú" #define MSG_CANT_PASV "Nem használhatsz PASV-ot IPv6 kapcsolatnál. Használj EPSV-t helyette." #define MSG_CANT_PASSIVE "A passiv módú kapcsolat nem jött létre" #define MSG_PORTS_BUSY "Az összes fenntartott TCP port foglalt" #define MSG_GETSOCKNAME_DATA "A helyi adatcsatorna azonosítása sikertelen" #define MSG_GETPEERNAME "A helyi csatorna azonosítása sikertelen" #define MSG_INVALID_IP "Elnzést, a megadott cím érvénytelen" #define MSG_NO_EPSV "Kérem használjon IPv6-szerkezetu klienst EPSV támogatással" #define MSG_BAD_PORT "Hiba, nemtudok az < 1024 portokhoz kapcsolódni" #define MSG_NO_FXP "Nemtudok kapcsolatot megnyitni megnyitni a %s -nak (csak %s -nak)" #define MSG_FXP "FXP transfer: forrás: %s cél: %s" #define MSG_NO_DATA_CONN "Nincs adatkapcsolat" #define MSG_ACCEPT_FAILED "A kapcsolat nem elfogadható" #define MSG_ACCEPT_SUCCESS "Adatkapcsolat elfogadva" #define MSG_CNX_PORT_FAILED "Az adatkapcsolat létrehozása a %d portra sikertelen" #define MSG_CNX_PORT "Kapcsolódás a %d porthoz" #define MSG_ANON_CANT_MKD "Hiba, anonymous felhasználók nem hozhatnak létre könyvtárakat" #define MSG_ANON_CANT_RMD "Hiba, anonymous felhasználók nem törölhetnek könyvtárakat" #define MSG_ANON_CANT_RENAME "Anonymous felhasználók nem mozgathatnak/nevezhetnek át könyvtárakat" #define MSG_ANON_CANT_CHANGE_PERMS "Anonymous felhasználók nem állíthatnak engedélyeket" #define MSG_GLOB_NO_MEMORY "Elfogyott a memória %s teljesítése közben" #define MSG_PROBABLY_DENIED "(Ez valószínuleg ezt jelenti \"Engedély megtagadva\") " #define MSG_GLOB_READ_ERROR "Olvasási hiba %s teljesítése közben" #define MSG_GLOB_NO_MATCH "Nincs hasonlóság %s ebben: %s " #define MSG_CHMOD_FAILED "Engedélyváltás sikertelen %s" #define MSG_CHMOD_SUCCESS "Engedélyváltás sikeres %s" #define MSG_CHMOD_TOTAL_FAILURE "Hiba, de nemtudok engedélyt váltani" #define MSG_ANON_CANT_DELETE "Anonymous felhasználók nem törölhetnek" #define MSG_ANON_CANT_OVERWRITE "Anonymous felhasználók talán nem írhatnak felül meglévo fájlokat" #define MSG_DELE_FAILED "Nem lehet törölni %s" #define MSG_DELE_SUCCESS "%s%s%s%s törölve" #define MSG_DELE_TOTAL_FAILURE "Egyetlen fájl sem lett törölve" #define MSG_LOAD_TOO_HIGH \ "A terhelés %3.2f mikor csatlakoztál. A letöltés le van tiltva\n" \ "az anonymous felhasználóknak, mikor a teherlés ilyen nagy. A feltöltések \n" \ "mindíg engedélyezve vannak." #define MSG_OPEN_FAILURE "Sikertelen megnyitás %s" #define MSG_OPEN_FAILURE2 "A fájl megnyitása sikertelen" #define MSG_STAT_FAILURE "A fájl mérete nem található" #define MSG_STAT_FAILURE2 "A fájl létezésének ellenorzése sikertelen" #define MSG_REST_TOO_LARGE_FOR_FILE "Az újraindítási érték %lld túl nagy a fájl méretéhez %lld." #define MSG_REST_RESET "Újraindítási érték 0 -ra változtatva" #define MSG_NOT_REGULAR_FILE "Csak hagyományos fájlt tud letölteni" #define MSG_NOT_MODERATED \ "A fájlt anonymus felhasználó töltötte fel. " \ "a fájl letöltését az adminisztrátorok még nem hagyták jóvá" #define MSG_RATIO_DENIAL \ "Hiba, a feltöltési/letöltési arány %u:%u .\n" \ "Feltöltöttél jelenleg %llu Kb és letöltöttél %llu Kb.\n" \ "Kérlek tölts fel valami hasznosat és utána leech-elj." #define MSG_NO_MORE_TO_DOWNLOAD "Semmi letöltenivaló nem maradt" #define MSG_WINNER "A számítógép a barátod. Bízz a számítógépben." #define MSG_KBYTES_LEFT "%.1f kbájt a hátralévo letöltendo mennyiség" #define MSG_ABORTED "Átvitel megszakítva" #define MSG_DATA_WRITE_FAILED "Íráshiba az adatkapcsolatból" #define MSG_DATA_READ_FAILED "Olvasási hiba az adatkapcsolatból" #define MSG_MMAP_FAILED "A fájl memóriába való bejegyzése sikertelen" #define MSG_WRITE_FAILED "Fájlba írás közben hiba történt" #define MSG_TRANSFER_RATE_M "%.3f másodperc (itt mérve), %.2f Mbájt per másodperc" #define MSG_TRANSFER_RATE_K "%.3f másodperc (itt mérve), %.2f Kbájt per másodperc" #define MSG_TRANSFER_RATE_B "%.3f másodperc (itt mérve), %.2f bájt per másodperc" #define MSG_SPACE_FREE_M "%.1f Mbájt a szabad lemezterület" #define MSG_SPACE_FREE_K "%f Kbájt a szabad lemezterület" #define MSG_DOWNLOADED "letöltve" #define MSG_REST_NOT_NUMERIC "REST numerikus paraméter szükséges" #define MSG_REST_ASCII_STRICT "Reply marker must be 0 in ASCII mode" #define MSG_REST_ASCII_WORKAROUND "Újraindítás ezen a ponton %lld. De ASCII módban vagyunk." #define MSG_REST_SUCCESS "Újraindítás ezen a pontom %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Prohibited directory name" #define MSG_SANITY_FILE_FAILURE "Tiltott fájl név: %s" #define MSG_MKD_FAILURE "Könyvtár létrehozás sikertelen" #define MSG_MKD_SUCCESS "A könyvtár sikeresen létrejött" #define MSG_RMD_FAILURE "Könyvtár törlése sikertelen" #define MSG_RMD_SUCCESS "A könyvtár sikeresen törölve" #define MSG_TIMESTAMP_FAILURE "Az ido bélyeg nem meghatározható" #define MSG_MODE_ERROR "Csak ASCII és bináris mód támogatott" #define MSG_CREATE_FAILURE "Fájl létrehozása sikertelen" #define MSG_ABRT_ONLY "ABRT az egyetlen jogos parancs feltöltés közben" #define MSG_UPLOAD_PARTIAL "részlegesen feltöltve" #define MSG_REMOVED "eltávolítva" #define MSG_UPLOADED "feltöltve" #define MSG_GMTIME_FAILURE "Helyi ido meghatározása sikertelen" #define MSG_TYPE_8BIT_FAILURE "Csak 8-bites bájtok támogatottak, nem 10 évvel ezelott vagyunk" #define MSG_TYPE_UNKNOWN "Ismeretlen típus (TYPE)" #define MSG_TYPE_SUCCESS "TYPE most" #define MSG_STRU_FAILURE "Csak F(ile) támogatott" #define MSG_MODE_FAILURE "Kérem használjon S(tream) módot" #define MSG_RENAME_ABORT "Elozo átnevezés megszakítva" #define MSG_RENAME_RNFR_SUCCESS "RNFR elfogadva - fájl létezik, kész az új névre" #define MSG_FILE_DOESNT_EXIST "Hiba, a megadott fájlnév nem létezik" #define MSG_RENAME_ALREADY_THERE "Átnevezés (RENAME) sikertelen - a célfájl már létezik" #define MSG_RENAME_NORNFR "RNFR szükséges RNTO elott" #define MSG_RENAME_FAILURE "Átnevezés/mozgatás hiba" #define MSG_RENAME_SUCCESS "A fájl sikeresen át lett nevezve vagy mozgatva" #define MSG_NO_SUPERSERVER "Kérem futtassa a pure-ftpd -t egy szuper szerveren belül (mint a tcpserver)" #define MSG_NO_FTP_ACCOUNT "Nem találom 'ftp' azonosítót" #define MSG_CONF_ERR "Konfigurációs hiba" #define MSG_NO_VIRTUAL_FILE "A virtuális felhasználó fájlnév hiányzik" #define MSG_ILLEGAL_THROTTLING "Érvénytelen sávszélesség fojtó érték" #define MSG_ILLEGAL_TRUSTED_GID "Érvénytelen megbízható gid chroot -nak" #define MSG_ILLEGAL_USER_LIMIT "Érvénytelen felhasználó korlát" #define MSG_ILLEGAL_FACILITY "Ismeretlen képesség név" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Érvénytelen LDAP konfigurációs fájl" #define MSG_ILLEGAL_LOAD_LIMIT "Érvénytelen terhelési korlát" #define MSG_ILLEGAL_PORTS_RANGE "Érvénytelen port tartomány" #define MSG_ILLEGAL_LS_LIMITS "Érvénytelen 'ls' korlátok" #define MSG_ILLEGAL_FORCE_PASSIVE "Érvénytelen eroltetett IP passzív módú kapcsolathoz" #define MSG_ILLEGAL_RATIO "Érvénytelen feltöltési/letöltési ráta" #define MSG_ILLEGAL_UID_LIMIT "Érvénytelen UID korlát" #define MSG_ILLEGAL_OPTION "Ismeretlen futási opció" #define MSG_LDAP_MISSING_BASE "Az LDAPBaseDN hiányzik az LDAP konfigurációs fájlból" #define MSG_LDAP_WRONG_PARMS "Rossz LDAP paraméterek" #define MSG_NEW_CONNECTION "Új kapcsolat a következo címrol: %s" #define MSG_WELCOME_TO "Üdvözlöm" #define MSG_MAX_USERS "%lu felhasználó (a maximum) már be van lépve, sajnálom" #define MSG_NB_USERS "Te vagy a %u a %u felhasználó közül, aki beléphet." #define MSG_WELCOME_TIME "A Helyi Ido %02d:%02d. szerver port: %u." #define MSG_ANONYMOUS_FTP_ONLY "Csak anonymous FTP megengedett" #define MSG_RATIOS_EVERYONE "A RÁTÁK MINDENKIRE ÉRVÉNYESEK:" #define MSG_RATIOS_ANONYMOUS "ANONYMOUS FELHASZÁLÓK AZ UL/DL A KÖVETKEZO RÁTÁNAK VANNAK ALÁRENDELVE:" #define MSG_RATIOS_RULE "ahhoz, hogy letölts %u Mb-ot, %u Mb nyalánkság feltöltése kötelezo." #define MSG_INFO_IDLE_M "%lu perc inaktivitás után a kapcsolat megszakad." #define MSG_INFO_IDLE_S "%lu másodperc inaktivitás után a kapcsolat megszakad." #define MSG_CANT_READ_FILE "Hiba, az olvasás lehetetlen [%s]" #define MSG_LS_TRUNCATED "Kimenet %u részre csonkítva" #define MSG_LS_SUCCESS "%u az összes megfelelo" #define MSG_LOGOUT "Kijelentkezés." #define MSG_AUTH_FAILED_LOG "Azonosítás sikertelen [%s] felhasználónak" #define MSG_ILLEGAL_UMASK "Érvénytelen umask" #define MSG_STANDALONE_FAILED "Egyedülálló szerver elindítása sikertelen" #define MSG_NO_ANONYMOUS_LOGIN "Ez egy privát rendszer - nincs anonymous bejelentkezés" #define MSG_ANONYMOUS_ANY_PASSWORD "Bármilyen jelszó megfelel" #define MSG_MAX_USERS_IP "Túl sok kapcsolat errol az IP-rol: (%lu) " #define MSG_ACTIVE_DISABLED "Aktív mód letiltva" #define MSG_TRANSFER_SUCCESSFUL "A fájl sikeresen át lett töltve" #define MSG_NO_DISK_SPACE "A Diszk tele van - kérem késobb töltsön fel" #define MSG_OUT_OF_MEMORY "Elfogyott a memória" #define MSG_ILLEGAL_TRUSTED_IP "Érvénytelen megbízható IP cím" #define MSG_NO_ASCII_RESUME "ASCII folytatás nem biztonságos, kérem eloször törölje a fájlt" #define MSG_UNKNOWN_ALTLOG "Ismeretlen naplózási formátum" #define MSG_ACCOUNT_DISABLED " Nemtud belépni ezzel a felhasználónévvel: [%s]: belépési név letiltva" #define MSG_SQL_WRONG_PARMS "Rossz SQL paraméterek" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Érvénytelen SQL konfigurációs fájl" #define MSG_SQL_MISSING_SERVER "Hiányzik a szerver az SQL konfigurációs fájlból" #define MSG_SQL_DOWN "Az SQL szerver úgylátszik nem muködik" #define MSG_ILLEGAL_QUOTA "Érvénytelen kvóta" #define MSG_QUOTA_FILES "%llu fájl használt (%d%%) - engedélyezve: %llu fájl" #define MSG_QUOTA_SIZE "%llu Kbájt használt (%d%%) - engedélyezve: %llu Kb" #define MSG_QUOTA_EXCEEDED "Kvóta elérve: [%s] mentés sikertelen" #define MSG_AUTH_UNKNOWN "Ismeretlen hitelesítési módszer" #define MSG_PDB_BROKEN "Az indexelt puredb fájl olvasása sikertelen (vagy régi formátum) - próbálja: pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s egy alias %s -nak." #define MSG_ALIASES_UNKNOWN "Ismeterlen alias %s." #define MSG_ALIASES_BROKEN_FILE "Sérült alias fájlok" #define MSG_ALIASES_LIST "A következo aliasok elérhetoek :" #define MSG_PERUSER_MAX "Nem fogadhatok el több kapcsolatot, mint %lu ugyanattól a felhasználótól" #define MSG_IPV6_OK "IPv6 kapcsolatok szintén használhatóak a szerveren." #define MSG_TLS_INFO "TLS: Engedélyezve %s, %s, %d titkos bittel titkosítva" #define MSG_TLS_WEAK "TLS: Titkosítás túl gyenge" #define MSG_TLS_NEEDED "Hiba, cleartext belépési forma nem engedélyezett.\n" \ "Kérem kapcsolódjon újra TLS biztonsági módot használva." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/log_ldap.h0000644000175000017500000000326613350542502016135 0ustar rackeracke#ifndef __LOG_LDAP_H__ #define __LOG_LDAP_H__ 1 #define LDAP_POSIXACCOUNT "posixAccount" #define LDAP_UID "uid" #define LDAP_UIDNUMBER "uidNumber" #define LDAP_GIDNUMBER "gidNumber" #define LDAP_HOMEDIRECTORY "homeDirectory" #define LDAP_USERPASSWORD "userPassword" #define LDAP_LOGINSHELL "loginShell" #define LDAP_FTPUID "FTPuid" #define LDAP_FTPGID "FTPgid" #define LDAP_FTPSTATUS "FTPStatus" #ifdef QUOTAS # define LDAP_QUOTAFILES "FTPQuotaFiles" # define LDAP_QUOTAMBYTES "FTPQuotaMBytes" #endif #ifdef RATIOS # define LDAP_DOWNLOADRATIO "FTPDownloadRatio" # define LDAP_UPLOADRATIO "FTPUploadRatio" #endif #ifdef THROTTLING # define LDAP_DOWNLOADBANDWIDTH "FTPDownloadBandwidth" # define LDAP_UPLOADBANDWIDTH "FTPUploadBandwidth" #endif #define MAX_LDAP_UID_LENGTH 256U #define DEFAULT_SHELL "ftp" #define PASSWD_LDAP_CRYPT_PREFIX "{crypt}" #define PASSWD_LDAP_MD5_PREFIX "{md5}" #define PASSWD_LDAP_SMD5_PREFIX "{smd5}" #define PASSWD_LDAP_SHA_PREFIX "{sha}" #define PASSWD_LDAP_SSHA_PREFIX "{ssha}" #define PASSWD_LDAP_SCRYPT_PREFIX "{scrypt}" #define PASSWD_LDAP_ARGON2_PREFIX "{argon2}" #define LDAP_DEFAULT_SCHEME "ldap" #define LDAP_DEFAULT_SERVER "localhost" #define LDAP_DEFAULT_PORT 389 #define LDAP_DEFAULT_FILTER "(&(objectClass=posixAccount)(uid=\\L))" #define LDAP_DEFAULT_VERSION 3 #define URI_SCHEME_SEPARATOR ":" #define URI_AUTHORITY_LEADER "//" #define URI_PORT_LEADER ":" void pw_ldap_parse(const char * const file); void pw_ldap_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer); void pw_ldap_exit(void); #endif pure-ftpd-1.0.49.orig/src/log_extauth_p.h0000644000175000017500000000504613350542502017214 0ustar rackeracke#ifndef __LOG_EXTAUTH_P_H__ #define __LOG_EXTAUTH_P_H__ 1 #ifdef WITH_EXTAUTH #include #ifndef SUN_LEN # define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) NULL)->sun_path) \ + strlen((ptr)->sun_path)) #endif #ifndef EXTAUTH_MAX_CONNECT_TRIES # define EXTAUTH_MAX_CONNECT_TRIES 10 #endif #ifndef EXTAUTH_MAX_CONNECT_DELAY # define EXTAUTH_MAX_CONNECT_DELAY 1 #endif typedef struct ExtauthCallBack_ { const char *keyword; void (*func)(const char *str, AuthResult * const result); } ExtauthCallBack; static void callback_reply_auth_ok(const char *str, AuthResult * const result); static void callback_reply_uid(const char *str, AuthResult * const result); static void callback_reply_gid(const char *str, AuthResult * const result); static void callback_reply_dir(const char *str, AuthResult * const result); static void callback_reply_slow_tilde_expansion(const char *str, AuthResult * const result); static void callback_reply_throttling_bandwidth_ul(const char *str, AuthResult * const result); static void callback_reply_throttling_bandwidth_dl(const char *str, AuthResult * const result); static void callback_reply_user_quota_size(const char *str, AuthResult * const result); static void callback_reply_user_quota_files(const char *str, AuthResult * const result); static void callback_reply_ratio_upload(const char *str, AuthResult * const result); static void callback_reply_ratio_download(const char *str, AuthResult * const result); static void callback_reply_per_user_max(const char *str, AuthResult * const result); static void callback_reply_end(const char *str, AuthResult * const result); static ExtauthCallBack extauth_callbacks[] = { { EXTAUTH_REPLY_AUTH_OK, callback_reply_auth_ok }, { EXTAUTH_REPLY_UID, callback_reply_uid }, { EXTAUTH_REPLY_GID, callback_reply_gid }, { EXTAUTH_REPLY_DIR, callback_reply_dir }, { EXTAUTH_REPLY_SLOW_TILDE_EXPANSION, callback_reply_slow_tilde_expansion }, { EXTAUTH_REPLY_THROTTLING_BANDWIDTH_UL, callback_reply_throttling_bandwidth_ul }, { EXTAUTH_REPLY_THROTTLING_BANDWIDTH_DL, callback_reply_throttling_bandwidth_dl }, { EXTAUTH_REPLY_USER_QUOTA_SIZE, callback_reply_user_quota_size }, { EXTAUTH_REPLY_USER_QUOTA_FILES, callback_reply_user_quota_files }, { EXTAUTH_REPLY_RATIO_UPLOAD, callback_reply_ratio_upload }, { EXTAUTH_REPLY_RATIO_DOWNLOAD, callback_reply_ratio_download }, { EXTAUTH_REPLY_PER_USER_MAX, callback_reply_per_user_max }, { EXTAUTH_REPLY_END, callback_reply_end }, { NULL, callback_reply_end } }; #endif #endif pure-ftpd-1.0.49.orig/src/pure-certd_p.h0000644000175000017500000000322213446174132016743 0ustar rackeracke#ifndef __PURE_CERTD_P_H__ #define __PURE_CERTD_P_H__ 1 #ifdef WITH_TLS #ifndef HAVE_GETOPT_LONG # include "bsd-getopt_long.h" #else # include #endif #ifdef HAVE_SYS_WAIT_H # include #endif #include #ifndef SUN_LEN # define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) NULL)->sun_path) \ + strlen((ptr)->sun_path)) #endif #ifndef CERTD_BACKLOG # define CERTD_BACKLOG 42 #endif static const char *GETOPT_OPTIONS = "Bg:" #ifndef NO_GETOPT_LONG "h" #endif "p:r:s:u:"; #ifndef NO_GETOPT_LONG static struct option long_options[] = { { "daemonize", 0, NULL, 'B' }, { "gid", 1, NULL, 'g' }, # ifndef NO_GETOPT_LONG { "help", 0, NULL, 'h' }, # endif { "pidfile", 1, NULL, 'p' }, { "run", 1, NULL, 'r' }, { "socket", 1, NULL, 's' }, { "uid", 1, NULL, 'u' }, { NULL, 0, NULL, 0 } }; #endif static signed char daemonize; static uid_t uid; static gid_t gid; static const char *socketpath; static const char *certd_pid_file = CERTD_PID_FILE; static const char *script; static volatile signed char exit_certd; static volatile int kindy = -1; static volatile signed char ended; static void callback_client_sni_name(const char *str); static void callback_client_end(const char *str); typedef struct CertdCallBack_ { const char *keyword; void (*func)(const char *str); } CertdCallBack; static CertdCallBack certd_callbacks[] = { { EXTCERT_CLIENT_SNI_NAME, callback_client_sni_name } , { EXTCERT_CLIENT_END, callback_client_end }, { NULL, callback_client_end } }; #define ENV_CERTD_SNI_NAME "CERTD_SNI_NAME" #define CERTD_SCRIPT_TIMEOUT 60U #endif #endif pure-ftpd-1.0.49.orig/src/pure-uploadscript.c0000644000175000017500000002623213450665410020034 0ustar rackeracke#include #ifndef WITH_UPLOAD_SCRIPT #include int main(void) { puts("Please compile the server with --with-uploadscript\n" "to use this feature. Thank you."); return 0; } #else # include "ftpd.h" # include "upload-pipe.h" # include "safe_rw.h" # include "pure-uploadscript_p.h" #ifdef WITH_DMALLOC # include #endif static void setcloexec(const int fd) { fcntl(fd, F_SETFD, FD_CLOEXEC); } static int upload_pipe_ropen(void) { struct stat st; int upload_pipe_fd; unsigned int tries = OPEN_TRIES; again: if ((upload_pipe_fd = open(UPLOAD_PIPE_FILE, O_RDONLY | O_NOFOLLOW)) == -1) { if (tries > 0) { tries--; (void) sleep(OPEN_DELAY); goto again; } perror("Unable to open " UPLOAD_PIPE_FILE); return -1; } setcloexec(upload_pipe_fd); if (fstat(upload_pipe_fd, &st) < 0 || (st.st_mode & 0777) != 0600 || !S_ISFIFO(st.st_mode) || #ifdef NON_ROOT_FTP st.st_uid != geteuid() #else st.st_uid != (uid_t) 0 #endif ) { fprintf(stderr, "Insecure permissions on " UPLOAD_PIPE_FILE "\n"); (void) close(upload_pipe_fd); return -1; } return upload_pipe_fd; } static int readchar(const int upload_file_fd) { ssize_t ret; unsigned char c; while ((ret = read(upload_file_fd, &c, (size_t) 1U)) < (ssize_t) 0 && errno == EINTR); if (ret <= (ssize_t) 0) { return EOF; } return (int) c; } static int readpipe(const int upload_file_fd, char ** const r_who, char ** const r_file) { static char who[MAX_USER_LENGTH + 1U]; static char file[PATH_MAX + VHOST_PREFIX_MAX_LEN]; const char * const whoend = &who[sizeof who]; const char * const fileend = &file[sizeof file]; char *whopnt = who; char *filepnt = file; int c; *r_who = NULL; *r_file = NULL; do { c = readchar(upload_file_fd); if (c == EOF) { return -1; } } while (c != 2); while (whopnt != whoend) { c = readchar(upload_file_fd); if (c == EOF || (c != 1 && ISCTRLCODE(c))) { return -1; } if (c == 1) { *whopnt = 0; break; } *whopnt = (char) c; whopnt++; } while (filepnt != fileend) { c = readchar(upload_file_fd); if (c == EOF || (c != 0 && ISCTRLCODE(c))) { return -1; } *filepnt = (char) c; if (c == 0) { break; } filepnt++; } *r_who = who; *r_file = file; return 0; } /* * When we are using virtual hosts, the file looks like : * : */ static char *checkvirtual(char *path) { static char buf[PATH_MAX + 1]; char *path_pnt; if (path == NULL || *path == '/' || (path_pnt = strstr(path, ":/")) == NULL) { return path; } *path_pnt = 0; if (SNCHECK(snprintf(buf, sizeof buf, VHOST_PATH "/%s%s", path, path_pnt + 1), sizeof buf)) { /* Better avoid processing than risking a security flaw */ return NULL; } return buf; } static int closedesc_all(const int closestdin) { int fodder; if (closestdin != 0) { (void) close(0); if ((fodder = open("/dev/null", O_RDONLY)) == -1) { return -1; } (void) dup2(fodder, 0); if (fodder > 0) { (void) close(fodder); } } if ((fodder = open("/dev/null", O_WRONLY)) == -1) { return -1; } (void) dup2(fodder, 1); (void) dup2(1, 2); if (fodder > 2) { (void) close(fodder); } return 0; } static void dodaemonize(void) { pid_t child; if (daemonize != 0) { if ((child = fork()) == (pid_t) -1) { perror("Daemonization failed - fork"); return; } else if (child != (pid_t) 0) { _exit(EXIT_SUCCESS); } else if (setsid() == (pid_t) -1) { perror("Daemonization failed : setsid"); } (void) chdir("/"); #ifdef HAVE_CLOSEFROM (void) closefrom(3); #endif (void) closedesc_all(0); } } static int init(void) { (void) close(0); #ifndef NON_ROOT_FTP if (geteuid() != (uid_t) 0) { fprintf(stderr, "Sorry, but you have to be root to run this program\n"); return -1; } #endif return 0; } static void usage(void) { #ifndef NO_GETOPT_LONG const struct option *options = long_options; do { printf("-%c\t--%s\t%s\n", options->val, options->name, options->has_arg ? "" : ""); options++; } while (options->name != NULL); #endif exit(EXIT_SUCCESS); } static int parseoptions(int argc, char *argv[]) { #ifndef NO_GETOPT_LONG int option_index = 0; #endif int fodder; while ((fodder = #ifndef NO_GETOPT_LONG getopt_long(argc, argv, GETOPT_OPTIONS, long_options, &option_index) #else getopt(argc, argv, GETOPT_OPTIONS) #endif ) != -1) { switch (fodder) { case 'B': { daemonize = 1; break; } case 'p': { if ((uploadscript_pid_file = strdup(optarg)) == NULL) { perror("Oh no ! More memory !"); } break; } case 'g': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; gid = (gid_t) strtoul(nptr, &endptr, 10); if (!nptr || !*nptr || !endptr || *endptr) { perror("Illegal GID - Must be a number\n"); } break; } #ifndef NO_GETOPT_LONG case 'h': { usage(); } #endif case 'r': { if (script == NULL && (script = strdup(optarg)) == NULL) { perror("Oh no ! More memory !"); } break; } case 'u': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; uid = (uid_t) strtoul(nptr, &endptr, 10); if (!*nptr || !endptr || *endptr) { perror("Illegal UID - Must be a number\n"); } break; } default: usage(); } } return 0; } static int changeuidgid(void) { #ifndef NON_ROOT_FTP if ( #ifdef HAVE_SETGROUPS setgroups(1U, &gid) || #endif setgid(gid) || setegid(gid) || setuid(uid) || seteuid(uid) || chdir("/")) { return -1; } #endif return 0; } #ifdef HAVE_PUTENV static void newenv_ull(const char * const var, const unsigned long long val) { size_t s; char *v; s = strlen(var) + (size_t) 42U; if ((v = malloc(s)) == NULL) { return; } if (SNCHECK(snprintf(v, s, "%s=%llu", var, val), s)) { free(v); return; } putenv(v); } static void newenv_uo(const char * const var, const unsigned int val) { size_t s; char *v; s = strlen(var) + (size_t) 8U; if ((v = malloc(s)) == NULL) { return; } if (SNCHECK(snprintf(v, s, "%s=%o", var, val), s)) { free(v); return; } putenv(v); } static void newenv_str(const char * const var, const char * const str) { size_t s; char *v; if (str == NULL || *str == 0) { return; } s = strlen(var) + strlen(str) + (size_t) 2U; if ((v = malloc(s)) == NULL) { return; } if (SNCHECK(snprintf(v, s, "%s=%s", var, str), s)) { free(v); return; } putenv(v); } #endif static void fillenv(const char * const who, const struct stat * const st) { #ifdef HAVE_PUTENV struct passwd *pwd; struct group *grp; pwd = getpwuid(st->st_uid); grp = getgrgid(st->st_gid); newenv_ull("UPLOAD_SIZE", (unsigned long long) st->st_size); newenv_uo("UPLOAD_PERMS", (unsigned int) (st->st_mode & 07777)); newenv_ull("UPLOAD_UID", (unsigned long long) st->st_uid); newenv_ull("UPLOAD_GID", (unsigned long long) st->st_gid); if (pwd != NULL) { newenv_str("UPLOAD_USER", pwd->pw_name); } if (grp != NULL) { newenv_str("UPLOAD_GROUP", grp->gr_name); } if (who != NULL) { newenv_str("UPLOAD_VUSER", who); } #else (void) st; #endif } static int run(const char * const who, const char * const file, const int upload_pipe_fd) { struct stat st; pid_t pid; if (script == NULL || *script == 0 || file == NULL || *file == 0 || lstat(file, &st) < 0 || !S_ISREG(st.st_mode)) { return -1; } pid = fork(); if (pid == (pid_t) 0) { /* Yes, there's already the cloexec flag on this fd, * but it's really important to close it. Be paranoid. */ if (close(upload_pipe_fd) < 0 || closedesc_all(1) < 0) { _exit(EXIT_FAILURE); } fillenv(who, &st); execl(script, script, file, (char *) NULL); _exit(EXIT_FAILURE); } else if (pid != (pid_t) -1) { #ifdef HAVE_WAITPID (void) waitpid(pid, NULL, 0); #else { pid_t foundpid; while ((foundpid = wait3(NULL, 0, NULL)) != (pid_t) -1 && foundpid != pid); } #endif } return 0; } static void updatepidfile(void) { char buf[42]; size_t buf_len; int fd; if (SNCHECK(snprintf(buf, sizeof buf, "%lu\n", (unsigned long) getpid()), sizeof buf)) { return; } if (unlink(uploadscript_pid_file) != 0 && errno != ENOENT) { return; } if ((fd = open(uploadscript_pid_file, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW, (mode_t) 0644)) == -1) { return; } buf_len = strlen(buf); if (safe_write(fd, buf, buf_len, -1) != (ssize_t) buf_len) { (void) ftruncate(fd, (off_t) 0); } close(fd); } int main(int argc, char *argv[]) { int upload_pipe_fd; char *who; char *file; #ifdef HAVE_SETLOCALE # ifdef LC_MESSAGES (void) setlocale(LC_MESSAGES, ""); # endif # ifdef LC_CTYPE (void) setlocale(LC_CTYPE, ""); # endif # ifdef LC_COLLATE (void) setlocale(LC_COLLATE, ""); # endif #endif if (init() < 0) { return -1; } if (parseoptions(argc, argv) < 0) { return -1; } if (script == NULL) { fprintf(stderr, "Sorry, but I need -r \n\n"); usage(); } if (daemonize != 0) { dodaemonize(); } if ((upload_pipe_fd = upload_pipe_ropen()) == -1) { return -1; } updatepidfile(); if (changeuidgid() < 0) { perror("Identity change"); (void) unlink(uploadscript_pid_file); return -1; } #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); #endif #ifdef SIGCHLD signal(SIGCHLD, SIG_DFL); #endif for (;;) { if (readpipe(upload_pipe_fd, &who, &file) != 0) { (void) sleep(1); continue; } file = checkvirtual(file); if (file != NULL && who != NULL) { run(who, file, upload_pipe_fd); } } /* NOTREACHED */ #if 0 close(upload_pipe_fd); (void) unlink(uploadscript_pid_file); #endif return 0; } #endif pure-ftpd-1.0.49.orig/src/fakesnprintf.c0000644000175000017500000002452113450665410017043 0ustar rackeracke/* * snprintf() / vsnprintf() re-implementation by Frank Denis * * These functions understand : * - characters ("%c") . * - space padding ("%3d", "%-3s") . * - zero padding ("%04d") . * - explicit '+' ("%+d", "%+3.2f") . * - length restrictions ("%.30s", "%-42.30s", "%.4d") . * - int, long, long long types ("%lld", "%-3ld", "%i") . * - unsigned int, long, long long types ("%llu", "%-3lu", "%u") . * - hex and octal unsigned types ("%llX", "%04x", "%-3o") . * - double and long double types ("%f", "%Lf") . * - floating point frac restrictions ("%.2f") . * - combinations of everything ("%-8.5llo") . * * Nothing more. Return value is if an overflow occurred, or the * copied size if no overflow occurred (mostly compatible with C99 * snprintf() behavior, except that it doesn't return any value larger * than ). * * These functions are portable, they are twice faster than their BSD and GNU * implementations, and they don't tamper with errno. But they only know * a limited subset of what a full-implementation is supposed to do. * * It's enough for Pure-FTPd, though. */ #include #include "ftpd.h" #ifdef WITH_DMALLOC # include #endif #if !defined(HAVE_SNPRINTF) || !defined(HAVE_VSNPRINTF) /* * add a string to the buffer * \param zero if this is non-zero, we pad with zeroes, else we pad * with a blank. * \param maxlen sets the maximum size of the string to be added */ static void fakesnprintf_addstr(char **str, size_t *size, const char *pnt, size_t maxlen, size_t padlen, unsigned char zero, unsigned char minuspad) { size_t maxlenc; /* prepare to cut off string if longer than maxlen */ maxlenc = strlen(pnt); if (maxlen > 0U && maxlen < maxlenc) { maxlenc = maxlen; } if (padlen > 0U && minuspad == 0U && padlen > maxlenc) { size_t maxlenp = padlen - maxlenc; if (maxlenp > *size) { maxlenp = *size; } if (maxlenp > 0U) { memset(*str, zero != 0 ? '0' : ' ', maxlenp); (*size) -= maxlenp; (*str) += maxlenp; } } if (maxlenc > *size) { maxlenc = *size; } if (maxlenc > 0U) { memcpy(*str, pnt, maxlenc); (*size) -= maxlenc; (*str) += maxlenc; } if (padlen > 0U && minuspad > 0U && padlen > maxlenc) { size_t maxlenp = padlen - maxlenc; if (maxlenp > *size) { maxlenp = *size; } if (maxlenp > 0U) { memset(*str, ' ', maxlenp); (*size) -= maxlenp; (*str) += maxlenp; } } } int fakesnprintf_vsnprintf(char * const str_, const size_t size_, const char *format, va_list va) { char *str; size_t size; size_t maxlen; size_t padlen; unsigned char longs; unsigned char zero; unsigned char minuspad; unsigned char hasmaxlen; unsigned char plussign; str = str_; size = size_; str_[size_ - 1U] = 1; while (size > 0U && *format != 0) { if (*format != '%') { *str++ = *format++; size--; continue; } longs = 0U; zero = 0U; minuspad = 0U; maxlen = 0U; padlen = 0U; hasmaxlen = 0U; plussign = 0U; for (;;) { breakpoint_nextspecial_inc: format++; breakpoint_nextspecial_noinc: switch (*format) { case 0: goto breakpoint_end; case '%': *str++ = '%'; size--; goto breakpoint_next; case 'c': { int val; val = va_arg(va, int); *str++ = (char) val; size--; goto breakpoint_next; } case 'l': case 'L': longs++; goto breakpoint_nextspecial_inc; case '0': zero++; goto breakpoint_nextspecial_inc; case '.': format++; hasmaxlen = 1U; while ((unsigned char) *format >= '0' && (unsigned char) *format <= '9') { maxlen *= 10U; maxlen += (*format - '0'); format++; } goto breakpoint_nextspecial_noinc; case '1': case '2': case '3': case '4': case '5': case '6': case '7': case '8': case '9': do { padlen *= 10U; padlen += *format - '0'; format++; } while ((unsigned char) *format >= '0' && (unsigned char) *format <= '9'); goto breakpoint_nextspecial_noinc; case '-': minuspad++; format++; goto breakpoint_nextspecial_noinc; case '+': plussign++; format++; goto breakpoint_nextspecial_noinc; case 's': { const char *pnt; pnt = va_arg(va, const char *); if (pnt == NULL) { pnt = ""; } fakesnprintf_addstr(&str, &size, pnt, maxlen, padlen, zero, minuspad); goto breakpoint_next; } case 'u': case 'o': case 'x': case 'X': { unsigned long long val; char vals[256]; char *valspnt = vals + sizeof vals; const char *basics; unsigned int base; switch (longs) { case 2: val = va_arg(va, unsigned long long); break; case 1: val = (unsigned long long) va_arg(va, unsigned long); break; default: val = (unsigned long long) va_arg(va, unsigned int); } basics = "0123456789abcdef"; switch (*format) { case 'o': base = 8U; break; case 'X': basics = "0123456789ABCDEF"; case 'x': base = 16U; break; default: base = 10U; } *--valspnt = 0; do { *--valspnt = basics[val % base]; val /= base; } while (valspnt != &vals[0] && val > 0ULL); fakesnprintf_addstr(&str, &size, valspnt, maxlen, padlen, zero, minuspad); goto breakpoint_next; } case 'd': case 'i': { long long val; unsigned char minussign = 0U; char vals[256]; char *valspnt = vals + sizeof vals; switch (longs) { case 2: val = va_arg(va, long long); break; case 1: val = (long long) va_arg(va, long); break; default: val = (long long) va_arg(va, int); } if (val < 0LL) { minussign++; val = -val; } *--valspnt = 0; do { *--valspnt = "0123456789"[val % 10LL]; val /= 10LL; } while (valspnt != &vals[1] && val > 0LL); if (minussign != 0) { *--valspnt = '-'; } else if (plussign != 0) { *--valspnt = '+'; } fakesnprintf_addstr(&str, &size, valspnt, maxlen, padlen, zero, minuspad); goto breakpoint_next; } case 'e': case 'E': case 'f': case 'F': case 'g': case 'G': { unsigned int nfrac = 6U; long double val; unsigned long long vali; unsigned char minussign = 0U; char vals[512]; char *valspnt = vals + sizeof vals / 2U; char *valsleft; if (longs != 0) { val = va_arg(va, long double); } else { val = va_arg(va, double); } if (val < 0.0L) { minussign++; val = -val; } vali = (unsigned long long) val; do { *--valspnt = '0' + vali % 10ULL; vali /= 10ULL; } while (valspnt != &vals[1] && vali > 0ULL); if (minussign != 0) { *--valspnt = '-'; } else if (plussign != 0) { *--valspnt = '+'; } valsleft = valspnt; valspnt = vals + sizeof vals / 2U; if (maxlen > (sizeof vals / 2U) - 3U) { nfrac = (sizeof vals / 2U) - 3U; } else if (hasmaxlen != 0U) { nfrac = maxlen; } if (nfrac > 0U) { *valspnt++ = '.'; } while (nfrac > 0U) { nfrac--; val *= 10.0L; *valspnt++ = '0' + (((unsigned long long) val) % 10U); } *valspnt = 0; fakesnprintf_addstr(&str, &size, valsleft, sizeof vals, padlen, zero, minuspad); goto breakpoint_next; } } } breakpoint_next: format++; } breakpoint_end: if (str_[size_ - 1U] != 1) { str_[size_ - 1U] = 0; return (int) size_; } *str = 0; return (int) (size_ - size); } int fakesnprintf_snprintf(char * const str, const size_t size, const char * const format, ...) { int ret; va_list va; va_start(va, format); ret = fakesnprintf_vsnprintf(str, size, format, va); va_end(va); return ret; } #endif /* !HAVE_SNPRINTF */ pure-ftpd-1.0.49.orig/src/messages_nl.h0000644000175000017500000003576513446174132016673 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Onderbreking" #define MSG_CAPABILITIES "Onmogelijk om de instelling te wisselen" #define MSG_CLIENT_CLOSED_CNX "Client sloot de verbinding" #define MSG_CLIENT_READ_ERR "Leesfout van de client" #define MSG_CANT_OPEN_CNX "Kan geen verbinding openen" #define MSG_CANT_CREATE_DATA_SOCKET "Kan geen data socket aanmaken" #define MSG_DEBUG_CLIENT_IS "Het client adres is: " #define MSG_SYNTAX_ERROR_IP "Syntax fout in IP adres" #define MSG_PORT_SUCCESSFUL "PORT commando geslaagd" #define MSG_ONLY_IPV4V6 "Alleen IPv4 en IPv6 worden ondersteund (1,2)" #define MSG_ONLY_IPV4 "Alleen IPv4 wordt ondersteund (1)" #define MSG_TIMEOUT_PARSER "Onderbreking - volgende keer wat sneller typen a.u.b." #define MSG_LINE_TOO_LONG "Regel is te lang" #define MSG_LOG_OVERFLOW "De client probeerde teveel in te geven in de commandoregel buffer" #define MSG_GOODBYE "Tot ziens. U heeft %llu kbytes ge-upload en %llu kbytes ge-download" #define MSG_DEBUG_COMMAND "Commando" #define MSG_IS_YOUR_CURRENT_LOCATION "is uw huidige locatie" #define MSG_NOT_LOGGED_IN "U bent niet ingelogd" #define MSG_AUTH_UNIMPLEMENTED "Beveiligings uitbreidingen zijn niet opgenomen" #define MSG_NO_FILE_NAME "Geen bestands naam" #define MSG_NO_DIRECTORY_NAME "Geen directory naam" #define MSG_NO_RESTART_POINT "Geen nieuw beginpunt" #define MSG_ABOR_SUCCESS "Als u dit ziet is ABOR geslaagd" #define MSG_MISSING_ARG "Argument ontbreekt" #define MSG_GARBAGE_FOUND "Onbruikbare gegevens gevonden na ingegeven waarde" #define MSG_VALUE_TOO_LARGE "Waarde te groot" #define MSG_IDLE_TIME "Inactieve tijd ingesteld op %lu seconden" #define MSG_SITE_HELP "De volgende SITE commando's werden herkend" #define MSG_BAD_CHMOD "Ongeldige permissies" #define MSG_UNKNOWN_EXTENSION "is een onbekende extensie" #define MSG_XDBG_OK "XDBG commando is geslaagd, debug level is nu %d" #define MSG_UNKNOWN_COMMAND "Onbekend commando" #define MSG_TIMEOUT_NOOP "Onderbreking (geen activiteit gedurende %lu seconden)" #define MSG_TIMEOUT_DATA "Onderbreking (geen nieuwe gegevens gedurende %lu seconden)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "U bent reeds ingelogd!" #define MSG_ANY_PASSWORD "Elk willekeurig wachtwoord is goed" #define MSG_ANONYMOUS_LOGGED "Anonieme gebruiker is ingelogd" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Anonieme gebruiker is ingelogd in de virtuele FTP" #define MSG_USER_OK "Gebruiker %s OK. Wachtwoord vereist" #define MSG_CANT_DO_TWICE "In de huidige sessie kunnen we dit niet doen" #define MSG_UNABLE_SECURE_ANON "Het is onmogelijk om een beveiligde anonieme FTP op te zetten" #define MSG_BANDWIDTH_RESTRICTED "Uw bandbreedte is beperkt" #define MSG_NO_PASSWORD_NEEDED "Ik heb geen wachtwoord nodig!" #define MSG_NOTRUST "Het spijt me, maar ik kan u niet vertrouwen" #define MSG_WHOAREYOU "Wie bent U?" #define MSG_AUTH_FAILED "Sorry, autorisatie is mislukt" #define MSG_AUTH_TOOMANY "Autorisatie is te vaak mislukt" #define MSG_NO_HOMEDIR "Home directory niet beschikbaar - sessie wordt afgebroken" #define MSG_NO_HOMEDIR2 "%s bestaat niet of is onbereikbaar" #define MSG_START_SLASH "U begint in /" #define MSG_USER_GROUP_ACCESS "Gebruiker %s heeft groepstoegang voor" #define MSG_FXP_SUPPORT "Deze server ondersteunt FXP overdracht" #define MSG_RATIO "U moet voldoen aan een %u:%u (UL/DL) verhouding" #define MSG_CHROOT_FAILED "Het is niet mogelijk een veilige chroot() op te zetten" #define MSG_CURRENT_DIR_IS "OK. De huidige directory is %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. De huidige beperkte directory is %s" #define MSG_IS_NOW_LOGGED_IN "%s is nu ingelogd" #define MSG_CANT_CHANGE_DIR "Kan de directory niet veranderen naar %s" #define MSG_PATH_TOO_LONG "Pad is te lang" #define MSG_CANT_PASV "U kan PASV niet gebruiken bij IPv6 verbindingen. Gebruik EPSV." #define MSG_CANT_PASSIVE "Het is onmogelijk een passieve verbinding te openen" #define MSG_PORTS_BUSY "Alle gereserveerde TCP poorten zijn in gebruik" #define MSG_GETSOCKNAME_DATA "Het is onmogelijk de lokale data socket te identificeren" #define MSG_GETPEERNAME "Het is onmogelijk de lokale socket te identificeren " #define MSG_INVALID_IP "Sorry, ongeldig adres opgegeven" #define MSG_NO_EPSV "Een IPv6-conformant client met EPSV ondersteuning gebruiken a.u.b." #define MSG_BAD_PORT "Sorry, maar ik gebruik geen poorten < 1024" #define MSG_NO_FXP "Ik ben niet van plan een verbinding te openen met %s (alleen met %s)" #define MSG_FXP "FXP overdracht: van %s naar %s" #define MSG_NO_DATA_CONN "Geen data verbinding" #define MSG_ACCEPT_FAILED "De verbinding kon niet gemaakt worden" #define MSG_ACCEPT_SUCCESS "Data verbinding gemaakt" #define MSG_CNX_PORT_FAILED "Kon geen data verbinding openen naar poort %d" #define MSG_CNX_PORT "Bezig te verbinden met poort %d" #define MSG_ANON_CANT_MKD "Sorry, anonieme gebruikers kunnen geen directories aanmaken" #define MSG_ANON_CANT_RMD "Sorry, anonieme gebruikers kunnen geen directories verwijderen" #define MSG_ANON_CANT_RENAME "Anonieme gebruikers kunnen geen bestanden verplaatsen/herbenoemen" #define MSG_ANON_CANT_CHANGE_PERMS "Anonieme gebruikers kunnen geen permissies veranderen" #define MSG_GLOB_NO_MEMORY "Niet genoeg geheugen tijdens globbing van %s" #define MSG_PROBABLY_DENIED "(Dit betekent schijnbaar \"Hiervoor is toestemming nodig\")" #define MSG_GLOB_READ_ERROR "Leesfout tijdens globbing van %s" #define MSG_GLOB_NO_MATCH "Geen overeenstemming voor %s in %s" #define MSG_CHMOD_FAILED "Kon de permissies op %s niet veranderen" #define MSG_CHMOD_SUCCESS "Permissies veranderd op %s" #define MSG_CHMOD_TOTAL_FAILURE "Sorry, maar ik kon geen enkele permissie veranderen" #define MSG_ANON_CANT_DELETE "Anonieme gebruikers kunnen geen bestanden wissen" #define MSG_ANON_CANT_OVERWRITE "Anonieme gebruikers kunnen geen bestaande bestanden overschrijven." #define MSG_DELE_FAILED "Kon %s niet wissen" #define MSG_DELE_SUCCESS "%s%s%s%s gewist" #define MSG_DELE_TOTAL_FAILURE "Geen bestand gewist" #define MSG_LOAD_TOO_HIGH \ "De belasting was %3.2f toen u verbinding kreeg. Wij staan geen\n" \ "downloads toe door anonieme gebruikers bij zo'n hoge belasting.\n" \ "Uploaden is altijd toegestaan." #define MSG_OPEN_FAILURE "Kan %s niet openen" #define MSG_OPEN_FAILURE2 "Kan dat bestand niet openen" #define MSG_STAT_FAILURE "Kan die bestandsgrootte niet vinden" #define MSG_STAT_FAILURE2 "Kan niet kijken of dat bestand bestaat" #define MSG_REST_TOO_LARGE_FOR_FILE "Opnieuw opgestart offset %lld is te groot voor bestand grootte %lld." #define MSG_REST_RESET "Opnieuw opgestart, offset is weer op 0 gezet" #define MSG_NOT_REGULAR_FILE "Ik kan alleen standaard bestanden herstellen" #define MSG_NOT_MODERATED \ "Dit bestand is door een anonieme gebruiker ge-upload. Er is door de \n" \ "site beheerder nog geen toestemming gegegeven om die te downloaden.\n" #define MSG_RATIO_DENIAL \ "Het spijt me, maar de upload/download verhouding is %u:%u .\n" \ "Tot nu toe heeft u %llu Kb ge-upload en %llu Kb ge-download \n" \ "Upload eens wat leuks en probeer het later nog eens." #define MSG_NO_MORE_TO_DOWNLOAD "Er is niets meer om te downloaden" #define MSG_WINNER "De computer is uw vriend. Vertrouw maar op de computer" #define MSG_KBYTES_LEFT "%.1f kbytes om te downloaden" #define MSG_ABORTED "Overdracht afgebroken" #define MSG_DATA_WRITE_FAILED "Fout tijdens schrijven naar data verbinding" #define MSG_DATA_READ_FAILED "Fout tijdens lezen van data verbinding " #define MSG_MMAP_FAILED "Onmogelijk het bestand in het geheugen te plaatsen" #define MSG_WRITE_FAILED "Fout tijdens schrijven naar bestand" #define MSG_TRANSFER_RATE_M "%.3f seconden (hier gemeten), %.2f Mbytes per seconde" #define MSG_TRANSFER_RATE_K "%.3f seconden (hier gemeten), %.2f Kbytes per seconde" #define MSG_TRANSFER_RATE_B "%.3f seconden (hier gemeten), %.2f bytes per seconde" #define MSG_SPACE_FREE_M "%.1f Mbytes vrije schijfruimte" #define MSG_SPACE_FREE_K "%f Kbytes vrije schijfruimte " #define MSG_DOWNLOADED "gedownload" #define MSG_REST_NOT_NUMERIC "REST verlangt een numerieke parameter" #define MSG_REST_ASCII_STRICT "Antwoord teken moet 0 zijn in ASCII mode" #define MSG_REST_ASCII_WORKAROUND "We beginnen opnieuw bij %lld. Maar we zijn in ASCII mode" #define MSG_REST_SUCCESS "We beginnen opnieuw bij %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Verboden directory naam" #define MSG_SANITY_FILE_FAILURE "Verboden bestandsnaam: %s" #define MSG_MKD_FAILURE "Kan geen directory aanmaken" #define MSG_MKD_SUCCESS "De directory is met succes aangemaakt" #define MSG_RMD_FAILURE "Kan de directory niet verwijderen" #define MSG_RMD_SUCCESS "De directory is verwijderd" #define MSG_TIMESTAMP_FAILURE "Kan geen tijdsindicatie krijgen" #define MSG_MODE_ERROR "Alleen ASCII en binary modes worden ondersteund" #define MSG_CREATE_FAILURE "Niet mogelijk om een bestand aan te maken" #define MSG_ABRT_ONLY "ABRT is het enige geldige commando tijdens uploaden" #define MSG_UPLOAD_PARTIAL "gedeeltelijk ge-upload" #define MSG_REMOVED "verwijderd" #define MSG_UPLOADED "ge-upload" #define MSG_GMTIME_FAILURE "Kon de lokale tijd niet uitlezen" #define MSG_TYPE_8BIT_FAILURE "Alleen 8-bit bytes worden ondersteund, we leven niet in de vorige eeuw" #define MSG_TYPE_UNKNOWN "Onbekend TYPE" #define MSG_TYPE_SUCCESS "TYPE is nu" #define MSG_STRU_FAILURE "Alleen F(ile) wordt ondersteund" #define MSG_MODE_FAILURE "S(tream) mode gebruiken a.u.b." #define MSG_RENAME_ABORT "Voorgaande naamsverandering wordt afgebroken" #define MSG_RENAME_RNFR_SUCCESS "RNFR geaccepteerd - bestand bestaat reeds, gereed voor bestemming" #define MSG_FILE_DOESNT_EXIST "Het spijt me, maar dat bestand bestaat niet" #define MSG_RENAME_ALREADY_THERE "RENAME mislukt - doelbestand bestaat reeds" #define MSG_RENAME_NORNFR "RNFR is nodig, vóór RNTO" #define MSG_RENAME_FAILURE "Herbenoemings/verplaatsings fout" #define MSG_RENAME_SUCCESS "Bestand is met succes hernoemd of verplaatst" #define MSG_NO_SUPERSERVER "Pure-ftpd binnen een super-server (zoals tcpserver) laten draaien" #define MSG_NO_FTP_ACCOUNT "Niet in staat om de 'ftp' account te vinden" #define MSG_CONF_ERR "Configuratie fout" #define MSG_NO_VIRTUAL_FILE "Virtual users bestandsnaam ontbreekt" #define MSG_ILLEGAL_THROTTLING "Niet toegestane waarde voor throttling" #define MSG_ILLEGAL_TRUSTED_GID "Niet toegestane trusted gid voor chroot" #define MSG_ILLEGAL_USER_LIMIT "Niet toegestane gebruikers-limiet" #define MSG_ILLEGAL_FACILITY "Onbekende facility naam" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Ongeldige LDAP configuratiebestand" #define MSG_ILLEGAL_LOAD_LIMIT "Niet toegestane load limiet" #define MSG_ILLEGAL_PORTS_RANGE "Niet toegestaan poorten bereik" #define MSG_ILLEGAL_LS_LIMITS "Niet toegestane 'ls' limieten" #define MSG_ILLEGAL_FORCE_PASSIVE "Niet toegestaan gedwongen IP voor passieve verbindingen" #define MSG_ILLEGAL_RATIO "Niet toegestane upload/download verhouding" #define MSG_ILLEGAL_UID_LIMIT "Niet toegestane uid limiet" #define MSG_ILLEGAL_OPTION "Onbekende run-time optie" #define MSG_LDAP_MISSING_BASE "Ontbrekende LDAPBaseDN in de LDAP configuratiebestand " #define MSG_LDAP_WRONG_PARMS "Verkeerde LDAP parameters" #define MSG_NEW_CONNECTION "Nieuwe verbinding vanaf %s" #define MSG_WELCOME_TO "Welkom bij" #define MSG_MAX_USERS "%lu gebruikers (het maximum) zijn reeds ingelogd, sorry" #define MSG_NB_USERS "U bent gebruiker nummer %u van %u toegestane gebruikers" #define MSG_WELCOME_TIME "Locale tijd is nu %02d:%02d. Server poort: %u." #define MSG_ANONYMOUS_FTP_ONLY "Alleen anonieme FTP is hier toegestaan" #define MSG_RATIOS_EVERYONE "UL/DL VERHOUDINGEN ZIJN VOOR IEDEREEN INGESCHAKELD:" #define MSG_RATIOS_ANONYMOUS "ANONIEME GEBRUIKERS KRIJGEN EEN UL/DL VERHOUDING :" #define MSG_RATIOS_RULE "%u Mb te downloaden, uploaden van %u Mb is verplicht." #define MSG_INFO_IDLE_M "De verbinding wordt na %lu minuten van inactiviteit verbroken." #define MSG_INFO_IDLE_S "De verbinding wordt na %lu seconden van inactiviteit verbroken." #define MSG_CANT_READ_FILE "Sorry, we konden dit niet lezen [%s]" #define MSG_LS_TRUNCATED "Output afgekort naar %u overeenstemmingen" #define MSG_LS_SUCCESS "in totaal %u overeenstemmingen" #define MSG_LOGOUT "Logout." #define MSG_AUTH_FAILED_LOG "Autorisatie faalde voor gebruiker [%s]" #define MSG_ILLEGAL_UMASK "Ongeldige umask" #define MSG_STANDALONE_FAILED "Niet mogelijk om een standalone server te starten" #define MSG_NO_ANONYMOUS_LOGIN "Dit is een privé systeem - Geen anonieme login mogelijk" #define MSG_ANONYMOUS_ANY_PASSWORD "Elk willekeurig wachtwoord is goed" #define MSG_MAX_USERS_IP "Teveel verbindingen (%lu) vanaf dit IP" #define MSG_ACTIVE_DISABLED "Active mode is uitgeschakeld" #define MSG_TRANSFER_SUCCESSFUL "Bestand overdracht was succesvol" #define MSG_NO_DISK_SPACE "Schijf is vol - later uploaden a.u.b." #define MSG_OUT_OF_MEMORY "Geen geheugen meer!" #define MSG_ILLEGAL_TRUSTED_IP "Ilegaal IP adres" #define MSG_NO_ASCII_RESUME "ASCII hervatten is onveilig, verwijder het bestand eerst" #define MSG_UNKNOWN_ALTLOG "Onbekend log formaat" #define MSG_ACCOUNT_DISABLED "U kan niet inloggen als [%s] : het account is uitgeschakeld" #define MSG_SQL_WRONG_PARMS "Verkeerde SQL parameters" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Ongeldig SQL configuratie bestand" #define MSG_SQL_MISSING_SERVER "De server ontbreekt in het SQL configuratie bestand" #define MSG_SQL_DOWN "De SQL server lijkt niet actief te zijn" #define MSG_ILLEGAL_QUOTA "Ongeldige quota" #define MSG_QUOTA_FILES "%llu Bestanden in gebruik (%d%%) - goedgekeurd: %llu bestanden" #define MSG_QUOTA_SIZE "%llu Kbytes in gebruik (%d%%) - goedgekeurd: %llu Kb" #define MSG_QUOTA_EXCEEDED "Quota overschreden: [%s] worden niet opgeslagen" #define MSG_AUTH_UNKNOWN "Onbekende autorisatie methode" #define MSG_PDB_BROKEN "Kan het geindexeerde puredb bestand niet lezen (of oud formaat gedetecteerd) - Probeer pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s is een alias voor %s." #define MSG_ALIASES_UNKNOWN "Onbekende alias %s." #define MSG_ALIASES_BROKEN_FILE "Beschadigd aliassen bestand" #define MSG_ALIASES_LIST "De volgende aliassen zijn beschikbaar :" #define MSG_PERUSER_MAX "Ik kan niet meer dan %lu verbindingen van dezelfde gebruiker accepteren" #define MSG_IPV6_OK "IPv6 verbindingen zijn ook welkom op deze server" #define MSG_TLS_INFO "TLS: Enabled %s with %s, %d secret bits cipher" #define MSG_TLS_WEAK "TLS: Cipher too weak" #define MSG_TLS_NEEDED "Sorry, cleartext sessions are not accepted on this server.\n" \ "Please reconnect using TLS security mechanisms." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "Geen userPassword attribuut aangetroffen. Controleer de toegangsrechten." #define MSG_LDAP_INVALID_AUTH_METHOD "Onjuiste LDAPAuthMethod in de configuratie. Moet 'bind' of 'password' zijn." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/ftpd.c0000644000175000017500000052145013450665410015311 0ustar rackeracke#include #define DEFINE_GLOBALS #include "messages.h" #include "ftpd_p.h" #include "dynamic.h" #include "ftpwho-update.h" #include "ftpwho-read.h" #include "globals.h" #include "caps.h" #include "alt_arc4random.h" #if defined(WITH_UPLOAD_SCRIPT) # include "upload-pipe.h" #endif #ifdef WITH_ALTLOG # include "altlog.h" #endif #ifdef QUOTAS # include "quotas.h" #endif #ifdef WITH_DIRALIASES # include "diraliases.h" #endif #include "ftpd.h" #include "bsd-glob.h" #include "getloadavg.h" #include "safe_rw.h" #include "utils.h" #ifndef MINIMAL # include "simpleconf.h" # include "simpleconf_ftpd.h" #endif #ifndef WITHOUT_PRIVSEP # include "privsep.h" #endif #ifdef WITH_TLS # include "tls.h" # include "tls_extcert.h" #endif #ifdef WITH_BONJOUR # include "bonjour.h" #endif #ifdef HAVE_LIBSODIUM # include #endif #ifdef WITH_DMALLOC # include #endif void disablesignals(void) { sigset_t sigs; sigfillset(&sigs); if (sigprocmask(SIG_BLOCK, &sigs, &old_sigmask) < 0) { _EXIT(EXIT_FAILURE); } } static void enablesignals(void) { if (sigprocmask(SIG_SETMASK, &old_sigmask, NULL) < 0) { _EXIT(EXIT_FAILURE); } } void usleep2(const unsigned long microsec) { disablesignals(); usleep(microsec); enablesignals(); } #ifdef WITH_TLS ssize_t secure_safe_write(void * const tls_fd, const void *buf_, size_t count) { ssize_t written; const char *buf = (const char *) buf_; while (count > (size_t) 0U) { for (;;) { if ((written = SSL_write(tls_fd, buf, count)) <= (ssize_t) 0) { if (SSL_get_error(tls_fd, written) != SSL_ERROR_NONE) { return (ssize_t) -1; } continue; } break; } buf += written; count -= written; } return (ssize_t) (buf - (const char *) buf_); } #endif static ssize_t safe_nonblock_write(const int fd, void * const tls_fd, const void *buf_, size_t count) { ssize_t written; const char *buf = (const char *) buf_; struct pollfd pfd; while (count > (size_t) 0U) { for (;;) { if (tls_fd == NULL) { written = write(fd, buf, count); } else { #ifdef WITH_TLS written = SSL_write(tls_fd, buf, count); if (SSL_get_error(tls_fd, written) == SSL_ERROR_WANT_WRITE) { errno = EAGAIN; } #else abort(); #endif } if (written > (ssize_t) 0) { break; } if (errno == EAGAIN || errno == EWOULDBLOCK) { pfd.fd = fd; pfd.events = POLLOUT | POLLERR | POLLHUP; pfd.revents = 0; if (poll(&pfd, 1U, idletime * 1000UL) <= 0 || (pfd.revents & (POLLERR | POLLHUP)) != 0 || (pfd.revents & POLLOUT) == 0) { errno = EPIPE; return -1; } } else if (errno != EINTR) { return -1; } } buf += written; count -= written; } return 0; } static void overlapcpy(char *d, const char *s) { while (*s != 0) { *d++ = *s++; } *d = 0; } static void safe_fd_set(const int fd, fd_set * const fds) { if (fd == -1) { return; } FD_SET(fd, fds); } static int safe_fd_isset(const int fd, const fd_set * const fds) { if (fd == -1) { return 0; } return FD_ISSET(fd, fds); } static int init_tz(void) { char stbuf[10]; struct tm *tm; time_t now = time(NULL); #ifdef HAVE_TZSET tzset(); #endif #ifdef HAVE_PUTENV if ((tm = localtime(&now)) != NULL && strftime(stbuf, sizeof stbuf, "%z", tm) == (size_t) 5U) { snprintf(default_tz_for_putenv, sizeof default_tz_for_putenv, "TZ=UTC%c%c%c:%c%c", (*stbuf == '-' ? '+' : '-'), stbuf[1], stbuf[2], stbuf[3], stbuf[4]); } putenv(default_tz_for_putenv); #endif (void) localtime(&now); (void) gmtime(&now); return 0; } void simplify(char *subdir) { char *a; if (subdir == NULL || *subdir == 0) { return; } while ((a = strstr(subdir, "//")) != NULL) { overlapcpy(a, a + 1); } while ((a = strstr(subdir, "/./")) != NULL) { overlapcpy(a, a + 2); } while (strncmp(subdir, "../", 3) == 0) { subdir += 3; } a = strstr(subdir, "/../"); if (a != NULL) { if (a == subdir) { while (strncmp(subdir, "/../", 4) == 0) { overlapcpy(subdir, subdir + 3); } a = strstr(subdir, "/../"); } while (a != NULL) { char *nextcomponent = a + 4; if (a != subdir && *a == '/') { a--; } while (a != subdir && *a != '/') { a--; } if (*a == '/') { a++; } overlapcpy(a, nextcomponent); a = strstr(subdir, "/../"); } } a = subdir; if (*a == '.') { a++; if (*a == 0) { return; } if (*a == '/') { while (*a == '/') { a++; } overlapcpy(subdir, a); } } if (*a == 0) { return; } a = subdir + strlen(subdir) - (size_t) 1U; if (*a != '.' || a == subdir) { return; } a--; if (*a == '/' || a == subdir) { a[1] = 0; return; } if (*a != '.' || a == subdir) { return; } a--; if (*a != '/') { return; } *a = 0; if ((a = strrchr(subdir, '/')) == NULL) { *subdir = '/'; subdir[1] = 0; return; } a[1] = 0; } int checkprintable(const char *s) { int ret = 0; unsigned char c; while ((c = (unsigned char) *s) != 0U) { if (ISCTRLCODE(c)) { ret--; break; } s++; } return ret; } char *skip_telnet_controls(const char *str) { if (str == NULL) { return NULL; } while (*str != 0 && (unsigned char) *str >= 240U) { str++; } return (char *) str; } void _EXIT(const int status) { delete_atomic_file(); #ifdef FTPWHO ftpwho_exit(); #endif _exit(status); } static char replybuf[MAX_SERVER_REPLY_LEN * 4U]; static char *replybuf_pos = replybuf; static size_t replybuf_left; static void client_init_reply_buf(void) { replybuf_pos = replybuf; replybuf_left = sizeof replybuf - 1U; } void client_fflush(void) { if (replybuf_pos == replybuf) { return; } safe_write(clientfd, replybuf, (size_t) (replybuf_pos - replybuf), -1); client_init_reply_buf(); } void client_printf(const char * const format, ...) { va_list va; char buf[MAX_SERVER_REPLY_LEN]; size_t len; int vlen; va_start(va, format); vlen = vsnprintf(buf, sizeof buf, format, va); if (vlen < 0 || (size_t) vlen >= sizeof buf) { buf[MAX_SERVER_REPLY_LEN - 1] = 0; len = strlen(buf); } else { len = (size_t) vlen; } if (len >= replybuf_left) { client_fflush(); } if (len > replybuf_left) { va_end(va); abort(); } memcpy(replybuf_pos, buf, len); replybuf_pos += len; replybuf_left -= len; va_end(va); } void die(const int err, const int priority, const char * const format, ...) { va_list va; char line[MAX_SYSLOG_LINE]; disablesignals(); logging = 0; va_start(va, format); vsnprintf(line, sizeof line, format, va); addreply(err, "%s", line); va_end(va); doreply(); logfile(priority, "%s", line); _EXIT(-priority - 1); } void die_mem(void) { die(421, LOG_ERR, MSG_OUT_OF_MEMORY); } static RETSIGTYPE sigalarm(int sig) { (void) sig; disablesignals(); die(421, LOG_INFO, MSG_TIMEOUT); } #ifndef NO_STANDALONE static RETSIGTYPE sigchild(int sig) { const int olderrno = errno; pid_t pid; (void) sig; # ifdef HAVE_WAITPID while ((pid = waitpid((pid_t) -1, NULL, WNOHANG)) > (pid_t) 0) { if (nb_children > 0U) { nb_children--; } # ifdef FTPWHO ftpwho_unlinksbfile(pid); # endif iptrack_delete_pid(pid); } # else while ((pid = wait3(NULL, WNOHANG, NULL)) > (pid_t) 0) { if (nb_children > 0U) { nb_children--; } # ifdef FTPWHO ftpwho_unlinksbfile(pid); # endif iptrack_delete_pid(pid); } # endif errno = olderrno; } #endif static RETSIGTYPE sigterm_client(int sig) { (void) sig; disablesignals(); _EXIT(EXIT_SUCCESS); } #ifndef NO_STANDALONE static RETSIGTYPE sigterm(int sig) { const int olderrno = errno; (void) sig; stop_server = 1; if (listenfd != -1) { shutdown(listenfd, 2); (void) close(listenfd); } if (listenfd6 != -1) { shutdown(listenfd6, 2); (void) close(listenfd6); } errno = olderrno; } static void set_cloexec_flag(const int fd) { fcntl(fd, F_SETFD, FD_CLOEXEC); } #endif static void clearargs(int argc, char **argv) { #ifndef NO_PROCNAME_CHANGE # if defined(__linux__) && !defined(HAVE_SETPROCTITLE) int i; char *first = NULL; char *next = NULL; for (i = 0; i < argc; i++) { if (first == NULL) { first = argv[i]; } if (next == NULL || argv[i] == next + 1) { next = argv[i] + strlen(argv[i]); } } for (i = 0; environ[i] != NULL; i++) { if (first == NULL) { first = argv[i]; } if (next == NULL || argv[i] == next + 1) { next = argv[i] + strlen(argv[i]); } } if (first == NULL || next == NULL) { return; } argv_lth = next - first; argv0 = argv; if (environ != NULL) { char **new_environ; unsigned int env_nb = 0U; while (environ[env_nb] != NULL) { env_nb++; } if ((new_environ = malloc((1U + env_nb) * sizeof (char *))) == NULL) { abort(); } new_environ[env_nb] = NULL; while (env_nb > 0U) { env_nb--; new_environ[env_nb] = strdup(environ[env_nb]); } environ = new_environ; } # else (void) argc; (void) argv; # endif #endif } void setprocessname(const char * const title) { #ifndef NO_PROCNAME_CHANGE # ifdef HAVE_SETPROCTITLE setproctitle("-%s", title); # elif defined(__linux__) if (argv0 != NULL && argv_lth > strlen(title) - 2) { memset(argv0[0], 0, argv_lth); strncpy(argv0[0], title, argv_lth - 2); argv0[1] = NULL; } # elif defined(__hpux__) union pstun pst; pst.pst_command = title; pstat(PSTAT_SETCMD, pst, strlen(title), 0, 0); # endif #endif (void) title; } /* Check whether an address is valid, return 1 if ok, 0 otherwise. * Unfortunately, multicasting with the FTP protocol is impossible, * you have to use things like MTP instead. So prohibit multicast. */ static int checkvalidaddr(const struct sockaddr_storage * const addr) { if (addr == NULL) { return 0; } /* Some versions of MacOS X have broken IN* macros */ #ifdef __APPLE_CC__ return 1; #endif if (STORAGE_FAMILY(*addr) == AF_INET6) { if (IN6_IS_ADDR_MULTICAST(&STORAGE_SIN_ADDR6_NF_CONST(*addr)) || IN6_IS_ADDR_UNSPECIFIED(&STORAGE_SIN_ADDR6_NF_CONST(*addr))) { return 0; } return 1; } else if (STORAGE_FAMILY(*addr) == AF_INET) { if (ntohl(STORAGE_SIN_ADDR_CONST(*addr)) == INADDR_ANY || ntohl(STORAGE_SIN_ADDR_CONST(*addr)) == INADDR_NONE || ntohl(STORAGE_SIN_ADDR_CONST(*addr)) == INADDR_BROADCAST || IN_MULTICAST(ntohl(STORAGE_SIN_ADDR_CONST(*addr))) || IN_BADCLASS(ntohl(STORAGE_SIN_ADDR_CONST(*addr)))) { return 0; } return 1; } return 0; } /* Convert a 4-in-6 address to pure IPv4 */ static void fourinsix(struct sockaddr_storage *v6) { struct sockaddr_storage v4; if (v6ready == 0 || STORAGE_FAMILY(*v6) != AF_INET6 || IN6_IS_ADDR_V4MAPPED(&STORAGE_SIN_ADDR6_NF_CONST(*v6)) == 0) { return; } memset(&v4, 0, sizeof v4); STORAGE_FAMILY(v4) = AF_INET; memcpy(&STORAGE_SIN_ADDR(v4), (unsigned char *) &STORAGE_SIN_ADDR6_CONST(*v6) + 12, sizeof STORAGE_SIN_ADDR(v4)); STORAGE_PORT(v4) = STORAGE_PORT6_CONST(*v6); SET_STORAGE_LEN(v4, sizeof(struct sockaddr_in)); *v6 = v4; } /* Return 0 if s1 == s2 , 1 if s1 != s2 , -1 if error */ static int addrcmp(const struct sockaddr_storage * const s1, const struct sockaddr_storage * const s2) { if (STORAGE_FAMILY(*s1) == AF_INET6) { if (STORAGE_FAMILY(*s2) != AF_INET6) { return 1; } if (IN6_ARE_ADDR_EQUAL(&STORAGE_SIN_ADDR6_NF_CONST(*s1), &STORAGE_SIN_ADDR6_NF_CONST(*s2))) { return 0; } else { return 1; } } else if (STORAGE_FAMILY(*s1) == AF_INET) { if (STORAGE_FAMILY(*s2) != AF_INET) { return 1; } if (STORAGE_SIN_ADDR_CONST(*s1) == STORAGE_SIN_ADDR_CONST(*s2)) { return 0; } else { return 1; } } return -1; } static int generic_aton(const char *src, struct sockaddr_storage *a) { if (inet_pton(AF_INET6, src, &STORAGE_SIN_ADDR6(*a)) > 0) { STORAGE_FAMILY(*a) = AF_INET6; return 0; } if (inet_pton(AF_INET, src, &STORAGE_SIN_ADDR(*a)) > 0) { STORAGE_FAMILY(*a) = AF_INET; return 0; } memset(a, 0, sizeof *a); return -1; } void logfile(const int crit, const char *format, ...) { #if defined(NON_ROOT_FTP) (void) crit; (void) format; #else const char *urgency; va_list va; char line[MAX_SYSLOG_LINE]; if (no_syslog != 0) { va_end(va); return; } va_start(va, format); vsnprintf(line, sizeof line, format, va); va_end(va); switch (crit) { case LOG_INFO: urgency = "[INFO] "; break; case LOG_WARNING: urgency = "[WARNING] "; break; case LOG_ERR: urgency = "[ERROR] "; break; case LOG_NOTICE: urgency = "[NOTICE] "; break; case LOG_DEBUG: urgency = "[DEBUG] "; break; default: urgency = ""; } # ifdef SAVE_DESCRIPTORS openlog("pure-ftpd", log_pid, syslog_facility); # endif syslog(crit, "(%s@%s) %s%s", ((loggedin != 0 && *account != 0) ? account : "?"), (*host != 0 ? host : "?"), urgency, line); # ifdef SAVE_DESCRIPTORS closelog(); # endif #endif } #ifndef NO_STANDALONE /* this is taken from the code examples for Stevens' "Advanced * Programming in the Unix Environment. The code is publicly available * at ftp://ftp.uu.net/published/books/stevens.advprog.tar.Z */ static unsigned int open_max(void) { long z; if ((z = (long) sysconf(_SC_OPEN_MAX)) < 0L) { perror("_SC_OPEN_MAX"); _EXIT(EXIT_FAILURE); } return (unsigned int) z; } #endif static void addreply_newline(const char * const str, const size_t size) { struct reply *newline; if ((newline = (struct reply *) malloc(offsetof(struct reply, line) + size)) == NULL) { die_mem(); } if (firstreply == NULL) { firstreply = newline; } else { lastreply->next = newline; } newline->next = NULL; lastreply = newline; memcpy(newline->line, str, size); } void addreply_noformat(const int code, const char * const line) { if (code != 0) { replycode = code; } addreply_newline(line, strlen(line) + (size_t) 1U); } void addreply(const int code, const char * const line, ...) { char *a; char *b; va_list ap; int last; char buf[MAX_SERVER_REPLY_LEN]; if (code != 0) { replycode = code; } va_start(ap, line); vsnprintf(buf, sizeof buf, line, ap); va_end(ap); last = 0; a = buf; for (;;) { b = strchr(a, '\n'); if (b != NULL) { *b = 0; } else { b = a; while (*b != 0) { b++; } last++; } addreply_newline(a, (size_t) (b - a) + (size_t) 1U); if (last != 0) { break; } a = b + 1; } } void doreply(void) { struct reply *scannedentry; struct reply *nextentry; if ((scannedentry = firstreply) == NULL) { return; } do { nextentry = scannedentry->next; #ifdef WITH_TLS if (tls_cnx != NULL) { char buf[MAX_SERVER_REPLY_LEN]; snprintf(buf, sizeof buf, "%3d%c%s\r\n", replycode, nextentry == NULL ? ' ' : '-', scannedentry->line); SSL_write(tls_cnx, buf, strlen(buf)); } else #endif { client_printf("%3d%c%s\r\n", replycode, nextentry == NULL ? ' ' : '-', scannedentry->line); } if (logging > 1) { logfile(LOG_DEBUG, "%3d%c%s", replycode, nextentry == NULL ? ' ' : '-', scannedentry->line); } } while ((scannedentry = nextentry) != NULL); client_fflush(); scannedentry = firstreply; do { nextentry = scannedentry->next; free(scannedentry); } while ((scannedentry = nextentry) != NULL); firstreply = lastreply = NULL; } /* Check whether a file name is valid. Files names starting * with a dot are only allowed to root and to users * chroot()ed in their home directories -Jedi. */ static int checknamesanity(const char *name, int dot_ok) { const char *namepnt; #ifdef PARANOID_FILE_NAMES const char *validchars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ" "abcdefgihjklmnopqrstuvwxyz" "0123456789./-_"; #endif if (name == NULL || *name == 0) { return -1; } /* optimize . and .. */ if (name[0] == '.' && (name[1] == 0 || (name[1] == '.' && name[2] == 0))) { return 0; } namepnt = name; #ifdef PARANOID_FILE_NAMES /* we want to make sure we don't get any non-alphanumeric file name */ if (strlen(namepnt) != strspn(namepnt, validchars)) { return -1; } #endif #ifdef QUOTAS if (hasquota() == 0) { if (strstr(namepnt, QUOTA_FILE) != NULL) { return -1; /* .ftpquota => *NO* */ } # ifndef ALLOW_DELETION_OF_TEMPORARY_FILES if (strstr(namepnt, PUREFTPD_TMPFILE_PREFIX) == namepnt) { return -1; } # endif } #endif while (*namepnt != 0) { #ifndef ALLOW_EVERYTHING_IN_FILE_NAMES if (ISCTRLCODE(*namepnt) || *namepnt == '\\') { return -1; } #endif if (dot_ok == 0) { if (*namepnt == '/') { namepnt++; } else if (namepnt != name) { namepnt++; continue; } if (namepnt[0] == 0) { /* /$ */ return 0; } if (namepnt[0] == '.') { /* /. */ if (namepnt[1] == 0) { /* /.$ => ok */ return 0; } if (namepnt[1] == '.') { /* /.. */ if (namepnt[2] == 0) { /* /..$ => ok */ return 0; } if (namepnt[2] != '/') { /* /..[^/] => *NO* */ return -1; } } else if (namepnt[1] != '/') { /* /.[^/]/ => *NO* */ return -1; } } if (namepnt != name) { continue; } } namepnt++; } return 0; } static void do_ipv6_port(char *p, char delim) { char *deb; struct sockaddr_storage a; deb = p; while (*p && strchr("0123456789abcdefABCDEF:", *p) != NULL) { p++; } if (*p != delim || atoi(p + 1) == 0) { nope: (void) close(datafd); datafd = -1; addreply_noformat(501, MSG_SYNTAX_ERROR_IP); return; } *p++ = 0; if (generic_aton(deb, &a) != 0) { goto nope; } doport2(a, (unsigned int) atoi(p)); } #ifndef MINIMAL void doesta(void) { struct sockaddr_storage dataconn; socklen_t socksize; char hbuf[NI_MAXHOST]; char pbuf[NI_MAXSERV]; if (passive != 0 || datafd == -1) { addreply_noformat(520, MSG_ACTIVE_DISABLED); return; } if (xferfd == -1) { opendata(); if (xferfd == -1) { addreply_noformat(425, MSG_CANT_CREATE_DATA_SOCKET); return; } } socksize = (socklen_t) sizeof dataconn; if (getsockname(xferfd, (struct sockaddr *) &dataconn, &socksize) < 0 || getnameinfo((struct sockaddr *) &dataconn, STORAGE_LEN(dataconn), hbuf, sizeof hbuf, pbuf, sizeof pbuf, NI_NUMERICHOST | NI_NUMERICSERV) != 0) { addreply_noformat(425, MSG_GETSOCKNAME_DATA); closedata(); return; } addreply(225, "Connected from (|%c|%s|%s|)", STORAGE_FAMILY(dataconn) == AF_INET6 ? '2' : '1', hbuf, pbuf); } void doestp(void) { struct sockaddr_storage dataconn; socklen_t socksize; char hbuf[NI_MAXHOST]; char pbuf[NI_MAXSERV]; if (passive == 0 || datafd == -1) { addreply_noformat(520, MSG_CANT_PASSIVE); return; } if (xferfd == -1) { opendata(); if (xferfd == -1) { addreply_noformat(425, MSG_CANT_CREATE_DATA_SOCKET); return; } } socksize = (socklen_t) sizeof dataconn; if (getpeername(xferfd, (struct sockaddr *) &dataconn, &socksize) < 0 || getnameinfo((struct sockaddr *) &dataconn, STORAGE_LEN(dataconn), hbuf, sizeof hbuf, pbuf, sizeof pbuf, NI_NUMERICHOST | NI_NUMERICSERV) != 0) { addreply_noformat(425, MSG_GETSOCKNAME_DATA); closedata(); return; } addreply(225, "Connected to (|%c|%s|%s|)", STORAGE_FAMILY(dataconn) == AF_INET6 ? '2' : '1', hbuf, pbuf); } #endif void doeprt(char *p) { char delim; int family; delim = *p++; family = atoi(p); while (isdigit((unsigned char) *p)) { p++; } if (*p == delim) { p++; } else { addreply_noformat(501, MSG_SYNTAX_ERROR_IP); return; } if (family == 2 && v6ready) { do_ipv6_port(p, delim); return; } if (family != 1) { if (v6ready) { addreply_noformat(522, MSG_ONLY_IPV4V6); } else { addreply_noformat(522, MSG_ONLY_IPV4); } return; } { unsigned int a1, a2, a3, a4, port = 0U; /* there should be dot-decimal ip as rfc2428 states, * but troll used for some reason "comma-decimal" notation * so I decided to leave it */ if ((sscanf(p, "%u,%u,%u,%u", &a1, &a2, &a3, &a4) != 4 && sscanf(p, "%u.%u.%u.%u", &a1, &a2, &a3, &a4) != 4) || a1 > 255U || a2 > 255U || a3 > 255U || a4 > 255U || (a1 | a2 | a3 | a4) == 0U) { addreply_noformat(501, MSG_SYNTAX_ERROR_IP); return; } while (*p && strchr("0123456789.,", *p)) { p++; } if (*p == delim) { port = (unsigned int) atoi(++p); while (*p && isdigit((unsigned char) *p)) { p++; } } if (*p != delim || port > 65535U || port <= 0U) { addreply_noformat(501, MSG_SYNTAX_ERROR_IP); return; } else { struct sockaddr_storage a; memset(&a, 0, sizeof a); STORAGE_FAMILY(a) = AF_INET; STORAGE_SIN_ADDR(a) = htonl(((uint32_t) a1 << 24) | ((uint32_t) a2 << 16) | (a3 << 8) | a4); SET_STORAGE_LEN(a, sizeof(struct sockaddr_in)); doport2(a, port); } } } void stripctrl(char * const buf, size_t len) { if (len <= (size_t) 0U) { return; } do { len--; if (ISCTRLCODE(buf[len]) && buf[len] != 0 && buf[len] != '\n') { buf[len] = '_'; } } while (len != (size_t) 0U); } #ifndef MINIMAL /* * small help routine to display a banner * type = 0 reads .banner/welcome.msg * type = 1 reads .message (after cd'ing into a directory) */ void dobanner(const int type) { char buffer[512]; FILE *msg; size_t buflen; unsigned int nblines = BANNER_MAXLINES; switch (type) { case 0: if ((msg = fopen(".banner", "r")) == NULL # ifdef WITH_WELCOME_MSG && (msg = fopen("welcome.msg", "r")) == NULL # endif ) { return; } break; case 1: if ((msg = fopen(".message", "r")) == NULL) { return; } break; default: return; } while (fgets(buffer, sizeof buffer, msg) != NULL && nblines > 0U) { nblines--; if ((buflen = strlen(buffer)) > (size_t) 0U) { buflen--; while (buffer[buflen] == '\n' || buffer[buflen] == '\r') { buffer[buflen] = 0; if (buflen == (size_t) 0U) { break; } buflen--; } stripctrl(buffer, buflen); } addreply_noformat(0, buffer); } (void) fclose(msg); } #endif #ifndef MINIMAL int modernformat(const char *file, char *target, size_t target_size, const char * const prefix) { char link_target[PATH_MAX + 1U]; const char *ft; const char *ftx = ""; struct tm *t; struct stat st; int ret = 0; if (lstat(file, &st) != 0 || !(t = gmtime((time_t *) &st.st_mtime))) { return -1; } #if !defined(MINIMAL) && !defined(ALWAYS_SHOW_SYMLINKS_AS_SYMLINKS) if ( # ifndef ALWAYS_SHOW_RESOLVED_SYMLINKS broken_client_compat != 0 && # endif S_ISLNK(st.st_mode)) { struct stat sts; if (stat(file, &sts) == 0 && !S_ISLNK(sts.st_mode)) { st = sts; } } /* Show non-dangling symlinks as files/directories */ #endif if (S_ISREG(st.st_mode)) { ft = "file"; } else if (S_ISDIR(st.st_mode)) { ret = 1; ft = "dir"; if (*file == '.') { if (file[1] == '.' && file[2] == 0) { ft = "pdir"; } else if (file[1] == 0) { ft = "cdir"; } } else if (*file == '/' && file[1] == 0) { ft = "pdir"; } } else if (S_ISLNK(st.st_mode)) { ssize_t sx; ft = "OS.unix=symlink"; if ((sx = readlink(file, link_target, sizeof link_target - 1U)) > 0) { link_target[sx] = 0; if (strpbrk(link_target, "\r\n;") == NULL) { ftx = link_target; ft = "OS.unix=slink:"; } } } else { ft = "unknown"; } if (guest != 0) { if (SNCHECK(snprintf(target, target_size, "%stype=%s%s;siz%c=%llu;modify=%04d%02d%02d%02d%02d%02d;UNIX.mode=0%o;unique=%xg%llx; %s", prefix, ft, ftx, ret ? 'd' : 'e', (unsigned long long) st.st_size, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, (unsigned int) st.st_mode & 07777, (unsigned int) st.st_dev, (unsigned long long) st.st_ino, file), target_size)) { _EXIT(EXIT_FAILURE); } } else { if (SNCHECK(snprintf(target, target_size, "%stype=%s;siz%c=%llu;modify=%04d%02d%02d%02d%02d%02d;UNIX.mode=0%o;UNIX.uid=%lld;UNIX.gid=%lld;unique=%xg%llx; %s", prefix, ft, ret ? 'd' : 'e', (unsigned long long) st.st_size, t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec, (unsigned int) st.st_mode & 07777, (unsigned long long) st.st_uid, (unsigned long long) st.st_gid, (unsigned int) st.st_dev, (unsigned long long) st.st_ino, file), target_size)) { _EXIT(EXIT_FAILURE); } } return ret; } #define MLST_BEGIN "Begin" CRLF void domlst(const char * const file) { char line[PATH_MAX + 256U] = MLST_BEGIN; if (modernformat(file, line + (sizeof MLST_BEGIN - 1U), sizeof line - (sizeof MLST_BEGIN - 1U), " ") < 0) { addreply_noformat(550, MSG_STAT_FAILURE2); return; } addreply_noformat(0, line); addreply_noformat(250, "End."); } void donoop(void) { #ifdef BORING_MODE addreply_noformat(200, "dc.w $4E71"); #else addreply_noformat(200, MSG_SLEEPING); #endif } void doallo(const off_t size) { int ret = -1; #ifdef QUOTAS Quota quota; #endif if (size <= 0) { ret = 0; } else if (ul_check_free_space(wd, (double) size) != 0) { ret = 0; } #ifdef QUOTAS if (quota_update("a, 0LL, 0LL, NULL) == 0) { if (quota.files >= user_quota_files || quota.size >= user_quota_size || (unsigned long long) size > user_quota_size - quota.size) { ret = -1; } } #endif if (ret == 0) { #ifdef DISABLE_HUMOR addreply_noformat(200, "OK"); #else addreply_noformat(200, "A L'HUILE"); #endif } else { addreply_noformat(552, MSG_NO_DISK_SPACE); } } #endif void dositetime(void) { char tmp[64]; const struct tm *tm; time_t now; if ((now = time(NULL)) == (time_t) -1 || (tm = localtime(&now)) == NULL) { addreply_noformat(451, "time()"); return; } strftime(tmp, sizeof tmp, "%Y-%m-%d %H:%M:%S", tm); addreply_noformat(211, tmp); } static int doinitsupgroups(const char *user, const uid_t uid, const gid_t gid) { #ifndef NON_ROOT_FTP # ifdef HAVE_SETGROUPS if (setgroups(1U, &gid) != 0) { return -1; } # else (void) gid; # endif # ifdef HAVE_INITGROUPS if (user == NULL) { const struct passwd * const lpwd = getpwuid(uid); if (lpwd != NULL && lpwd->pw_name != NULL) { user = lpwd->pw_name; } else { return 0; } } initgroups(user, gid); # else (void) user; (void) uid; # endif #else (void) user; (void) uid; (void) gid; #endif return 0; } void douser(const char *username) { struct passwd *pw = NULL; if (loggedin) { if (username) { if (!guest) { addreply_noformat(530, MSG_ALREADY_LOGGED); } else if (broken_client_compat != 0) { addreply_noformat(331, MSG_ANY_PASSWORD); } else { addreply_noformat(230, MSG_ANONYMOUS_LOGGED); dot_read_ok = dot_read_anon_ok; dot_write_ok = 0; } } return; } if (anon_only <= 0 && username != NULL && *username != 0 && (anon_only < 0 || (strcasecmp(username, "ftp") && strcasecmp(username, "anonymous")))) { strncpy(account, username, sizeof(account) - 1); account[sizeof(account) - (size_t) 1U] = 0; addreply(331, MSG_USER_OK, account); loggedin = 0; } else if (anon_only < 0) { if (broken_client_compat != 0) { addreply(331, MSG_USER_OK, username); return; } else { die(530, LOG_DEBUG, MSG_NO_ANONYMOUS_LOGIN); } } else { #ifdef WITH_VIRTUAL_HOSTS char name[PATH_MAX]; char hbuf[NI_MAXHOST]; #endif if (chrooted != 0) { die(421, LOG_DEBUG, MSG_CANT_DO_TWICE); } #ifdef PER_USER_LIMITS if (per_anon_max > 0U && ftpwho_read_count("ftp") >= per_anon_max) { addreply(421, MSG_PERUSER_MAX, (unsigned long) per_anon_max); doreply(); _EXIT(1); } #endif #ifdef NON_ROOT_FTP { static struct passwd pw_; char s[PATH_MAX + 1U]; if (getcwd(s, sizeof s - (size_t) 1U) == NULL) { cantsec: die(421, LOG_ERR, MSG_UNABLE_SECURE_ANON); } pw_.pw_uid = geteuid(); pw_.pw_gid = getegid(); pw_.pw_dir = (char *) NON_ROOT_ANON_DIR; if (home_directory != NULL) { pw_.pw_dir = (char *) home_directory; } if (getenv("FTP_ANON_DIR") != NULL) { pw_.pw_dir = getenv("FTP_ANON_DIR"); } if (pw_.pw_dir == NULL) { pw_.pw_dir = strdup(s); /* checked for == NULL later */ } pw = &pw_; } #else if (((pw = getpwnam("ftp")) == NULL && (pw = getpwnam("_ftp")) == NULL) || pw->pw_uid == 0 || pw->pw_gid == 0 || (doinitsupgroups("ftp", (uid_t) -1, pw->pw_gid) != 0 && doinitsupgroups("_ftp", (uid_t) -1, pw->pw_gid) != 0) || setgid(pw->pw_gid) || setegid(pw->pw_gid)) { cantsec: die(421, LOG_ERR, MSG_UNABLE_SECURE_ANON); } # ifdef ANON_DIR if ((pw->pw_dir = strdup(ANON_DIR)) == NULL) { die_mem(); } # endif #endif #ifdef WITH_VIRTUAL_HOSTS if (getnameinfo((struct sockaddr *) &ctrlconn, STORAGE_LEN(ctrlconn), hbuf, sizeof hbuf, NULL, (size_t) 0U, NI_NUMERICHOST) != 0 || SNCHECK(snprintf(name, sizeof name, VHOST_PATH "/%s", hbuf), sizeof name)) { _EXIT(EXIT_FAILURE); } if (chdir(name) != 0) /* non-virtual */ #endif { char *hd; size_t rd_len; if (pw->pw_dir == NULL || *pw->pw_dir != '/') { goto cantsec; } if ((hd = strstr(pw->pw_dir, "/./")) != NULL) { rd_len = (size_t) (hd - pw->pw_dir) + sizeof "/"; if ((root_directory = malloc(rd_len)) == NULL) { goto cantsec; } memcpy(root_directory, pw->pw_dir, rd_len); root_directory[rd_len - (size_t) 1U] = 0; hd += 2; } else { rd_len = strlen(pw->pw_dir) + sizeof "/"; if ((root_directory = malloc(rd_len)) == NULL) { goto cantsec; } snprintf(root_directory, rd_len, "%s/", pw->pw_dir); hd = (char *) "/"; } if (chdir(root_directory) || chroot(root_directory) || chdir(hd)) { die(421, LOG_ERR, MSG_CANT_CHANGE_DIR " [%s]", root_directory, hd); goto cantsec; } logfile(LOG_INFO, MSG_ANONYMOUS_LOGGED); } #ifdef WITH_VIRTUAL_HOSTS else { /* virtual host */ const size_t rd_len = strlen(hbuf) + sizeof ":/"; if ((root_directory = malloc(rd_len)) == NULL || chdir(name) || chroot(name) || chdir("/") || SNCHECK(snprintf(root_directory, rd_len, "%s:/", hbuf), rd_len)) { goto cantsec; } logfile(LOG_INFO, MSG_ANONYMOUS_LOGGED_VIRTUAL ": %s", hbuf); } #endif if (pw == NULL) { goto cantsec; } chrooted = 1; authresult.uid = pw->pw_uid; authresult.gid = pw->pw_gid; if ((authresult.dir = strdup(pw->pw_dir)) == NULL) { die_mem(); } #ifdef THROTTLING if (throttling != 0) { addreply_noformat(0, MSG_BANDWIDTH_RESTRICTED); (void) nice(NICE_VALUE); } else { throttling_delay = throttling_bandwidth_ul = throttling_bandwidth_dl = 0UL; } #endif #ifndef NON_ROOT_FTP if (authresult.uid > (uid_t) 0) { # ifndef WITHOUT_PRIVSEP if (setuid(authresult.uid) != 0 || seteuid(authresult.uid) != 0) { goto cantsec; } # else if (seteuid(authresult.uid) != 0) { goto cantsec; } # ifdef USE_CAPABILITIES drop_login_caps(); # endif # endif } #endif #ifndef MINIMAL dobanner(0); #endif if (broken_client_compat != 0) { addreply_noformat(331, MSG_ANONYMOUS_ANY_PASSWORD); } else { addreply_noformat(230, MSG_ANONYMOUS_LOGGED); } dot_write_ok = 0; dot_read_ok = dot_read_anon_ok; strncpy(account, "ftp", sizeof account - (size_t) 1U); account[(sizeof account) - 1U] = 0; #ifdef FTPWHO if (shm_data_cur != NULL) { ftpwho_lock(); strncpy(shm_data_cur->account, account, sizeof shm_data_cur->account - (size_t) 1U); shm_data_cur->account[sizeof shm_data_cur->account - 1U] = 0; ftpwho_unlock(); state_needs_update = 1; } #endif loggedin = guest = 1; #ifdef QUOTAS user_quota_size = user_quota_files = ULONG_LONG_MAX; #endif } if (getcwd(wd, sizeof wd - (size_t) 1U) == NULL) { wd[0] = '/'; wd[1] = 0; } #ifdef WITH_BONJOUR refreshManager(); #endif } static AuthResult pw_check(const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer) { Authentications *auth_scan = first_authentications; AuthResult result; result.auth_ok = -1; while (auth_scan != NULL) { #ifdef THROTTLING result.throttling_bandwidth_ul = throttling_bandwidth_ul; result.throttling_bandwidth_dl = throttling_bandwidth_dl; result.throttling_ul_changed = result.throttling_dl_changed = 0; #endif #ifdef QUOTAS result.user_quota_size = user_quota_size; result.user_quota_files = user_quota_files; result.quota_size_changed = result.quota_files_changed = 0; #endif #ifdef RATIOS result.ratio_upload = ratio_upload; result.ratio_download = ratio_download; result.ratio_ul_changed = result.ratio_dl_changed = 0; #endif #ifdef PER_USER_LIMITS result.per_user_max = per_user_max; #endif result.backend_data = NULL; auth_scan->auth->check(&result, account, password, sa, peer); if (result.auth_ok < 0) { break; } else if (result.auth_ok > 0) { #ifdef THROTTLING if ((result.throttling_ul_changed | result.throttling_dl_changed) != 0) { if (result.throttling_ul_changed != 0 && result.throttling_bandwidth_ul > 0UL) { throttling_bandwidth_ul = result.throttling_bandwidth_ul; } if (result.throttling_dl_changed != 0 && result.throttling_bandwidth_dl > 0UL) { throttling_bandwidth_dl = result.throttling_bandwidth_dl; } throttling_delay = 1000000 / (throttling_bandwidth_dl | throttling_bandwidth_ul); throttling = 2; } #endif #ifdef QUOTAS if (result.quota_size_changed != 0) { user_quota_size = result.user_quota_size; } if (result.quota_files_changed != 0) { user_quota_files = result.user_quota_files; } #endif #ifdef RATIOS if (result.ratio_ul_changed != 0) { ratio_upload = result.ratio_upload; ratio_for_non_anon = 1; } if (result.ratio_dl_changed != 0) { ratio_download = result.ratio_download; } #endif #ifdef PER_USER_LIMITS per_user_max = result.per_user_max; #endif #ifdef NON_ROOT_FTP result.uid = geteuid(); result.gid = getegid(); #endif return result; } auth_scan = auth_scan->next; } return result; } /* * Check if an user belongs to the trusted group, either in his * primary group, or his supplementary groups. Root is always trusted. */ static int check_trustedgroup(const uid_t uid, const gid_t gid) { GETGROUPS_T *alloca_suppgroups; int n; int n2; int result = 0; if (uid == (uid_t) 0) { return 1; } if (userchroot == 2) { return 0; } if (gid == chroot_trustedgid) { return 1; } #ifdef HAVE_GETGROUPS if ((n = getgroups(0, NULL)) <= 0) { return 0; } if ((alloca_suppgroups = ALLOCA(n * (sizeof *alloca_suppgroups))) == NULL) { die_mem(); } n2 = getgroups(n, alloca_suppgroups); /* Jedi's paranoia */ if (n2 < n) { n = n2; } result = 0; while (n != 0) { n--; if (alloca_suppgroups[n] == (GETGROUPS_T) chroot_trustedgid) { result = 1; break; } }; ALLOCA_FREE(alloca_suppgroups); #endif return result; } /* * Create a home directory on demand. */ static int create_home_and_chdir(const char * const home) { char *pathcomp; char *z; size_t len; const char delim = '/'; if (home == NULL || *home != '/') { return -1; } if (chdir(home) == 0) { return 0; } if (create_home == 0) { return -1; } len = strlen(home) + (size_t) 1U; if (len < (size_t) 2U || *home != delim) { return -1; } if ((pathcomp = ALLOCA(len)) == NULL) { return -1; } memcpy(pathcomp, home, len); /* safe, no possible overflow */ z = pathcomp; for (;;) { z++; if (*z == 0) { break; } if (*z == delim) { *z = 0; if (z[1] == 0) { break; } (void) mkdir(pathcomp, (mode_t) 0755); *z = delim; } } ALLOCA_FREE(pathcomp); (void) mkdir(home, (mode_t) 0700); if (chdir(home) != 0) { return -1; } if (chmod(home, (mode_t) 0777 & ~u_mask_d) < 0 || chown(home, authresult.uid, authresult.gid) < 0) { return -1; } return chdir(home); } static void randomsleep(unsigned int t) { usleep2((unsigned long) (zrand() % PASSWD_FAILURE_DELAY)); usleep2(t * PASSWD_FAILURE_DELAY); } void dopass(char *password) { static unsigned int tapping; char *hd; #if !defined(MINIMAL) && defined(HAVE_GETGROUPS) && defined(DISPLAY_GROUPS) gid_t *groups = NULL; int ngroups; # if defined(NGROUPS_MAX) && NGROUPS_MAX > 0 int ngroups_max = NGROUPS_MAX; /* Use the compile time value */ # else int ngroups_max = 1; /* use a sane default */ # endif #endif if (loggedin != 0) { if (guest != 0) { addreply_noformat(230, MSG_NO_PASSWORD_NEEDED); #ifdef LOG_ANON_EMAIL snprintf(account, sizeof account, "ftp: <%s> ", password); #endif } else { addreply_noformat(530, MSG_CANT_DO_TWICE); } return; } if (*account == 0) { addreply_noformat(530, MSG_WHOAREYOU); return; } if (strlen(password) >= MAX_PASSWORD_LEN) { addreply_noformat(530, MSG_LINE_TOO_LONG); return; } authresult = pw_check(account, password, &ctrlconn, &peer); pure_memzero(password, strlen(password)); if (authresult.auth_ok != 1) { tapping++; randomsleep(tapping); addreply_noformat(530, MSG_AUTH_FAILED); doreply(); if (tapping > MAX_PASSWD_TRIES) { logfile(LOG_ERR, MSG_AUTH_TOOMANY); _EXIT(EXIT_FAILURE); } logfile(LOG_WARNING, MSG_AUTH_FAILED_LOG, account); return; } if (authresult.uid < useruid) { logfile(LOG_WARNING, MSG_ACCOUNT_DISABLED " (uid < %lu)", account, (unsigned long) useruid); randomsleep(tapping); if (tapping >= MAX_PASSWD_TRIES) { addreply_noformat(530, MSG_AUTH_FAILED); doreply(); _EXIT(EXIT_FAILURE); } addreply_noformat(530, MSG_NOTRUST); doreply(); return; } #ifdef PER_USER_LIMITS if (per_user_max > 0U && ftpwho_read_count(account) >= per_user_max) { addreply(421, MSG_PERUSER_MAX, (unsigned long) per_user_max); doreply(); _EXIT(1); } #endif /* Add username and primary group to the uid/gid cache */ (void) getname(authresult.uid); (void) getgroup(authresult.gid); if ( #if defined(WITH_LDAP) || defined(WITH_MYSQL) || defined(WITH_PGSQL) || defined(WITH_PUREDB) || defined(WITH_EXTAUTH) doinitsupgroups(NULL, authresult.uid, authresult.gid) != 0 #else doinitsupgroups(account, (uid_t) -1, authresult.gid) != 0 #endif ) { #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) (void) 0; #else die(421, LOG_WARNING, MSG_NOTRUST); #endif } /* handle /home/user/./public_html form */ if ((root_directory = strdup(authresult.dir)) == NULL) { die_mem(); } hd = strstr(root_directory, "/./"); if (hd != NULL) { if (chrooted != 0) { die(421, LOG_DEBUG, MSG_CANT_DO_TWICE); } if (create_home_and_chdir(root_directory)) { die(421, LOG_ERR, MSG_NO_HOMEDIR); } *++hd = 0; hd++; if (chroot(root_directory) || chdir(hd)) { die(421, LOG_ERR, MSG_NO_HOMEDIR); } chrooted = 1; #ifdef RATIOS if (ratio_for_non_anon == 0) { ratio_upload = ratio_download = 0U; } if (check_trustedgroup(authresult.uid, authresult.gid) != 0) { dot_write_ok = dot_read_ok = 1; ratio_upload = ratio_download = 0U; keepallfiles = 0; } #endif } else { (void) free(root_directory); root_directory = (char *) "/"; if (create_home_and_chdir(authresult.dir)) { die(421, LOG_ERR, MSG_NO_HOMEDIR); } } if (getcwd(wd, sizeof wd - (size_t) 1U) == NULL) { wd[0] = '/'; wd[1] = 0; } #ifndef NON_ROOT_FTP if (setgid(authresult.gid) || setegid(authresult.gid)) { _EXIT(EXIT_FAILURE); } #endif if (check_trustedgroup(authresult.uid, authresult.gid) != 0) { userchroot = 0; dot_write_ok = dot_read_ok = 1; keepallfiles = 0; #ifdef RATIOS ratio_upload = ratio_download = 0U; #endif #ifdef QUOTAS user_quota_files = user_quota_size = ULONG_LONG_MAX; #endif } #ifdef QUOTAS if (hasquota() == 0) { userchroot = 1; } #endif if (loggedin == 0) { candownload = 1; /* real users can always download */ } #ifdef THROTTLING if ((throttling == 2) || (guest != 0 && throttling == 1)) { addreply_noformat(0, MSG_BANDWIDTH_RESTRICTED); (void) nice(NICE_VALUE); } else { throttling_delay = throttling_bandwidth_dl = throttling_bandwidth_ul = 0UL; } #endif #if !defined(MINIMAL) && defined(HAVE_GETGROUPS) && defined(DISPLAY_GROUPS) # ifdef SAFE_GETGROUPS_0 ngroups = getgroups(0, NULL); if (ngroups > ngroups_max) { ngroups_max = ngroups; } # elif defined(_SC_NGROUPS_MAX) /* get the run time value */ ngroups = (int) sysconf(_SC_NGROUPS_MAX); if (ngroups > ngroups_max) { ngroups_max = ngroups; } # endif if ((groups = malloc(sizeof(GETGROUPS_T) * ngroups_max)) == NULL) { die_mem(); } ngroups = getgroups(ngroups_max, groups); if (guest == 0 && ngroups > 0) { char reply[80 + MAX_USER_LENGTH]; const char *q; size_t p; if (SNCHECK(snprintf(reply, sizeof reply, MSG_USER_GROUP_ACCESS ": ", account), sizeof reply)) { _EXIT(EXIT_FAILURE); } p = strlen(reply); do { ngroups--; if ((ngroups != 0 && groups[ngroups] == groups[0]) || (q = getgroup(groups[ngroups])) == NULL) { continue; } if (p + strlen(q) > 75) { reply[p] = 0; addreply(0, "%s", reply); *reply = 0; p = (size_t) 0U; } reply[p++] = ' '; while (*q != 0 && p < sizeof reply - (size_t) 1U) { reply[p++] = *q++; } } while (ngroups > 0); reply[p] = 0; addreply(0, "%s", reply); } free(groups); #endif if (guest == 0 && allowfxp == 1) { addreply_noformat(0, MSG_FXP_SUPPORT); } #ifdef RATIOS if (ratio_for_non_anon != 0 && ratio_upload > 0) { addreply(0, MSG_RATIO, ratio_upload, ratio_download); } #endif if (userchroot != 0 && chrooted == 0) { if (chdir(wd) || chroot(wd)) { /* should never fail */ die(421, LOG_ERR, MSG_CHROOT_FAILED); } chrooted = 1; #ifdef RATIOS if (ratio_for_non_anon == 0) { ratio_upload = ratio_download = 0U; } #endif { const size_t rd_len = strlen(wd) + sizeof "/"; if ((root_directory = malloc(rd_len)) == NULL) { die_mem(); } snprintf(root_directory, rd_len, "%s/", wd); } wd[0] = '/'; wd[1] = 0; if (chdir(wd)) { _EXIT(EXIT_FAILURE); } addreply(230, MSG_CURRENT_RESTRICTED_DIR_IS, wd); } else { addreply(230, MSG_CURRENT_DIR_IS, wd); } #ifndef NON_ROOT_FTP disablesignals(); # ifndef WITHOUT_PRIVSEP if (setuid(authresult.uid) != 0 || seteuid(authresult.uid) != 0) { _EXIT(EXIT_FAILURE); } # else if (seteuid(authresult.uid) != 0) { _EXIT(EXIT_FAILURE); } # ifdef USE_CAPABILITIES drop_login_caps(); # endif # endif enablesignals(); #endif logfile(LOG_INFO, MSG_IS_NOW_LOGGED_IN, account); #ifdef FTPWHO if (shm_data_cur != NULL) { ftpwho_lock(); strncpy(shm_data_cur->account, account, sizeof shm_data_cur->account - (size_t) 1U); shm_data_cur->account[sizeof shm_data_cur->account - 1U] = 0; ftpwho_unlock(); state_needs_update = 1; } #endif loggedin = 1; if (getcwd(wd, sizeof wd - (size_t) 1U) == NULL) { wd[0] = '/'; wd[1] = 0; } #ifndef MINIMAL dobanner(0); #endif #ifdef QUOTAS displayquota(NULL); #endif #ifdef WITH_BONJOUR refreshManager(); #endif } void docwd(const char *dir) { const char *where; char buffer[PATH_MAX + 256U]; if (loggedin == 0) { goto kaboom; } /* * secure and conformant tilde expansion routine. Need to be packaged in * a function so that it can be called in other commands and avoid * duplicate code in ls.c -frank. */ where = dir; if (dir == NULL || *dir == 0) { dir = "~"; } if (*dir == '~') { const struct passwd *pw; if (dir[1] == 0) { /* cd ~ */ strncpy(buffer, chrooted != 0 ? "/" : authresult.dir, sizeof buffer); buffer[sizeof buffer - (size_t) 1U] = 0; where = buffer; } else { /* cd ~user or cd ~user/ */ char *bufpnt = buffer; size_t s = sizeof buffer; const char *dirscan = dir + 1; while (*dirscan != 0 && *dirscan != '/') { if (--s <= 0) { goto kaboom; /* script kiddy's playing */ } *bufpnt++ = *dirscan++; } *bufpnt = 0; if (*buffer == 0) { /* ~/... */ snprintf(buffer, sizeof buffer, "%s%s", chrooted != 0 ? "/" : authresult.dir, dirscan); where = buffer; } else if (authresult.slow_tilde_expansion == 0) { if (chrooted != 0 || guest != 0 || (pw = getpwnam(buffer)) == NULL || pw->pw_dir == NULL) { /* try with old where = dir */ } else { snprintf(buffer, sizeof buffer, "%s%s", pw->pw_dir, dirscan); where = buffer; } } } } if (checknamesanity(where, dot_read_ok) != 0) { addreply(553, MSG_SANITY_FILE_FAILURE, where); return; } if (chdir(where) != 0) { #ifdef WITH_DIRALIASES const int real_errno = errno; const char *where_alias; if ((where_alias = lookup_alias(where)) == NULL || chdir(where_alias) != 0) { errno = real_errno; } else { goto chdir_success; } #endif if (SNCHECK(snprintf(buffer, sizeof buffer, MSG_CANT_CHANGE_DIR ": %s", dir, strerror(errno)), sizeof buffer)) { _EXIT(EXIT_FAILURE); } logfile(LOG_INFO, "%s", buffer); addreply(550, "%s", buffer); #ifndef MINIMAL # ifndef NO_DIRSCAN_DELAY if (cwd_failures >= MAX_DIRSCAN_TRIES) { _EXIT(EXIT_FAILURE); } usleep2(cwd_failures * DIRSCAN_FAILURE_DELAY); cwd_failures++; # endif #endif return; } #ifdef WITH_DIRALIASES chdir_success: #endif #ifndef MINIMAL cwd_failures = 0UL; dobanner(1); #endif if (getcwd(wd, sizeof wd - (size_t) 1U) == NULL) { if (*dir == '/') { if (SNCHECK(snprintf(wd, sizeof wd, "%s", dir), sizeof wd)) { /* already checked */ _EXIT(EXIT_FAILURE); } } else { const size_t dir_len = strlen(dir); const size_t wd_len = strlen(wd); if (sizeof wd < dir_len + sizeof "/" - 1U + wd_len + 1U) { kaboom: die(421, LOG_ERR, MSG_PATH_TOO_LONG); } strcat(strcat(wd, "/"), dir); /* safe, see above */ } } addreply(250, MSG_CURRENT_DIR_IS, wd); } unsigned int zrand(void) { return (unsigned int) alt_arc4random(); } static void keepalive(const int fd, int keep) { #ifdef SO_KEEPALIVE { setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, (char *) &keep, sizeof keep); } #endif } /* psvtype = 0: PASV */ /* psvtype = 1: EPSV */ /* psvtype = 2: SPSV */ void dopasv(int psvtype) { struct sockaddr_storage dataconn; /* my data connection endpoint */ unsigned long a = 0U; unsigned int p; int on; unsigned int firstporttried; if (loggedin == 0) { addreply_noformat(530, MSG_NOT_LOGGED_IN); return; } if (datafd != -1) { /* for buggy clients */ (void) close(datafd); datafd = -1; } fourinsix(&ctrlconn); if (STORAGE_FAMILY(ctrlconn) == AF_INET6 && psvtype == 0) { addreply_noformat(425, MSG_CANT_PASV); return; } firstporttried = firstport + zrand() % (lastport - firstport + 1); p = firstporttried; datafd = socket(STORAGE_FAMILY(ctrlconn), SOCK_STREAM, IPPROTO_TCP); if (datafd == -1) { error(425, MSG_CANT_PASSIVE); return; } on = 1; if (setsockopt(datafd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof on) < 0) { error(421, "setsockopt"); return; } dataconn = ctrlconn; for (;;) { if (STORAGE_FAMILY(dataconn) == AF_INET6) { STORAGE_PORT6(dataconn) = htons(p); } else { STORAGE_PORT(dataconn) = htons(p); } if (bind(datafd, (struct sockaddr *) &dataconn, STORAGE_LEN(dataconn)) == 0) { break; } p--; if (p < firstport) { p = lastport; } if (p == firstporttried) { (void) close(datafd); datafd = -1; addreply_noformat(425, MSG_PORTS_BUSY); return; } } alarm(idletime); if (listen(datafd, DEFAULT_BACKLOG_DATA) < 0) { (void) close(datafd); datafd = -1; error(425, MSG_GETSOCKNAME_DATA); return; } switch (psvtype) { case 0: if (STORAGE_FAMILY(force_passive_ip) == 0) { a = ntohl(STORAGE_SIN_ADDR_CONST(dataconn)); } else if (STORAGE_FAMILY(force_passive_ip) == AF_INET6) { (void) close(datafd); datafd = -1; addreply_noformat(425, MSG_NO_EPSV); return; } else if (STORAGE_FAMILY(force_passive_ip) == AF_INET) { a = ntohl(STORAGE_SIN_ADDR_CONST(force_passive_ip)); } else { _EXIT(EXIT_FAILURE); } /* According to RFC, any message can follow 227. But broken NAT gateways * and connection tracking code rely on this. So don't translate the following * messages */ addreply(227, "Entering Passive Mode (%lu,%lu,%lu,%lu,%u,%u)", (a >> 24) & 255UL, (a >> 16) & 255UL, (a >> 8) & 255UL, a & 255UL, (p >> 8) & 255, p & 255); break; case 1: addreply(229, "Extended Passive mode OK (|||%u|)", p); break; case 2: addreply(227, "%u", p); break; default: _EXIT(EXIT_FAILURE); } passive = 1; } void doport(const char *arg) { unsigned int a1, a2, a3, a4, p1, p2; struct sockaddr_storage a; if (sscanf(arg, "%u,%u,%u,%u,%u,%u", &a1, &a2, &a3, &a4, &p1, &p2) != 6 || a1 > 255 || a2 > 255 || a3 > 255 || a4 > 255 || p1 > 255 || p2 > 255 || (a1|a2|a3|a4) == 0 || (p1 | p2) == 0) { addreply_noformat(501, MSG_SYNTAX_ERROR_IP); return; } memset(&a, 0, sizeof a); STORAGE_FAMILY(a) = AF_INET; STORAGE_SIN_ADDR(a) = htonl(((uint32_t) a1 << 24) | ((uint32_t) a2 << 16) | (a3 << 8) | a4); SET_STORAGE_LEN(a, sizeof(struct sockaddr_in)); doport2(a, (p1 << 8) | p2); } #ifdef WITHOUT_PRIVSEP static int doport3(const int protocol) { struct sockaddr_storage dataconn; /* his endpoint */ # ifndef NON_ROOT_FTP static const in_port_t portlist[] = FTP_ACTIVE_SOURCE_PORTS; const in_port_t *portlistpnt = portlist; # else static const in_port_t portlist[] = { 0U }; const in_port_t *portlistpnt = portlist; # endif int on; # ifndef NON_ROOT_FTP disablesignals(); seteuid((uid_t) 0); # endif if ((datafd = socket(protocol, SOCK_STREAM, IPPROTO_TCP)) == -1) { data_socket_error: # ifndef NON_ROOT_FTP if (seteuid(authresult.uid) != 0) { _EXIT(EXIT_FAILURE); } enablesignals(); # endif (void) close(datafd); datafd = -1; error(425, MSG_CANT_CREATE_DATA_SOCKET); return -1; } on = 1; # ifdef SO_REUSEPORT (void) setsockopt(datafd, SOL_SOCKET, SO_REUSEPORT, (char *) &on, sizeof on); # else (void) setsockopt(datafd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof on); # endif memcpy(&dataconn, &ctrlconn, sizeof dataconn); for (;;) { if (STORAGE_FAMILY(dataconn) == AF_INET6) { STORAGE_PORT6(dataconn) = htons(*portlistpnt); } else { STORAGE_PORT(dataconn) = htons(*portlistpnt); } if (bind(datafd, (struct sockaddr *) &dataconn, STORAGE_LEN(dataconn)) == 0) { break; } # ifdef USE_ONLY_FIXED_DATA_PORT (void) sleep(1U); # else if (*portlistpnt == (in_port_t) 0U) { goto data_socket_error; } portlistpnt++; # endif } # ifndef NON_ROOT_FTP if (seteuid(authresult.uid) != 0) { _EXIT(EXIT_FAILURE); } enablesignals(); # endif return 0; } #else /* Privilege-separated version of doport3() */ static int doport3(const int protocol) { if ((datafd = privsep_bindresport(protocol, ctrlconn)) == -1) { error(425, MSG_CANT_CREATE_DATA_SOCKET); return -1; } return 0; } #endif void doport2(struct sockaddr_storage a, unsigned int p) { if (loggedin == 0) { addreply_noformat(530, MSG_NOT_LOGGED_IN); return; } if (epsv_all != 0) { addreply_noformat(501, MSG_ACTIVE_DISABLED); return; } if (datafd != -1) { /* for buggy clients saying PORT over and over */ (void) close(datafd); datafd = -1; } if (p < 1024U) { addreply_noformat(501, MSG_BAD_PORT); return; } if (doport3(STORAGE_FAMILY(a) == AF_INET6 ? PF_INET6 : PF_INET) != 0) { return; } peerdataport = (in_port_t) p; if (addrcmp(&a, &peer) != 0) { char hbuf[NI_MAXHOST]; char peerbuf[NI_MAXHOST]; if (getnameinfo((struct sockaddr *) &a, STORAGE_LEN(a), hbuf, sizeof hbuf, NULL, (size_t) 0U, NI_NUMERICHOST) != 0 || getnameinfo((struct sockaddr *) &peer, STORAGE_LEN(peer), peerbuf, sizeof peerbuf, NULL, (size_t) 0U, NI_NUMERICHOST) != 0) { goto hu; } if (allowfxp == 0 || (allowfxp == 1 && guest != 0)) { hu: (void) close(datafd); datafd = -1; addreply(500, MSG_NO_FXP, hbuf, peerbuf); return; } else { addreply(0, MSG_FXP, peerbuf, hbuf); memcpy(&peer, &a, sizeof a); } } passive = 0; addreply_noformat(200, MSG_PORT_SUCCESSFUL); return; } void closedata(void) { volatile int tmp_xferfd = xferfd; /* do not simplify this... */ #ifdef WITH_TLS tls_close_session(&tls_data_cnx); tls_data_cnx = NULL; #endif xferfd = -1; /* ...it avoids a race */ (void) close(tmp_xferfd); } void opendata(void) { struct sockaddr_storage dataconn; /* his data connection endpoint */ int fd; socklen_t socksize; if (xferfd != -1) { closedata(); } if (datafd == -1) { addreply_noformat(425, MSG_NO_DATA_CONN); return; } if (passive != 0) { struct pollfd pfds[2]; struct pollfd *pfd; int pollret; pfd = &pfds[0]; pfd->fd = clientfd; pfd->events = POLLERR | POLLHUP; pfd->revents = 0; pfd = &pfds[1]; pfd->fd = datafd; pfd->events = POLLIN | POLLERR | POLLHUP; pfd->revents = 0; alarm(idletime); for (;;) { pfds[0].revents = pfds[1].revents = 0; pollret = poll(pfds, sizeof pfds / sizeof pfds[0], idletime * 1000UL); if (pollret <= 0) { die(421, LOG_INFO, MSG_TIMEOUT_DATA, (unsigned long) idletime); } if ((pfds[0].revents & (POLLERR | POLLHUP | POLLNVAL)) != 0 || (pfds[1].revents & (POLLERR | POLLHUP | POLLNVAL)) != 0) { die(221, LOG_INFO, MSG_LOGOUT); } if ((pfds[1].revents & POLLIN) == 0) { continue; } socksize = (socklen_t) sizeof(dataconn); memset(&dataconn, 0, sizeof dataconn); if ((fd = accept(datafd, (struct sockaddr *) &dataconn, &socksize)) == -1) { nope: (void) close(datafd); datafd = -1; error(421, MSG_ACCEPT_FAILED); return; } if (STORAGE_FAMILY(dataconn) != AF_INET && STORAGE_FAMILY(dataconn) != AF_INET6) { (void) close(fd); goto nope; } fourinsix(&dataconn); if (addrcmp(&peer, &dataconn) == 0) { break; } if (allowfxp == 0 || (allowfxp == 1 && guest != 0)) { shutdown(fd, 2); (void) close(fd); } else { break; } } addreply_noformat(150, MSG_ACCEPT_SUCCESS); } else { struct sockaddr_storage peer2; unsigned long tries = 1UL + idletime / 2UL; peer2 = peer; if (STORAGE_FAMILY(peer) == AF_INET6) { STORAGE_PORT6(peer2) = htons(peerdataport); } else { STORAGE_PORT(peer2) = htons(peerdataport); } again: if (connect(datafd, (struct sockaddr *) &peer2, STORAGE_LEN(peer2)) != 0) { if ((errno == EAGAIN || errno == EINTR #ifdef EADDRINUSE || errno == EADDRINUSE #endif ) && tries > 0UL) { tries--; usleep2(1000000UL); goto again; } addreply(425, MSG_CNX_PORT_FAILED ": %s", peerdataport, strerror(errno)); (void) close(datafd); datafd = -1; return; } fd = datafd; datafd = -1; addreply(150, MSG_CNX_PORT, peerdataport); } { int fodder; #ifdef IPTOS_THROUGHPUT fodder = IPTOS_THROUGHPUT; setsockopt(fd, SOL_IP, IP_TOS, (char *) &fodder, sizeof fodder); #endif #ifndef NO_KEEPALIVE keepalive(fd, 1); #endif } xferfd = fd; alarm(MAX_SESSION_XFER_IDLE); } #ifndef MINIMAL void dochmod(char *name, mode_t mode) { static dev_t root_st_dev; static ino_t root_st_ino; struct stat st2; int fd = -1; if (nochmod != 0 && authresult.uid != (uid_t) 0) { addreply(550, MSG_CHMOD_FAILED, name); return; } # ifndef ANON_CAN_CHANGE_PERMS if (guest != 0) { addreply_noformat(550, MSG_ANON_CANT_CHANGE_PERMS); return; } # endif if (name == NULL || *name == 0) { addreply_noformat(501, MSG_NO_FILE_NAME); return; } if (checknamesanity(name, dot_write_ok) != 0) { addreply(553, MSG_SANITY_FILE_FAILURE, name); return; } fd = open(name, O_RDONLY); if (fd == -1) { goto failure; } if ((root_st_dev | root_st_ino) == 0) { struct stat st; if (stat("/", &st) != 0) { goto failure; } root_st_dev = st.st_dev; root_st_ino = st.st_ino; } if (fstat(fd, &st2) != 0) { goto failure; } # ifdef QUOTAS if (hasquota() == 0 && S_ISDIR(st2.st_mode)) { mode |= 0500; } # endif if (st2.st_ino == root_st_ino && st2.st_dev == root_st_dev) { mode |= 0700; } else if (be_customer_proof != 0) { mode |= (S_ISDIR(st2.st_mode) ? 0700 : 0600); } if (fchmod(fd, mode) < 0 && chmod(name, mode) < 0) { failure: if (fd != -1) { (void) close(fd); } addreply(550, MSG_CHMOD_FAILED ": %s", name, strerror(errno)); return; } (void) close(fd); addreply(200, MSG_CHMOD_SUCCESS, name); } void doutime(char *name, const char * const wanted_time) { struct tm tm; time_t ts; struct utimbuf tb; # ifndef ANON_CAN_CHANGE_UTIME if (guest != 0) { addreply_noformat(550, MSG_ANON_CANT_CHANGE_PERMS); return; } # endif if (name == NULL || *name == 0) { addreply_noformat(501, MSG_NO_FILE_NAME); return; } if (checknamesanity(name, dot_write_ok) != 0) { addreply(553, MSG_SANITY_FILE_FAILURE, name); return; } memset(&tm, 0, sizeof tm); sscanf(wanted_time, "%4d%2d%2d%2d%2d%2d", &tm.tm_year, &tm.tm_mon, &tm.tm_mday, &tm.tm_hour, &tm.tm_min, &tm.tm_sec); tm.tm_mon--; tm.tm_year -= 1900; # ifdef USE_LOCAL_TIME_FOR_SITE_UTIME ts = mktime(&tm); # else # ifdef HAVE_TIMEGM ts = timegm(&tm); # elif defined(HAVE_PUTENV) { putenv("TZ=UTC+00:00"); # ifdef HAVE_TZSET tzset(); # endif ts = mktime(&tm); putenv(default_tz_for_putenv); tzset(); } # else ts = mktime(&tm); # endif # endif if (tm.tm_mon < 0 || tm.tm_year <= 0 || ts == (time_t) -1) { addreply_noformat(501, MSG_TIMESTAMP_FAILURE); return; } tb.actime = tb.modtime = ts; if (utime(name, &tb) < 0) { addreply(550, "utime(%s): %s", name, strerror(errno)); } else { addreply_noformat(213, "UTIME OK"); } } #endif void dodele(char *name) { #ifndef ANON_CAN_DELETE if (guest != 0) { addreply_noformat(550, MSG_ANON_CANT_DELETE); return; } #endif if (name == NULL || *name == 0) { addreply_noformat(501, MSG_NO_FILE_NAME); return; } if (checknamesanity(name, dot_write_ok) != 0) { addreply(553, MSG_SANITY_FILE_FAILURE, name); return; } if (keepallfiles != 0) { #ifdef EPERM errno = EPERM; #else errno = 1; #endif goto denied; } /* * What we do here may look a bit strange. It's to defend against * change-after-stat attacks. If we simply do lstat(name), then unlink(name) * there's a race. An attacker can rename the file between these two * system calls, so that a big file is lstat()ed, but a dummy tiny file is * unlinked. That way, an attacker could easily get extra quota. * To defend against this attack, we rename the file to an unique dot-file * (an atomic operation) . People subject to quotas can't access dot-files. * So we can securely stat it and unlink it. Having the pid in the file * name should be enough to avoid that two concurrent sessions create the * same temporary file. But to be paranoid to the extreme, we add some * random number to that. */ #ifdef QUOTAS { char *p; struct stat st; struct stat st2; size_t dirlen = (size_t) 0U; char qtfile[PATH_MAX + 1]; if ((p = strrchr(name, '/')) != NULL) { if ((dirlen = p - name + (size_t) 1U) >= sizeof qtfile) { goto denied; /* should never happen */ } memcpy(qtfile, name, dirlen); /* safe, dirlen < sizeof qtfile */ } if (SNCHECK(snprintf(qtfile + dirlen, sizeof qtfile - dirlen, PUREFTPD_TMPFILE_PREFIX "rename.%lu.%x", (unsigned long) getpid(), zrand()), sizeof qtfile)) { goto denied; } if (lstat(name, &st) != 0) { goto denied; } if (!S_ISREG(st.st_mode) # ifndef NEVER_DELETE_SYMLINKS && !S_ISLNK(st.st_mode) # endif ) { # ifdef EINVAL errno = EINVAL; # endif goto denied; } if (rename(name, qtfile) != 0) { goto denied; } if (lstat(qtfile, &st2) != 0 || st.st_dev != st2.st_dev || st.st_ino != st2.st_ino || st.st_size != st2.st_size) { # ifdef EINVAL errno = EINVAL; # endif goto denied; } if (unlink(qtfile) < 0) { /* * Race if rename() goes to an existing file. * seems very difficult to exploit, though. * Does a perfect userland answer exist, after all? */ (void) rename(qtfile, name); goto denied; } { Quota quota; if (quota_update("a, -1LL, -((long long) st.st_size), NULL) == 0) { displayquota("a); } } } #else if (unlink(name) < 0) { goto denied; } #endif addreply(250, MSG_DELE_SUCCESS, "", "", "", name); logfile(LOG_NOTICE, MSG_DELE_SUCCESS, root_directory, *name == '/' ? "" : wd, (*name != '/' && (!*wd || wd[strlen(wd) - 1] != '/')) ? "/" : "", name); return; denied: addreply(550, MSG_DELE_FAILED ": %s", name, strerror(errno)); } static double get_usec_time(void) { struct timeval tv; struct timezone tz; if (gettimeofday(&tv, &tz) < 0) { return 0.0; } return (double) tv.tv_sec + ((double) tv.tv_usec) / 1000000.0; } static void displayrate(const char *word, off_t size, const double started, const char * const name, int up) { double ended; double t; double speed; char speedstring[64]; ended = get_usec_time(); t = ended - started; if (t > 0.0 && size > (off_t) 0) { speed = size / t; } else { speed = 0.0; } if (speed > 524288.0) { addreply(0, MSG_TRANSFER_RATE_M, t, speed / 1048576.0); } else if (speed > 512.0) { addreply(0, MSG_TRANSFER_RATE_K, t, speed / 1024.0); } else if (speed > 0.1) { addreply(0, MSG_TRANSFER_RATE_B, t, speed); } if (!SNCHECK(snprintf(speedstring, sizeof speedstring, " (%llu bytes, %.2fKB/sec)", (unsigned long long) size, speed / 1024.0), sizeof speedstring)) { logfile(LOG_NOTICE, "%s%s%s%s %s %s", root_directory, *name == '/' ? "" : wd, (*name != '/' && (!*wd || wd[strlen(wd) - 1] != '/')) ? "/" : "", name, word, speedstring); } /* Tons of #ifdef here, but it avoids a pointless call to realpath() */ #if defined(WITH_UPLOAD_SCRIPT) || defined(WITH_ALTLOG) if ( # ifdef WITH_ALTLOG altlog_format != ALTLOG_NONE # endif # if defined(WITH_UPLOAD_SCRIPT) && defined(WITH_ALTLOG) || # endif # if (defined(WITH_UPLOAD_SCRIPT)) (do_upload_script != 0 && up != 0) # endif ) { char *alloca_filename_real; const size_t sizeof_filename_real = PATH_MAX + VHOST_PREFIX_MAX_LEN; char *resolved_path; const size_t sizeof_resolved_path = PATH_MAX + 1U; if ((resolved_path = malloc(sizeof_resolved_path)) == NULL) { return; } resolved_path[sizeof_resolved_path - 1U] = 0; if (realpath(name, resolved_path) == NULL) { if (up != 0) { (void) unlink(name); } free(resolved_path); logfile(LOG_ERR, "realpath() failure : [%s] => [%s]", name, strerror(errno)); return; } if (resolved_path[sizeof_resolved_path - 1U] != 0) { for (;;) { *resolved_path++ = 0; } } if ((alloca_filename_real = ALLOCA(sizeof_filename_real)) == NULL) { free(resolved_path); return; } # ifdef WITH_VIRTUAL_CHROOT if (SNCHECK(snprintf(alloca_filename_real, sizeof_filename_real, "\001%s", resolved_path), sizeof_filename_real)) { goto rp_failure; } # else if (SNCHECK(snprintf(alloca_filename_real, sizeof_filename_real, "\001%s%s", root_directory, (*resolved_path == '/' ? resolved_path + 1 : resolved_path)), sizeof_filename_real)) { goto rp_failure; } # endif # ifdef WITH_ALTLOG (void) altlog_writexfer(up, alloca_filename_real + 1, size, t); # endif # if defined(WITH_UPLOAD_SCRIPT) if (do_upload_script != 0 && up != 0) { upload_pipe_push(account, alloca_filename_real); } # endif rp_failure: free(resolved_path); ALLOCA_FREE(alloca_filename_real); } #else (void) up; #endif } static void displayopenfailure(const char * const name) { char buffer[PATH_MAX + 42U]; const int e = errno; if (SNCHECK(snprintf(buffer, sizeof buffer, MSG_OPEN_FAILURE, name), sizeof buffer)) { _EXIT(EXIT_FAILURE); } errno = e; error(550, buffer); } static int dlhandler_throttle(DLHandler * const dlhandler, const off_t downloaded, const double ts_start, double *required_sleep) { double ts_now; double elapsed; off_t would_be_downloaded; double wanted_ts; off_t previous_chunk_size; if (dlhandler->bandwidth <= 0UL || downloaded <= (off_t) 0) { *required_sleep = 0.0; return 0; } if ((ts_now = get_usec_time()) <= 0.0) { ts_now = ts_start; } if (ts_start > ts_now) { ts_now = ts_start; } elapsed = ts_now - ts_start; would_be_downloaded = dlhandler->total_downloaded + dlhandler->chunk_size; if (dlhandler->bandwidth > 0UL) { wanted_ts = (double) would_be_downloaded / (double) dlhandler->bandwidth; } else { wanted_ts = elapsed; } *required_sleep = wanted_ts - elapsed; previous_chunk_size = dlhandler->chunk_size; if (dlhandler->total_downloaded <= dlhandler->chunk_size) { return 0; } if (*required_sleep < dlhandler->min_sleep) { dlhandler->chunk_size = (dlhandler->max_chunk_size + dlhandler->chunk_size) / 2; } else if (*required_sleep > dlhandler->max_sleep) { dlhandler->chunk_size = (dlhandler->min_chunk_size + dlhandler->chunk_size) / 2; } else { dlhandler->chunk_size = dlhandler->default_chunk_size; } if (dlhandler->chunk_size <= 0 || dlhandler->chunk_size > INT_MAX) { dlhandler->chunk_size = dlhandler->default_chunk_size; } if (previous_chunk_size != dlhandler->default_chunk_size) { would_be_downloaded = dlhandler->total_downloaded + dlhandler->chunk_size; if (dlhandler->bandwidth > 0UL) { wanted_ts = (double) would_be_downloaded / (double) dlhandler->bandwidth; } else { wanted_ts = elapsed; } *required_sleep = wanted_ts - elapsed; } return 0; } static int dlhandler_init(DLHandler * const dlhandler, const int clientfd, void * const tls_clientfd, const int xferfd, const char * const name, const int f, void * const tls_fd, const off_t restartat, const int ascii_mode, const unsigned long bandwidth) { struct stat st; struct pollfd *pfd; if (fstat(f, &st) < 0 || (S_ISLNK(st.st_mode) && stat(name, &st) < 0)) { error(451, MSG_STAT_FAILURE); return -1; } if (!S_ISREG(st.st_mode)) { addreply_noformat(550, MSG_NOT_REGULAR_FILE); return -1; } dlhandler->clientfd = clientfd; dlhandler->tls_clientfd = tls_clientfd; dlhandler->xferfd = xferfd; dlhandler->f = f; dlhandler->tls_fd = tls_fd; dlhandler->file_size = st.st_size; dlhandler->ascii_mode = ascii_mode; dlhandler->cur_pos = restartat; dlhandler->total_downloaded = (off_t) 0; dlhandler->min_sleep = 0.1; dlhandler->max_sleep = 5.0; dlhandler->bandwidth = bandwidth; pfd = &dlhandler->pfds_f_in; pfd->fd = clientfd; #ifdef __APPLE_CC__ pfd->events = POLLRDBAND | POLLPRI | POLLERR | POLLHUP; #else pfd->events = POLLIN | POLLPRI | POLLERR | POLLHUP; #endif pfd->revents = 0; if (restartat > (off_t) 0) { if (restartat == st.st_size) { addreply_noformat(226, MSG_NO_MORE_TO_DOWNLOAD); return -2; } else if (restartat > st.st_size) { addreply(554, MSG_REST_TOO_LARGE_FOR_FILE "\n" MSG_REST_RESET, (long long) restartat, (long long) st.st_size); return -1; } } if (fcntl(xferfd, F_SETFL, fcntl(xferfd, F_GETFL) | O_NONBLOCK) == -1) { error(451, "fcntl(F_SETFL, O_NONBLOCK)"); return -1; } return 0; } static int dlmap_init(DLHandler * const dlhandler, const int clientfd, void * const tls_clientfd, const int xferfd, const char * const name, const int f, void * const tls_fd, const off_t restartat, const int ascii_mode, const unsigned long bandwidth) { if (dlhandler_init(dlhandler, clientfd, tls_clientfd, xferfd, name, f, tls_fd, restartat, ascii_mode, bandwidth) != 0) { return -1; } dlhandler->min_chunk_size = DL_MIN_CHUNK_SIZE; if (ascii_mode > 0) { dlhandler->default_chunk_size = dlhandler->max_chunk_size = DL_DEFAULT_CHUNK_SIZE_ASCII; } else { dlhandler->max_chunk_size = DL_MAX_CHUNK_SIZE; if (bandwidth <= 0UL) { dlhandler->default_chunk_size = dlhandler->max_chunk_size; } else { dlhandler->default_chunk_size = DL_DEFAULT_CHUNK_SIZE; } } dlhandler->chunk_size = dlhandler->default_chunk_size; dlhandler->dlmap_size = (DL_DLMAP_SIZE + page_size - (size_t) 1U) & ~(page_size - (size_t) 1U); dlhandler->cur_pos = restartat; dlhandler->dlmap_pos = (off_t) 0; dlhandler->dlmap_fdpos = (off_t) -1; dlhandler->sizeof_map = (size_t) 0U; dlhandler->map_data = NULL; dlhandler->sizeof_map = dlhandler->dlmap_size; dlhandler->map = malloc(dlhandler->sizeof_map); if (dlhandler->map == NULL) { die_mem(); } return 0; } static int _dlmap_read(DLHandler * const dlhandler) { ssize_t readnb; if (dlhandler->dlmap_size > dlhandler->sizeof_map) { abort(); } if (dlhandler->dlmap_size <= (size_t) 0U) { return 0; } if (dlhandler->dlmap_pos != dlhandler->dlmap_fdpos) { do { if (lseek(dlhandler->f, dlhandler->dlmap_pos, SEEK_SET) == (off_t) -1) { dlhandler->dlmap_fdpos = (off_t) -1; return -1; } dlhandler->dlmap_fdpos = dlhandler->dlmap_pos; readnb = read(dlhandler->f, dlhandler->map, dlhandler->dlmap_size); } while (readnb == (ssize_t) -1 && errno == EINTR); } else { do { readnb = read(dlhandler->f, dlhandler->map, dlhandler->dlmap_size); } while (readnb == (ssize_t) -1 && errno == EINTR); } if (readnb <= (ssize_t) 0) { dlhandler->dlmap_fdpos = (off_t) -1; return -1; } if (readnb != (ssize_t) dlhandler->dlmap_size) { dlhandler->dlmap_fdpos = (off_t) -1; } else { dlhandler->dlmap_fdpos += (off_t) readnb; } return 0; } static int _dlmap_remap(DLHandler * const dlhandler) { size_t min_dlmap_size; off_t remaining; if (dlhandler->map_data != NULL) { if (dlhandler->cur_pos >= dlhandler->dlmap_pos && dlhandler->cur_pos + dlhandler->chunk_size <= dlhandler->dlmap_pos + (off_t) dlhandler->dlmap_size) { if (dlhandler->cur_pos < dlhandler->dlmap_pos || dlhandler->cur_pos - dlhandler->dlmap_pos > (off_t) dlhandler->dlmap_size) { addreply_noformat(451, "remap"); return -1; } dlhandler->map_data = dlhandler->map + dlhandler->cur_pos - dlhandler->dlmap_pos; return 0; } } if (dlhandler->file_size - dlhandler->cur_pos < dlhandler->chunk_size) { dlhandler->chunk_size = dlhandler->file_size - dlhandler->cur_pos; } if (dlhandler->chunk_size <= 0) { return 1; } dlhandler->dlmap_pos = dlhandler->cur_pos; min_dlmap_size = dlhandler->chunk_size; if (dlhandler->dlmap_size < min_dlmap_size) { dlhandler->dlmap_size = min_dlmap_size; } dlhandler->dlmap_size = (dlhandler->dlmap_size + page_size - (size_t) 1U) & ~(page_size - (size_t) 1U); if (dlhandler->dlmap_size < page_size) { dlhandler->dlmap_size = page_size; } remaining = dlhandler->file_size - dlhandler->dlmap_pos; if ((off_t) dlhandler->dlmap_size > remaining) { dlhandler->dlmap_size = (off_t) remaining; } if (_dlmap_read(dlhandler) != 0) { error(451, MSG_DATA_READ_FAILED); return -1; } dlhandler->map_data = dlhandler->map; return 0; } static int dl_dowrite(DLHandler * const dlhandler, const unsigned char *buf_, const size_t size_, off_t * const downloaded) { size_t size = size_; const unsigned char *buf = buf_; unsigned char *asciibuf = NULL; int ret = 0; if (size_ <= (size_t) 0U) { *downloaded = 0; return -1; } #ifndef WITHOUT_ASCII if (dlhandler->ascii_mode > 0) { unsigned char *asciibufpnt; size_t z = (size_t) 0U; if (size > (size_t) dlhandler->chunk_size || (asciibuf = ALLOCA((size_t) dlhandler->chunk_size * 2U)) == NULL) { return -1; } asciibufpnt = asciibuf; do { if (buf_[z] == (unsigned char) '\n') { *asciibufpnt++ = (unsigned char) '\r'; } *asciibufpnt++ = buf_[z]; z++; } while (z < size); buf = asciibuf; size = (size_t) (asciibufpnt - asciibuf); } #endif ret = safe_nonblock_write(dlhandler->xferfd, dlhandler->tls_fd, buf, size); if (asciibuf != NULL) { ALLOCA_FREE(asciibuf); } if (ret < 0) { *downloaded = 0; } else { *downloaded = size; } return ret; } static int dlhandler_handle_commands(DLHandler * const dlhandler, const double required_sleep) { int pollret; char buf[100]; char *bufpnt; ssize_t readnb; repoll: dlhandler->pfds_f_in.revents = 0; pollret = poll(&dlhandler->pfds_f_in, 1U, required_sleep <= 0.0 ? 0 : (int) (required_sleep * 1000.0)); if (pollret <= 0) { return pollret; } if ((dlhandler->pfds_f_in.revents & (POLLIN | POLLPRI)) != 0) { if (dlhandler->tls_clientfd != NULL) { #ifdef WITH_TLS readnb = SSL_read(dlhandler->tls_clientfd, buf, sizeof buf - (size_t) 1U); #else abort(); #endif } else { readnb = read(dlhandler->clientfd, buf, sizeof buf - (size_t) 1U); } if (readnb == (ssize_t) 0) { return -2; } if (readnb < (ssize_t) 0) { if (errno == EAGAIN || errno == EINTR) { return 0; } return -1; } buf[readnb] = 0; bufpnt = skip_telnet_controls(buf); if (strchr(bufpnt, '\n') != NULL) { if (strncasecmp(bufpnt, "ABOR", sizeof "ABOR" - 1U) != 0 && strncasecmp(bufpnt, "QUIT", sizeof "QUIT" - 1U) != 0) { addreply_noformat(500, MSG_UNKNOWN_COMMAND); doreply(); } else { addreply_noformat(426, "ABORT"); doreply(); addreply_noformat(226, MSG_ABORTED); return 1; } } if (required_sleep > 0.0) { goto repoll; } } else if ((dlhandler->pfds_f_in.revents & (POLLERR | POLLHUP | POLLNVAL)) != 0) { addreply_noformat(451, MSG_DATA_READ_FAILED); return 1; } return 0; } static int dlmap_send(DLHandler * const dlhandler) { int ret; double ts_start = 0.0; double required_sleep; off_t downloaded; if (dlhandler->bandwidth > 0UL && (ts_start = get_usec_time()) <= 0.0) { error(451, "gettimeofday()"); return -1; } required_sleep = 0.0; for (;;) { ret = _dlmap_remap(dlhandler); if (ret < 0) { return -1; } if (ret == 1) { break; } if (dl_dowrite(dlhandler, dlhandler->map_data, dlhandler->chunk_size, &downloaded) != 0) { return -1; } dlhandler->cur_pos += dlhandler->chunk_size; #ifdef FTPWHO if (shm_data_cur != NULL) { shm_data_cur->download_current_size = dlhandler->cur_pos; } #endif dlhandler->total_downloaded += downloaded; required_sleep = 0.0; if (dlhandler->bandwidth > 0UL) { dlhandler_throttle(dlhandler, downloaded, ts_start, &required_sleep); } ret = dlhandler_handle_commands(dlhandler, required_sleep); if (ret != 0) { return ret; } } return 0; } static int dlmap_exit(DLHandler * const dlhandler) { if (dlhandler->map != NULL) { free(dlhandler->map); dlhandler->map = NULL; dlhandler->sizeof_map = (size_t) 0U; dlhandler->dlmap_size = (size_t) 0U; } return 0; } void doretr(char *name) { DLHandler dlhandler; int f; struct stat st; double started = 0.0; int ret; dlhandler.total_downloaded = 0; if (!candownload) { addreply(550, MSG_LOAD_TOO_HIGH, load); goto end; } if (type < 1 || (type == 1 && restartat > (off_t) 1)) { addreply_noformat(503, MSG_NO_ASCII_RESUME); goto end; } if (checknamesanity(name, dot_read_ok) != 0) { addreply(553, MSG_SANITY_FILE_FAILURE, name); goto end; } if ((f = open(name, O_RDONLY)) == -1) { displayopenfailure(name); goto end; } if (fstat(f, &st) < 0) { stat_failure: (void) close(f); error(451, MSG_STAT_FAILURE); goto end; } if (S_ISLNK(st.st_mode)) { if (stat(name, &st) < 0) { goto stat_failure; } } if (restartat > st.st_size) { (void) close(f); addreply(554, MSG_REST_TOO_LARGE_FOR_FILE "\n" MSG_REST_RESET, (long long) restartat, (long long) st.st_size); goto end; } if (!S_ISREG(st.st_mode) || ((off_t) st.st_size != st.st_size)) { (void) close(f); addreply_noformat(550, MSG_NOT_REGULAR_FILE); goto end; } if (warez != 0 && st.st_uid == warez && guest != 0) { (void) close(f); addreply(550, MSG_NOT_MODERATED); goto end; } #ifdef RATIOS if (ratio_upload > 0U && ratio_download > 0U) { if ((downloaded + st.st_size - restartat) / ratio_download > (uploaded / ratio_upload)) { (void) close(f); addreply(550, MSG_RATIO_DENIAL, ratio_upload, ratio_download, (unsigned long long) uploaded / 1024ULL, (unsigned long long) downloaded / 1024ULL); goto end; } } #endif opendata(); if (xferfd == -1) { (void) close(f); goto end; } #ifndef DISABLE_HUMOR if ((time(NULL) % 100) == 0) { addreply_noformat(0, MSG_WINNER); } #endif if (st.st_size - restartat > 4096) { addreply(0, MSG_KBYTES_LEFT, (double) ((st.st_size - restartat) / 1024.0)); } doreply(); # ifdef WITH_TLS if (data_protection_level == CPL_PRIVATE) { tls_init_data_session(xferfd, passive); } # endif state_needs_update = 1; setprocessname("pure-ftpd (DOWNLOAD)"); #ifdef FTPWHO if (shm_data_cur != NULL) { const size_t sl = strlen(name); ftpwho_lock(); shm_data_cur->state = FTPWHO_STATE_DOWNLOAD; shm_data_cur->download_total_size = st.st_size; shm_data_cur->download_current_size = restartat; shm_data_cur->restartat = restartat; (void) time(&shm_data_cur->xfer_date); if (sl < sizeof shm_data_cur->filename) { memcpy(shm_data_cur->filename, name, sl); shm_data_cur->filename[sl] = 0; } else { memcpy(shm_data_cur->filename, &name[sl - sizeof shm_data_cur->filename - 1U], sizeof shm_data_cur->filename); } ftpwho_unlock(); } #endif #ifdef HAVE_POSIX_FADVISE (void) posix_fadvise(f, (off_t) 0, st.st_size, POSIX_FADV_SEQUENTIAL); #endif started = get_usec_time(); if (dlmap_init(&dlhandler, clientfd, tls_cnx, xferfd, name, f, tls_data_cnx, restartat, type == 1, throttling_bandwidth_dl) == 0) { ret = dlmap_send(&dlhandler); dlmap_exit(&dlhandler); } else { ret = -1; } (void) close(f); closedata(); if (ret == 0) { addreply_noformat(226, MSG_TRANSFER_SUCCESSFUL); } downloaded += dlhandler.total_downloaded; displayrate(MSG_DOWNLOADED, dlhandler.total_downloaded, started, name, 0); end: restartat = (off_t) 0; } void dorest(const char *name) { char *endptr; restartat = (off_t) strtoull(name, &endptr, 10); if (*endptr != 0 || restartat < (off_t) 0) { restartat = 0; addreply(554, MSG_REST_NOT_NUMERIC "\n" MSG_REST_RESET); } else { if (type == 1 && restartat != 0) { #ifdef STRICT_REST addreply_noformat(504, MSG_REST_ASCII_STRICT); #else addreply(350, MSG_REST_ASCII_WORKAROUND, (long long) restartat); #endif } else { if (restartat != 0) { logfile(LOG_NOTICE, MSG_REST_SUCCESS, (long long) restartat); } addreply(350, MSG_REST_SUCCESS, (long long) restartat); } } } void domkd(char *name) { #ifdef QUOTAS Quota quota; int overflow; #endif if (guest != 0 && allow_anon_mkdir == 0) { addreply_noformat(550, MSG_ANON_CANT_MKD); return; } if (checknamesanity(name, dot_write_ok) != 0) { addreply_noformat(553, MSG_SANITY_DIRECTORY_FAILURE); return; } #ifdef QUOTAS if (quota_update("a, 1LL, 0LL, &overflow) == 0 && overflow != 0) { (void) quota_update("a, -1LL, 0LL, NULL); addreply(552, MSG_QUOTA_EXCEEDED, name); goto end; } #endif if ((mkdir(name, (mode_t) (0777 & ~u_mask_d))) < 0) { #ifdef QUOTAS (void) quota_update("a, -1LL, 0LL, NULL); #endif error(550, MSG_MKD_FAILURE); } else { addreply(257, "\"%s\" : " MSG_MKD_SUCCESS, name); #ifndef MINIMAL cwd_failures = 0UL; #endif } #ifdef QUOTAS end: displayquota("a); #endif } void dormd(char *name) { #ifdef QUOTAS Quota quota; #endif #ifndef ANON_CAN_DELETE if (guest != 0) { addreply_noformat(550, MSG_ANON_CANT_RMD); return; } #endif if (checknamesanity(name, dot_write_ok) != 0) { addreply_noformat(553, MSG_SANITY_DIRECTORY_FAILURE); return; } if ((rmdir(name)) < 0) { error(550, MSG_RMD_FAILURE); } else { #ifdef QUOTAS if (quota_update("a, -1LL, 0LL, NULL) == 0) { displayquota("a); } #endif addreply_noformat(250, MSG_RMD_SUCCESS); } } #ifndef MINIMAL void dofeat(void) { # define FEAT "Extensions supported:" CRLF \ " UTF8" CRLF \ " EPRT" CRLF " IDLE" CRLF " MDTM" CRLF " SIZE" CRLF " MFMT" CRLF \ " REST STREAM" CRLF \ " MLST type*;size*;sizd*;modify*;UNIX.mode*;UNIX.uid*;UNIX.gid*;unique*;" CRLF \ " MLSD" CRLF \ " PRET" # ifdef WITH_TLS # define FEAT_TLS CRLF " AUTH TLS" CRLF " PBSZ" CRLF " PROT" # else # define FEAT_TLS "" # endif # ifdef DEBUG # define FEAT_DEBUG CRLF " XDBG" # else # define FEAT_DEBUG "" # endif # ifdef WITH_VIRTUAL_CHROOT # define FEAT_TVFS "" # else # define FEAT_TVFS CRLF " TVFS" # endif # define FEAT_PASV CRLF " PASV" CRLF " EPSV" CRLF " SPSV" # ifdef MINIMAL # define FEAT_ESTA "" # define FEAT_ESTP "" # else # define FEAT_ESTA CRLF " ESTA" # define FEAT_ESTP CRLF " ESTP" # endif char feat[] = FEAT FEAT_DEBUG FEAT_TLS FEAT_TVFS FEAT_ESTA FEAT_PASV FEAT_ESTP; if (disallow_passive != 0) { feat[sizeof FEAT FEAT_DEBUG FEAT_TLS FEAT_TVFS FEAT_ESTA] = 0; } # ifndef MINIMAL else if (STORAGE_FAMILY(force_passive_ip) != 0) { feat[sizeof FEAT FEAT_DEBUG FEAT_TLS FEAT_TVFS FEAT_ESTA FEAT_PASV] = 0; } # endif addreply_noformat(0, feat); addreply_noformat(211, "End."); } #endif #ifndef MINIMAL void dostou(void) { char file[64]; static unsigned int seq = 0U; struct timeval tv; struct timezone tz; if (gettimeofday(&tv, &tz) != 0) { error(553, MSG_TIMESTAMP_FAILURE); return; } if (SNCHECK(snprintf(file, sizeof file, "pureftpd.%08lx.%02lx.%04x", (unsigned long) tv.tv_sec, (unsigned long) tv.tv_usec & 0xff, seq), sizeof file)) { _EXIT(EXIT_FAILURE); } seq++; seq &= 0xffff; addreply(150, "FILE: %s", file); dostor(file, 0, 1); } #endif static int tryautorename(const char * const atomic_file, char * const name, const char ** const name2_) { static char name2[PATH_MAX]; unsigned int gc = 0U; if (link(atomic_file, name) == 0) { *name2_ = NULL; (void) unlink(atomic_file); return 0; } *name2_ = name2; for (;;) { gc++; if (gc == 0U || #ifdef AUTORENAME_REVERSE_ORDER SNCHECK(snprintf(name2, sizeof name2, "%u.%s", gc, name), sizeof name2) #else SNCHECK(snprintf(name2, sizeof name2, "%s.%u", name, gc), sizeof name2) #endif ) { break; } if (link(atomic_file, name2) == 0) { (void) unlink(atomic_file); return 0; } switch (errno) { #ifdef EEXIST case EEXIST: #endif #ifdef EISDIR case EISDIR: #endif #ifdef ETXTBSY case ETXTBSY: #endif continue; } break; } *name2_ = NULL; return -1; } static char *get_atomic_file(const char * const file) { static char res[PATH_MAX]; char *z; size_t orig_len; size_t slash; size_t sizeof_atomic_prefix; if (file == NULL) { return res; } if ((z = strrchr(file, '/')) == NULL) { *res = 0; orig_len = (size_t) 0U; } else { slash = (size_t) (z - file); if (slash >= (sizeof res - (size_t) 1U)) { return NULL; } slash++; if (file[slash] == 0) { return NULL; } strncpy(res, file, slash); res[slash] = 0; orig_len = strlen(res); } sizeof_atomic_prefix = strlen(atomic_prefix) + (size_t) 1U; if (sizeof res - orig_len < sizeof_atomic_prefix) { return NULL; } memcpy(res + orig_len, atomic_prefix, sizeof_atomic_prefix); return res; } void delete_atomic_file(void) { const char *atomic_file; if ((atomic_file = get_atomic_file(NULL)) == NULL || *atomic_file == 0) { return; } (void) unlink(atomic_file); atomic_file = NULL; } static off_t get_file_size(const char * const file) { struct stat st; if (stat(file, &st) != 0) { return (off_t) -1; } return st.st_size; } #ifdef QUOTAS static int ul_quota_update(const char * const file_name, const int files_count, const off_t bytes) { Quota quota; off_t file_size = (off_t) -1; int overflow; int ret = 0; if (files_count == 0 && bytes == (off_t) 0) { return 0; } if (quota_update("a, files_count, (long long) bytes, &overflow) != 0) { return 0; } if (overflow != 0) { ret = 1; if (file_name != NULL) { file_size = get_file_size(file_name); } if (file_size >= (off_t) 0 && unlink(file_name) == 0) { (void) quota_update("a, -1, (long long) -file_size, NULL); } } displayquota("a); return ret; } #endif static int ulhandler_throttle(ULHandler * const ulhandler, const off_t uploaded, const double ts_start, double *required_sleep) { double ts_now; double elapsed; off_t would_be_uploaded; double wanted_ts; off_t previous_chunk_size; (void) uploaded; if (ulhandler->bandwidth <= 0UL) { *required_sleep = 0.0; return 0; } if ((ts_now = get_usec_time()) <= 0.0) { ts_now = ts_start; } if (ts_start > ts_now) { ts_now = ts_start; } elapsed = ts_now - ts_start; would_be_uploaded = ulhandler->total_uploaded + ulhandler->chunk_size; if (ulhandler->bandwidth > 0UL) { wanted_ts = (double) would_be_uploaded / (double) ulhandler->bandwidth; } else { wanted_ts = elapsed; } *required_sleep = wanted_ts - elapsed; previous_chunk_size = ulhandler->chunk_size; if (ulhandler->total_uploaded > ulhandler->chunk_size) { if (*required_sleep < ulhandler->min_sleep) { ulhandler->chunk_size = (ulhandler->max_chunk_size + ulhandler->chunk_size) / 2; } else if (*required_sleep > ulhandler->max_sleep) { ulhandler->chunk_size = (ulhandler->min_chunk_size + ulhandler->chunk_size) / 2; } else { ulhandler->chunk_size = ulhandler->default_chunk_size; } if (ulhandler->chunk_size <= 0 || ulhandler->chunk_size > (off_t) ulhandler->sizeof_buf) { ulhandler->chunk_size = ulhandler->default_chunk_size; } if (previous_chunk_size != ulhandler->default_chunk_size) { would_be_uploaded = ulhandler->total_uploaded + ulhandler->chunk_size; if (ulhandler->bandwidth > 0UL) { wanted_ts = (double) would_be_uploaded / (double) ulhandler->bandwidth; } else { wanted_ts = elapsed; } *required_sleep = wanted_ts - elapsed; } } return 0; } static int ul_init(ULHandler * const ulhandler, const int clientfd, void * const tls_clientfd, const int xferfd, const char * const name, const int f, void * const tls_fd, const off_t restartat, const int ascii_mode, const unsigned long bandwidth, const off_t max_filesize) { struct pollfd *pfd; (void) name; if (fcntl(xferfd, F_SETFL, fcntl(xferfd, F_GETFL) | O_NONBLOCK) == -1) { error(451, "fcntl(F_SETFL, O_NONBLOCK)"); return -1; } ulhandler->buf = NULL; ulhandler->sizeof_buf = (size_t) 0UL; ulhandler->clientfd = clientfd; ulhandler->tls_clientfd = tls_clientfd; ulhandler->xferfd = xferfd; ulhandler->f = f; ulhandler->tls_fd = tls_fd; ulhandler->ascii_mode = ascii_mode; ulhandler->cur_pos = restartat; ulhandler->total_uploaded = (off_t) 0; ulhandler->min_sleep = 0.1; ulhandler->max_sleep = 5.0; ulhandler->bandwidth = bandwidth; ulhandler->max_filesize = max_filesize; ulhandler->idletime = idletime; pfd = &ulhandler->pfds[PFD_DATA]; pfd->fd = xferfd; pfd->events = POLLIN | POLLERR | POLLHUP; pfd->revents = 0; pfd = &ulhandler->pfds[PFD_COMMANDS]; pfd->fd = clientfd; #ifdef __APPLE_CC__ pfd->events = POLLRDBAND | POLLPRI | POLLERR | POLLHUP; #else pfd->events = POLLIN | POLLPRI | POLLERR | POLLHUP; #endif pfd->revents = 0; pfd = &ulhandler->pfds_command; pfd->fd = clientfd; #ifdef __APPLE_CC__ pfd->events = POLLRDBAND | POLLPRI | POLLERR | POLLHUP; #else pfd->events = POLLIN | POLLPRI | POLLERR | POLLHUP; #endif pfd->revents = 0; ulhandler->min_chunk_size = UL_MIN_CHUNK_SIZE; if (ascii_mode > 0) { ulhandler->default_chunk_size = ulhandler->max_chunk_size = UL_DEFAULT_CHUNK_SIZE_ASCII; } else { ulhandler->max_chunk_size = UL_MAX_CHUNK_SIZE; if (bandwidth <= 0UL) { ulhandler->default_chunk_size = ulhandler->max_chunk_size; } else { ulhandler->default_chunk_size = UL_DEFAULT_CHUNK_SIZE; } } ulhandler->chunk_size = ulhandler->default_chunk_size; ulhandler->cur_pos = restartat; ulhandler->sizeof_buf = ulhandler->max_chunk_size; if ((ulhandler->buf = malloc(ulhandler->sizeof_buf)) == NULL) { ulhandler->buf = NULL; ulhandler->sizeof_buf = (size_t) 0U; return -1; } return 0; } static int ul_dowrite(ULHandler * const ulhandler, const unsigned char *buf_, const size_t size_, off_t * const uploaded) { size_t size = size_; ssize_t written; const unsigned char *buf = buf_; unsigned char *unasciibuf = NULL; int ret = 0; if (size_ <= (size_t) 0U) { *uploaded = 0; return -1; } #ifndef WITHOUT_ASCII if (ulhandler->ascii_mode > 0) { unsigned char *unasciibufpnt; size_t z = (size_t) 0U; if (size > (size_t) ulhandler->chunk_size || (unasciibuf = ALLOCA((size_t) ulhandler->chunk_size)) == NULL) { return -1; } unasciibufpnt = unasciibuf; do { if (buf_[z] != (unsigned char) '\r') { *unasciibufpnt++ = buf_[z]; } z++; } while (z < size); buf = unasciibuf; size = (size_t) (unasciibufpnt - unasciibuf); } #endif written = safe_write(ulhandler->f, buf, size, -1); ret = - (written != (ssize_t) size); if (unasciibuf != NULL) { ALLOCA_FREE(unasciibuf); } if (ret < 0) { *uploaded = 0; } else { *uploaded = size; } return ret; } static int ulhandler_handle_commands(ULHandler * const ulhandler) { char buf[100]; char *bufpnt; ssize_t readnb; if (ulhandler->tls_clientfd != NULL) { #ifdef WITH_TLS readnb = SSL_read(ulhandler->tls_clientfd, buf, sizeof buf - (size_t) 1U); #else abort(); #endif } else { readnb = read(ulhandler->clientfd, buf, sizeof buf - (size_t) 1U); } if (readnb == (ssize_t) 0) { return -2; } if (readnb < (ssize_t) 0) { if (errno == EAGAIN || errno == EINTR) { return 0; } return -1; } buf[readnb] = 0; bufpnt = skip_telnet_controls(buf); if (strchr(buf, '\n') != NULL) { if (strncasecmp(bufpnt, "ABOR", sizeof "ABOR" - 1U) != 0 && strncasecmp(bufpnt, "QUIT", sizeof "QUIT" - 1U) != 0) { addreply_noformat(500, MSG_UNKNOWN_COMMAND); doreply(); } else { addreply_noformat(426, MSG_ABORTED); doreply(); return 1; } } return 0; } static int ul_handle_data(ULHandler * const ulhandler, off_t * const uploaded, const double ts_start) { ssize_t readnb; double required_sleep = 0.0; int pollret; int ret; if (ulhandler->max_filesize >= (off_t) 0 && ulhandler->total_uploaded > ulhandler->max_filesize) { addreply(552, MSG_ABORTED " (quota)"); return -2; } if (ulhandler->chunk_size > (off_t) ulhandler->sizeof_buf) { ulhandler->chunk_size = ulhandler->max_chunk_size = ulhandler->sizeof_buf; } if (ulhandler->tls_fd != NULL) { #ifdef WITH_TLS readnb = SSL_read(ulhandler->tls_fd, ulhandler->buf, ulhandler->chunk_size); #else abort(); #endif } else { readnb = read(ulhandler->xferfd, ulhandler->buf, ulhandler->chunk_size); } if (readnb == (ssize_t) 0) { return 2; } if (readnb < (ssize_t) 0) { if (errno == EAGAIN || errno == EINTR) { return 0; } addreply_noformat(451, MSG_DATA_READ_FAILED); return -1; } if (ul_dowrite(ulhandler, ulhandler->buf, readnb, uploaded) != 0) { addreply_noformat(452, MSG_WRITE_FAILED); return -1; } ulhandler->cur_pos += *uploaded; #ifdef FTPWHO if (shm_data_cur != NULL) { shm_data_cur->download_current_size = shm_data_cur->download_total_size = ulhandler->cur_pos; } #endif ulhandler->total_uploaded += *uploaded; if (ulhandler->bandwidth > 0UL) { ulhandler_throttle(ulhandler, *uploaded, ts_start, &required_sleep); if (required_sleep > 0.0) { repoll: ulhandler->pfds_command.revents = 0; pollret = poll(&ulhandler->pfds_command, 1, required_sleep * 1000.0); if (pollret == 0) { return 0; } if (pollret < 0) { if (errno == EINTR) { goto repoll; } return -1; } if ((ulhandler->pfds_command.revents & (POLLERR | POLLHUP | POLLNVAL)) != 0) { return -1; } if ((ulhandler->pfds_command.revents & (POLLIN | POLLPRI)) != 0) { ret = ulhandler_handle_commands(ulhandler); if (ret != 0) { return ret; } goto repoll; } } } return 0; } static int ul_send(ULHandler * const ulhandler) { double ts_start = 0.0; off_t uploaded = (off_t) 0; int pollret; int timeout; int ret; if (ulhandler->bandwidth > 0UL && (ts_start = get_usec_time()) <= 0.0) { error(451, "gettimeofday()"); return -1; } for (;;) { if (ulhandler->idletime >= INT_MAX / 1000) { timeout = INT_MAX; } else { timeout = (int) ulhandler->idletime * 1000; } ulhandler->pfds[PFD_DATA].revents = ulhandler->pfds[PFD_COMMANDS].revents = 0; pollret = poll(ulhandler->pfds, sizeof ulhandler->pfds / sizeof ulhandler->pfds[0], timeout); if (pollret < 0) { addreply_noformat(451, MSG_DATA_READ_FAILED); return -1; } if (pollret == 0) { addreply_noformat(421, MSG_TIMEOUT); return -1; } if ((ulhandler->pfds[PFD_DATA].revents & POLLIN) != 0) { ret = ul_handle_data(ulhandler, &uploaded, ts_start); switch (ret) { case 1: return 1; case 2: return 0; case 0: break; default: if (ret > 2) { abort(); } return ret; } } if ((ulhandler->pfds[PFD_COMMANDS].revents & (POLLIN | POLLPRI)) != 0) { ret = ulhandler_handle_commands(ulhandler); if (ret != 0) { return ret; } } if ((ulhandler->pfds[PFD_DATA].revents & (POLLERR | POLLNVAL)) != 0 || ((ulhandler->pfds[PFD_DATA].revents & POLLHUP) != 0 && (ulhandler->pfds[PFD_DATA].revents & POLLIN) == 0)) { return -1; } if ((ulhandler->pfds[PFD_COMMANDS].revents & (POLLERR | POLLHUP | POLLNVAL)) != 0) { addreply_noformat(221, MSG_LOGOUT); return -1; } } /* NOTREACHED */ return 0; } static int ul_exit(ULHandler * const ulhandler) { free(ulhandler->buf); ulhandler->buf = NULL; return 0; } int ul_check_free_space(const char *name, const double min_space) { STATFS_STRUCT statfsbuf; char *z; char *alloca_namedir; size_t name_len; double jam; double space; if (maxdiskusagepct <= 0.0 && min_space <= 0.0) { return 1; } #ifdef CHECK_SYMLINKS_DISK_SPACE if (STATFS(name, &statfsbuf) == 0) { goto okcheckspace; } #endif name_len = strlen(name) + (size_t) 1U; if (name_len < (size_t) 2U || (alloca_namedir = ALLOCA(name_len)) == NULL) { return -1; } memcpy(alloca_namedir, name, name_len); if ((z = strrchr(alloca_namedir, '/')) != NULL) { if (z == alloca_namedir) { *z++ = '.'; } *z = 0; } else { alloca_namedir[0] = '.'; alloca_namedir[1] = 0; } if (STATFS(alloca_namedir, &statfsbuf) != 0) { ALLOCA_FREE(alloca_namedir); return -1; } ALLOCA_FREE(alloca_namedir); #ifdef CHECK_SYMLINKS_DISK_SPACE okcheckspace: #endif if ((double) STATFS_BLOCKS(statfsbuf) <= 0.0) { return 1; } if (min_space >= 0.0) { space = (double) STATFS_BAVAIL(statfsbuf) * (double) STATFS_FRSIZE(statfsbuf); if (space < min_space) { return 0; } } jam = (double) STATFS_BAVAIL(statfsbuf) / (double) STATFS_BLOCKS(statfsbuf); if (jam >= maxdiskusagepct) { return 1; } return 0; } void dostor(char *name, const int append, const int autorename) { ULHandler ulhandler; int f; const char *ul_name = NULL; const char *atomic_file = NULL; off_t filesize = (off_t) 0U; struct stat st; double started = 0.0; signed char overwrite = 0; int overflow = 0; int ret = -1; off_t max_filesize = (off_t) -1; #ifdef QUOTAS Quota quota; #endif const char *name2 = NULL; if (type < 1 || (type == 1 && restartat > (off_t) 1)) { addreply_noformat(503, MSG_NO_ASCII_RESUME); goto end; } #ifndef ANON_CAN_RESUME if (guest != 0 && anon_noupload != 0) { addreply_noformat(550, MSG_ANON_CANT_OVERWRITE); goto end; } #endif if (ul_check_free_space(name, -1.0) == 0) { addreply_noformat(552, MSG_NO_DISK_SPACE); goto end; } if (checknamesanity(name, dot_write_ok) != 0) { addreply(553, MSG_SANITY_FILE_FAILURE, name); goto end; } if (autorename != 0) { no_truncate = 1; } if (restartat > (off_t) 0 || no_truncate != 0) { if ((atomic_file = get_atomic_file(name)) == NULL) { addreply(553, MSG_SANITY_FILE_FAILURE, name); goto end; } if (restartat > (off_t) 0 && rename(name, atomic_file) != 0 && errno != ENOENT) { error(553, MSG_RENAME_FAILURE); atomic_file = NULL; goto end; } } if (atomic_file != NULL) { ul_name = atomic_file; } else { ul_name = name; } if (atomic_file == NULL && (f = open(ul_name, O_WRONLY | O_NOFOLLOW)) != -1) { overwrite++; } else if ((f = open(ul_name, O_CREAT | O_WRONLY | O_NOFOLLOW, (mode_t) 0777 & ~u_mask)) == -1) { error(553, MSG_OPEN_FAILURE2); goto end; } if (fstat(f, &st) < 0) { (void) close(f); error(553, MSG_STAT_FAILURE2); goto end; } if (!S_ISREG(st.st_mode)) { (void) close(f); addreply_noformat(550, MSG_NOT_REGULAR_FILE); goto end; } alarm(MAX_SESSION_XFER_IDLE); /* Anonymous users *CAN* overwrite 0-bytes files - This is the right behavior */ if (st.st_size > (off_t) 0) { #ifndef ANON_CAN_RESUME if (guest != 0) { addreply_noformat(550, MSG_ANON_CANT_OVERWRITE); (void) close(f); goto end; } #endif if (append != 0) { restartat = st.st_size; } } else { restartat = (off_t) 0; } if (restartat > st.st_size) { restartat = st.st_size; } if (restartat > (off_t) 0 && lseek(f, restartat, SEEK_SET) < (off_t) 0) { (void) close(f); error(451, "seek"); goto end; } if (restartat < st.st_size) { if (ftruncate(f, restartat) < 0) { (void) close(f); error(451, "ftruncate"); goto end; } #ifdef QUOTAS if (restartat != st.st_size) { (void) quota_update(NULL, 0LL, (long long) (restartat - st.st_size), &overflow); } #endif } #ifdef QUOTAS if (quota_update("a, 0LL, 0LL, &overflow) == 0 && (overflow > 0 || quota.files >= user_quota_files || quota.size > user_quota_size || (max_filesize >= (off_t) 0 && (max_filesize = user_quota_size - quota.size) < (off_t) 0))) { overflow = 1; (void) close(f); goto afterquota; } #endif opendata(); if (xferfd == -1) { (void) close(f); goto end; } doreply(); # ifdef WITH_TLS if (data_protection_level == CPL_PRIVATE) { tls_init_data_session(xferfd, passive); } # endif state_needs_update = 1; setprocessname("pure-ftpd (UPLOAD)"); filesize = restartat; #ifdef FTPWHO if (shm_data_cur != NULL) { const size_t sl = strlen(name); ftpwho_lock(); shm_data_cur->state = FTPWHO_STATE_UPLOAD; shm_data_cur->download_total_size = (off_t) 0U; shm_data_cur->download_current_size = (off_t) filesize; shm_data_cur->restartat = restartat; (void) time(&shm_data_cur->xfer_date); if (sl < sizeof shm_data_cur->filename) { memcpy(shm_data_cur->filename, name, sl); shm_data_cur->filename[sl] = 0; } else { memcpy(shm_data_cur->filename, &name[sl - sizeof shm_data_cur->filename - 1U], sizeof shm_data_cur->filename); } ftpwho_unlock(); } #endif /* Here starts the real upload code */ started = get_usec_time(); if (ul_init(&ulhandler, clientfd, tls_cnx, xferfd, name, f, tls_data_cnx, restartat, type == 1, throttling_bandwidth_ul, max_filesize) == 0) { ret = ul_send(&ulhandler); ul_exit(&ulhandler); } else { ret = -1; } (void) close(f); closedata(); /* Here ends the real upload code */ #ifdef SHOW_REAL_DISK_SPACE if (FSTATFS(f, &statfsbuf) == 0) { double space; space = (double) STATFS_BAVAIL(statfsbuf) * (double) STATFS_FRSIZE(statfsbuf); if (space > 524288.0) { addreply(0, MSG_SPACE_FREE_M, space / 1048576.0); } else { addreply(0, MSG_SPACE_FREE_K, space / 1024.0); } } #endif uploaded += (unsigned long long) ulhandler.total_uploaded; { off_t atomic_file_size; off_t original_file_size; int files_count; if (overwrite == 0) { files_count = 1; } else { files_count = 0; } if (autorename != 0 && restartat == (off_t) 0) { if ((atomic_file_size = get_file_size(atomic_file)) < (off_t) 0) { goto afterquota; } if (tryautorename(atomic_file, name, &name2) != 0) { error(553, MSG_RENAME_FAILURE); goto afterquota; } else { #ifdef QUOTAS ul_quota_update(name2 ? name2 : name, 1, atomic_file_size); #endif atomic_file = NULL; } } else if (atomic_file != NULL) { if ((atomic_file_size = get_file_size(atomic_file)) < (off_t) 0) { goto afterquota; } if ((original_file_size = get_file_size(name)) < (off_t) 0 || restartat > original_file_size) { original_file_size = restartat; } if (rename(atomic_file, name) != 0) { error(553, MSG_RENAME_FAILURE); goto afterquota; } else { #ifdef QUOTAS overflow = ul_quota_update (name, files_count, atomic_file_size - original_file_size); #endif atomic_file = NULL; } } else { #ifdef QUOTAS overflow = ul_quota_update (name, files_count, ulhandler.total_uploaded); #endif } } afterquota: if (overflow > 0) { addreply(552, MSG_QUOTA_EXCEEDED, name); } else { if (ret == 0) { addreply_noformat(226, MSG_TRANSFER_SUCCESSFUL); } else { addreply_noformat(451, MSG_ABORTED); } displayrate(MSG_UPLOADED, ulhandler.total_uploaded, started, name2 ? name2 : name, 1); } end: restartat = (off_t) 0; if (atomic_file != NULL) { unlink(atomic_file); atomic_file = NULL; } } void domdtm(const char *name) { struct stat st; struct tm *t; if (!name || !*name) { addreply_noformat(501, MSG_MISSING_ARG); } else if (stat(name, &st)) { #ifdef DEBUG if (debug != 0) { addreply(0, "arg: %s, wd: %s", name, wd); } #endif addreply_noformat(550, MSG_STAT_FAILURE2); } else if (!S_ISREG(st.st_mode)) { addreply_noformat(550, MSG_NOT_REGULAR_FILE); } else { t = gmtime((time_t *) &(st.st_mtime)); if (!t) { addreply_noformat(451, MSG_GMTIME_FAILURE); } else { addreply(213, "%04d%02d%02d%02d%02d%02d", t->tm_year + 1900, t->tm_mon + 1, t->tm_mday, t->tm_hour, t->tm_min, t->tm_sec); } } } void dosize(const char *name) { struct stat st; if (!name || !*name) { addreply_noformat(501, MSG_MISSING_ARG); } else if (stat(name, &st)) { #ifdef DEBUG if (debug != 0) { addreply(0, "arg: %s, wd: %s", name, wd); } #endif addreply_noformat(550, MSG_STAT_FAILURE2); } else if (!S_ISREG(st.st_mode)) { addreply_noformat(550, MSG_NOT_REGULAR_FILE); } else { addreply(213, "%llu", (unsigned long long) st.st_size); } } void dotype(const char *arg) { replycode = 200; /* bloody awful hack */ if (!arg || !*arg) { addreply(501, MSG_MISSING_ARG "\n" "A(scii) I(mage) L(ocal)"); } else if (tolower((unsigned char) *arg) == 'a') type = 1; else if (tolower((unsigned char) *arg) == 'i') type = 2; else if (tolower((unsigned char) *arg) == 'l') { if (arg[1] == '8') { type = 2; } else if (isdigit((unsigned char) arg[1])) { addreply_noformat(504, MSG_TYPE_8BIT_FAILURE); } else { addreply_noformat(0, MSG_MISSING_ARG); type = 2; } } else { addreply(504, MSG_TYPE_UNKNOWN ": %s", arg); } addreply(0, MSG_TYPE_SUCCESS " %s", (type > 1) ? "8-bit binary" : "ASCII"); } void dostru(const char *arg) { if (arg == NULL || !*arg) { addreply_noformat(501, MSG_MISSING_ARG); } else if (strcasecmp(arg, "F")) { addreply_noformat(504, MSG_STRU_FAILURE); } else { addreply_noformat(200, "F OK"); } } void domode(const char *arg) { if (arg == NULL || !*arg) { addreply_noformat(501, MSG_MISSING_ARG); } else if (strcasecmp(arg, "S")) { addreply_noformat(504, MSG_MODE_FAILURE); } else { addreply_noformat(200, "S OK"); } } void dornfr(char *name) { struct stat st; #ifndef ANON_CAN_RENAME if (guest != 0) { addreply_noformat(550, MSG_ANON_CANT_RENAME); return; } #endif if (disallow_rename != 0) { addreply_noformat(550, MSG_RENAME_FAILURE); return; } if (checknamesanity(name, dot_write_ok) != 0) { addreply(553, MSG_SANITY_FILE_FAILURE, name); return; } if ((lstat(name, &st)) == 0) { if (renamefrom != NULL) { addreply_noformat(0, MSG_RENAME_ABORT); (void) free(renamefrom); } if ((renamefrom = strdup(name)) == NULL) { die_mem(); } addreply_noformat(350, MSG_RENAME_RNFR_SUCCESS); } else { addreply_noformat(550, MSG_FILE_DOESNT_EXIST); } } void dornto(char *name) { #ifdef QUOTAS off_t target_file_size = (off_t) -1; int files_count = 0; long long bytes = 0LL; #endif #ifndef ANON_CAN_RENAME if (guest != 0) { addreply_noformat(550, MSG_ANON_CANT_RENAME); goto bye; } #endif if (renamefrom == NULL) { addreply_noformat(503, MSG_RENAME_NORNFR); goto bye; } if (checknamesanity(name, dot_write_ok) != 0) { addreply(553, MSG_SANITY_FILE_FAILURE, name); return; /* don't clear rnfrom buffer */ } #ifdef QUOTAS if (hasquota() == 0) { struct stat st_source, st_target; if (stat(renamefrom, &st_source) != 0) { addreply_noformat(550, MSG_RENAME_FAILURE); goto bye; } if (stat(name, &st_target) != 0) { if (errno == ENOENT) { target_file_size = (off_t) -1; } else { addreply_noformat(550, MSG_RENAME_FAILURE); goto bye; } } else if (st_source.st_ino == st_target.st_ino && st_source.st_dev == st_target.st_dev) { addreply_noformat(250, MSG_RENAME_SUCCESS); goto bye; } else { target_file_size = st_target.st_size; } if (target_file_size >= (off_t) 0) { bytes = - (long long) target_file_size; files_count = -1; (void) quota_update(NULL, files_count, bytes, NULL); } else { bytes = (off_t) 0; } } #endif if (rename(renamefrom, name) < 0) { error(451, MSG_RENAME_FAILURE); #ifdef QUOTAS (void) quota_update(NULL, -files_count, -bytes, NULL); #endif } else { addreply_noformat(250, MSG_RENAME_SUCCESS); logfile(LOG_NOTICE, MSG_RENAME_SUCCESS ": [%s]->[%s]", renamefrom, name); } bye: (void) free(renamefrom); renamefrom = NULL; } #ifndef MINIMAL void doopts(char *args) { char *cmdopts; if ((cmdopts = strchr(args, ' ')) != NULL) { cmdopts++; (void) cmdopts; } if (strncasecmp("mlst ", args, 5) == 0) { addreply_noformat(200, " MLST OPTS " "type;size;sizd;modify;UNIX.mode;UNIX.uid;" "UNIX.gid;unique;"); return; } addreply_noformat(504, MSG_UNKNOWN_COMMAND); } #endif void error(int n, const char *msg) { const char *e = strerror(errno); logfile(LOG_ERR, "%s: %s", msg, e); addreply(n, "%s: %s", msg, e); } static void fixlimits(void) { #ifdef HAVE_SETRLIMIT static struct rlimit lim; lim.rlim_max = lim.rlim_cur = MAX_CPU_TIME; setrlimit(RLIMIT_CPU, &lim); lim.rlim_max = lim.rlim_cur = MAX_DATA_SIZE; setrlimit(RLIMIT_DATA, &lim); # ifndef DEBUG lim.rlim_max = lim.rlim_cur = 0; setrlimit(RLIMIT_CORE, &lim); # endif #endif } #ifdef COOKIE static int fortune(void) { int fd; char *buf; char *bufpnt; char *bufend; struct stat st; off_t gl; char *fortunepnt; char fortune[2048]; if (fortunes_file == NULL || *fortunes_file == 0) { return 0; } if ((fd = open(fortunes_file, O_RDONLY)) == -1) { logfile(LOG_ERR, MSG_OPEN_FAILURE, fortunes_file); return -1; } if (fstat(fd, &st) < 0 || (((S_IRUSR | S_IRGRP | S_IROTH) & st.st_mode) != (S_IRUSR | S_IRGRP | S_IROTH)) || !(S_ISREG(st.st_mode) || S_ISLNK(st.st_mode)) || st.st_size < 2 || (buf = mmap(NULL, (size_t) st.st_size, PROT_READ, MAP_FILE | MAP_SHARED, fd, (off_t) 0)) == (void *) MAP_FAILED) { (void) close(fd); logfile(LOG_ERR, MSG_OPEN_FAILURE, fortunes_file); return -1; } # ifdef HAVE_RANDOM gl = (off_t) (random() % (st.st_size - 1U)); # else gl = (off_t) (rand() % (st.st_size - 1U)); # endif bufpnt = buf + gl; bufend = buf + st.st_size; while (bufpnt != buf) { if (bufpnt[0] == '\n') { if (&bufpnt[-1] != buf && bufpnt[-1] == '%') { if (&bufpnt[-2] != buf && bufpnt[-2] == '\n') { break; } } } bufpnt--; } if (bufpnt != buf) { while (bufpnt != bufend && *bufpnt == '\n') { bufpnt++; } } fortunepnt = fortune; while (*bufpnt != 0 && bufpnt != bufend && fortunepnt != &fortune[sizeof fortune - 1U]) { if (bufpnt[0] == '\n') { if (&bufpnt[1] != bufend && bufpnt[1] == '%') { if (&bufpnt[2] != bufend && bufpnt[2] == '\n') { break; } } } *fortunepnt++ = *bufpnt++; } if (fortunepnt == fortune) { goto bye; } do { fortunepnt--; } while (fortunepnt != fortune && (*fortunepnt == '\n' || isspace((unsigned char) *fortunepnt))); fortunepnt[1] = 0; fortunepnt = fortune; while (*fortunepnt == '\n') { fortunepnt++; } if (*fortunepnt == 0) { goto bye; } addreply(220, "%s", fortunepnt); bye: (void) munmap(buf, st.st_size); (void) close(fd); return 1; } #endif #if !defined(NO_STANDALONE) && !defined(NO_INETD) static int check_standalone(void) { socklen_t socksize = (socklen_t) sizeof ctrlconn; if (getsockname(0, (struct sockaddr *) &ctrlconn, &socksize) != 0) { clientfd = -1; return 1; } if (dup2(0, 1) == -1) { _EXIT(EXIT_FAILURE); } clientfd = 0; return 0; } #endif static void set_signals_client(void) { sigset_t sigs; struct sigaction sa; sigfillset(&sigs); sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sa.sa_handler = SIG_IGN; (void) sigaction(SIGPIPE, &sa, NULL); (void) sigaction(SIGURG, &sa, NULL); #ifdef SIGIO (void) sigaction(SIGIO, &sa, NULL); #endif sa.sa_handler = SIG_DFL; sigdelset(&sigs, SIGCHLD); (void) sigaction(SIGCHLD, &sa, NULL); #ifdef SIGFPE (void) sigaction(SIGFPE, &sa, NULL); sigdelset(&sigs, SIGFPE); #endif sa.sa_flags = 0; sa.sa_handler = sigalarm; sigdelset(&sigs, SIGALRM); (void) sigaction(SIGALRM, &sa, NULL); sa.sa_handler = sigterm_client; sigdelset(&sigs, SIGTERM); (void) sigaction(SIGTERM, &sa, NULL); sigdelset(&sigs, SIGHUP); (void) sigaction(SIGHUP, &sa, NULL); sigdelset(&sigs, SIGQUIT); (void) sigaction(SIGQUIT, &sa, NULL); sigdelset(&sigs, SIGINT); (void) sigaction(SIGINT, &sa, NULL); #ifdef SIGXCPU sigdelset(&sigs, SIGXCPU); (void) sigaction(SIGXCPU, &sa, NULL); #endif (void) sigprocmask(SIG_SETMASK, &sigs, NULL); } static void set_signals(void) { #ifndef NO_STANDALONE sigset_t sigs; struct sigaction sa; sigfillset(&sigs); sigemptyset(&sa.sa_mask); sa.sa_flags = SA_RESTART; sa.sa_handler = sigchild; sigdelset(&sigs, SIGCHLD); (void) sigaction(SIGCHLD, &sa, NULL); sa.sa_handler = SIG_IGN; (void) sigaction(SIGPIPE, &sa, NULL); (void) sigaction(SIGALRM, &sa, NULL); (void) sigaction(SIGURG, &sa, NULL); #ifdef SIGIO (void) sigaction(SIGIO, &sa, NULL); #endif sa.sa_flags = 0; sa.sa_handler = sigterm; sigdelset(&sigs, SIGTERM); (void) sigaction(SIGTERM, &sa, NULL); sigdelset(&sigs, SIGHUP); (void) sigaction(SIGHUP, &sa, NULL); sigdelset(&sigs, SIGQUIT); (void) sigaction(SIGQUIT, &sa, NULL); sigdelset(&sigs, SIGINT); (void) sigaction(SIGINT, &sa, NULL); # ifdef SIGXCPU sigdelset(&sigs, SIGXCPU); (void) sigaction(SIGXCPU, &sa, NULL); # endif (void) sigprocmask(SIG_SETMASK, &sigs, NULL); #endif } static void dns_sanitize(char *z) { while (*z != 0) { if ((*z >= 'a' && *z <= 'z') || (*z >= '0' && *z <= '9') || *z == '.' || *z == '-' || *z == ':' || (*z >= 'A' && *z <= 'Z')) { /* unless */ } else { *z = '_'; } z++; } } static void fill_atomic_prefix(void) { char tmp_atomic_prefix[PATH_MAX]; snprintf(tmp_atomic_prefix, sizeof tmp_atomic_prefix, "%s%lx.%x.%lx.%x", ATOMIC_PREFIX_PREFIX, (unsigned long) session_start_time, (unsigned int) serverport, (unsigned long) getpid(), zrand()); if ((atomic_prefix = strdup(tmp_atomic_prefix)) == NULL) { die_mem(); } } static void doit(void) { socklen_t socksize; unsigned int users = 0U; int display_banner = 1; client_init_reply_buf(); session_start_time = time(NULL); fixlimits(); #ifdef F_SETOWN fcntl(clientfd, F_SETOWN, getpid()); #endif set_signals_client(); alt_arc4random_stir(); (void) umask((mode_t) 0); socksize = (socklen_t) sizeof ctrlconn; if (getsockname(clientfd, (struct sockaddr *) &ctrlconn, &socksize) != 0) { die(421, LOG_ERR, MSG_NO_SUPERSERVER); } fourinsix(&ctrlconn); if (checkvalidaddr(&ctrlconn) == 0) { die(425, LOG_ERR, MSG_INVALID_IP); } if (STORAGE_FAMILY(ctrlconn) == AF_INET6) { serverport = ntohs((in_port_t) STORAGE_PORT6_CONST(ctrlconn)); } else { serverport = ntohs((in_port_t) STORAGE_PORT_CONST(ctrlconn)); } if (trustedip != NULL && addrcmp(&ctrlconn, trustedip) != 0) { anon_only = 1; } socksize = (socklen_t) sizeof peer; if (getpeername(clientfd, (struct sockaddr *) &peer, &socksize)) { die(421, LOG_ERR, MSG_GETPEERNAME ": %s" , strerror(errno)); } fourinsix(&peer); if (checkvalidaddr(&peer) == 0) { die(425, LOG_ERR, MSG_INVALID_IP); } #ifndef DONT_LOG_IP for (;;) { int eai; if ((eai = getnameinfo ((struct sockaddr *) &peer, STORAGE_LEN(peer), host, sizeof host, NULL, (size_t) 0U, resolve_hostnames != 0 ? 0 : NI_NUMERICHOST)) == 0) { break; } if (resolve_hostnames != 0 && getnameinfo ((struct sockaddr *) &peer, STORAGE_LEN(peer), host, sizeof host, NULL, (size_t) 0U, NI_NUMERICHOST) == 0) { break; } die(425, LOG_ERR, MSG_INVALID_IP); } #endif #ifndef DONT_LOG_IP dns_sanitize(host); #else *host = '?'; host[1] = 0; #endif logfile(LOG_INFO, MSG_NEW_CONNECTION, host); replycode = 220; fill_atomic_prefix(); if (maxusers > 0U) { #ifdef NO_STANDALONE users = daemons(serverport); #else # ifdef NO_INETD users = nb_children; # else if (standalone) { users = nb_children; } else { users = daemons(serverport); } # endif #endif if (users > maxusers) { addreply(421, MSG_MAX_USERS, (unsigned long) maxusers); doreply(); _EXIT(1); } } /* It's time to add a new entry to the ftpwho list */ #ifdef FTPWHO { ftpwho_initwho(); if (shm_data_cur != NULL) { ftpwho_lock(); shm_data_cur->pid = getpid(); shm_data_cur->state = FTPWHO_STATE_IDLE; shm_data_cur->addr = peer; shm_data_cur->local_addr = ctrlconn; shm_data_cur->date = session_start_time; shm_data_cur->xfer_date = shm_data_cur->date; (shm_data_cur->account)[0] = '?'; (shm_data_cur->account)[1] = 0; shm_data_cur->download_total_size = (off_t) 0; shm_data_cur->download_current_size = (off_t) 0; ftpwho_unlock(); } } #endif #ifdef WITH_ALTLOG if (altlog_format != ALTLOG_NONE) { if (altlog_format == ALTLOG_W3C) { if ((altlog_fd = open(altlog_filename, O_CREAT | O_WRONLY | O_NOFOLLOW | O_EXCL, (mode_t) 0600)) != -1) { altlog_write_w3c_header(); } else if (errno == EEXIST) { altlog_fd = open(altlog_filename, O_WRONLY | O_NOFOLLOW); } } else { altlog_fd = open(altlog_filename, O_CREAT | O_WRONLY | O_NOFOLLOW, (mode_t) 0600); } if (altlog_fd == -1) { logfile(LOG_ERR, "altlog %s: %s", altlog_filename, strerror(errno)); } } #endif /* Back to the client - Get the 5 min load average */ { double load_[2]; if (getloadavg(load_, sizeof load_ / sizeof load_[0]) < 0) { load = 0.0; } else { load = load_[1]; } } #ifndef NON_ROOT_FTP wd[0] = '/'; wd[1] = 0; if (chdir(wd)) { _EXIT(EXIT_FAILURE); } #endif { int fodder; #ifdef IPTOS_LOWDELAY fodder = IPTOS_LOWDELAY; setsockopt(clientfd, SOL_IP, IP_TOS, (char *) &fodder, sizeof fodder); #endif #ifdef SO_OOBINLINE fodder = 1; setsockopt(clientfd, SOL_SOCKET, SO_OOBINLINE, (char *) &fodder, sizeof fodder); #endif #ifdef TCP_NODELAY fodder = 1; setsockopt(clientfd, IPPROTO_TCP, TCP_NODELAY, (char *) &fodder, sizeof fodder); #endif keepalive(clientfd, 0); } #ifdef HAVE_SRANDOMDEV srandomdev(); #elif defined (HAVE_RANDOM) srandom((unsigned int) session_start_time ^ (unsigned int) zrand()); #else srand((unsigned int) session_start_time ^ (unsigned int) zrand()); #endif #ifdef COOKIE if (fortune() > 0) { display_banner = 0; } #endif if (display_banner) { #ifdef BORING_MODE addreply_noformat(0, MSG_WELCOME_TO " Pure-FTPd."); #else # ifdef DEBUG addreply_noformat(0, "--------- " MSG_WELCOME_TO " Pure-FTPd " PACKAGE_VERSION VERSION_PRIVSEP VERSION_TLS " ----------"); # else addreply_noformat(0, "--------- " MSG_WELCOME_TO " Pure-FTPd" VERSION_PRIVSEP VERSION_TLS " ----------"); # endif #endif if (users > 0U) { addreply(0, MSG_NB_USERS, users, maxusers); } { struct tm *t; if ((t = localtime(&session_start_time)) != NULL) { addreply(220, MSG_WELCOME_TIME, t->tm_hour, t->tm_min, (unsigned int) serverport); } } } if (anon_only > 0) { addreply_noformat(220, MSG_ANONYMOUS_FTP_ONLY); } else if (anon_only < 0) { addreply_noformat(220, MSG_NO_ANONYMOUS_LOGIN); } if (allowfxp == 2) { addreply_noformat(220, MSG_FXP_SUPPORT); } #ifdef RATIOS if (ratio_upload > 0) { if (ratio_for_non_anon != 0) { addreply_noformat(0, MSG_RATIOS_EVERYONE); } else { addreply_noformat(0, MSG_RATIOS_ANONYMOUS); } addreply(0, MSG_RATIOS_RULE, ratio_download, ratio_upload); } #endif if (display_banner) { if (v6ready != 0 && STORAGE_FAMILY(peer) != AF_INET6) { addreply(0, MSG_IPV6_OK); } if (idletime >= 120UL) { addreply(220, MSG_INFO_IDLE_M, idletime / 60UL); } else { addreply(220, MSG_INFO_IDLE_S, (unsigned long) idletime); } } candownload = (signed char) ((maxload <= 0.0) || (load < maxload)); if (force_passive_ip_s != NULL) { struct addrinfo hints, *res; memset(&hints, 0, sizeof hints); hints.ai_family = AF_INET; hints.ai_addr = NULL; if (getaddrinfo(force_passive_ip_s, NULL, &hints, &res) != 0 || res->ai_family != AF_INET || res->ai_addrlen > sizeof force_passive_ip) { die(421, LOG_ERR, MSG_ILLEGAL_FORCE_PASSIVE); } memcpy(&force_passive_ip, res->ai_addr, res->ai_addrlen); freeaddrinfo(res); } #ifndef WITHOUT_PRIVSEP if (privsep_init() != 0) { die(421, LOG_ERR, "privsep_init"); } #endif parser(); addreply(0, MSG_LOGOUT); logfile(LOG_INFO, MSG_LOGOUT); doreply(); #ifdef WITH_BONJOUR refreshManager(); #endif } static void check_ipv6_support(void) /* check for ipv6 support in kernel */ { #ifndef OLD_IP_STACK int p; if ((p = socket(PF_INET6, SOCK_STREAM, IPPROTO_TCP)) != -1) { (void) close(p); v6ready++; } #endif } #ifndef NO_STANDALONE static void updatepidfile(void) { int fd; char buf[42]; size_t buf_len; if (SNCHECK(snprintf(buf, sizeof buf, "%lu\n", (unsigned long) getpid()), sizeof buf)) { return; } if (unlink(pid_file) != 0 && errno != ENOENT) { return; } if ((fd = open(pid_file, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW, (mode_t) 0644)) == -1) { return; } buf_len = strlen(buf); if (safe_write(fd, buf, buf_len, -1) != (ssize_t) buf_len) { (void) ftruncate(fd, (off_t) 0); } (void) close(fd); } #ifndef NO_STANDALONE static int closedesc_all(const int closestdin) { int fodder; if (closestdin != 0) { (void) close(0); if ((fodder = open("/dev/null", O_RDONLY)) == -1) { return -1; } (void) dup2(fodder, 0); if (fodder > 0) { (void) close(fodder); } } if ((fodder = open("/dev/null", O_WRONLY)) == -1) { return -1; } (void) dup2(fodder, 1); (void) dup2(1, 2); if (fodder > 2) { (void) close(fodder); } return 0; } static void dodaemonize(void) { pid_t child; unsigned int i; /* Contributed by Jason Lunz - also based on APUI code, see open_max() */ if (daemonize != 0) { if ((child = fork()) == (pid_t) -1) { perror(MSG_STANDALONE_FAILED " - fork"); logfile(LOG_ERR, MSG_STANDALONE_FAILED ": [fork: %s]", strerror(errno)); return; } else if (child != (pid_t) 0) { _EXIT(EXIT_SUCCESS); /* parent exits */ } if (setsid() == (pid_t) -1) { perror(MSG_STANDALONE_FAILED " - setsid"); /* continue anyway */ } # ifndef NON_ROOT_FTP if (chdir("/") != 0) { perror("chdir"); _EXIT(EXIT_FAILURE); } # endif i = open_max(); do { if (isatty((int) i)) { (void) close((int) i); } i--; } while (i > 2U); if (closedesc_all(1) != 0) { perror(MSG_STANDALONE_FAILED " - /dev/null duplication"); _EXIT(EXIT_FAILURE); } } } #endif static void accept_client(const int active_listen_fd) { sigset_t set; struct sockaddr_storage sa; socklen_t dummy; pid_t child; memset(&sa, 0, sizeof sa); dummy = (socklen_t) sizeof sa; if ((clientfd = accept (active_listen_fd, (struct sockaddr *) &sa, &dummy)) == -1) { return; } if (STORAGE_FAMILY(sa) != AF_INET && STORAGE_FAMILY(sa) != AF_INET6) { (void) close(clientfd); clientfd = -1; return; } if (maxusers > 0U && nb_children >= maxusers) { char line[1024]; snprintf(line, sizeof line, "421 " MSG_MAX_USERS "\r\n", (unsigned long) maxusers); /* No need to check a return value to say 'f*ck' */ (void) fcntl(clientfd, F_SETFL, fcntl(clientfd, F_GETFL) | O_NONBLOCK); (void) write(clientfd, line, strlen(line)); (void) close(clientfd); clientfd = -1; return; } if (maxip > 0U) { fourinsix(&sa); if (iptrack_get(&sa) >= maxip) { char line[1024]; char hbuf[NI_MAXHOST]; static struct sockaddr_storage old_sa; (void) fcntl(clientfd, F_SETFL, fcntl(clientfd, F_GETFL) | O_NONBLOCK); if (!SNCHECK(snprintf(line, sizeof line, "421 " MSG_MAX_USERS_IP "\r\n", (unsigned long) maxip), sizeof line)) { (void) write(clientfd, line, strlen(line)); } if (addrcmp(&old_sa, &sa) != 0) { old_sa = sa; if (getnameinfo((struct sockaddr *) &sa, STORAGE_LEN(sa), hbuf, sizeof hbuf, NULL, (size_t) 0U, NI_NUMERICHOST) == 0) { logfile(LOG_WARNING, MSG_MAX_USERS_IP ": [%s]", (unsigned long) maxip, hbuf); } } (void) close(clientfd); clientfd = -1; return; } } sigemptyset(&set); sigaddset(&set, SIGCHLD); sigprocmask(SIG_BLOCK, &set, NULL); nb_children++; child = fork(); if (child == (pid_t) 0) { if (isatty(2)) { (void) close(2); } #ifndef SAVE_DESCRIPTORS if (no_syslog == 0) { closelog(); openlog("pure-ftpd", LOG_NDELAY | log_pid, syslog_facility); } #endif doit(); _EXIT(EXIT_SUCCESS); } else if (child == (pid_t) -1) { if (nb_children > 0U) { nb_children--; } } else { if (maxip > 0U) { iptrack_add(&sa, child); } } (void) close(clientfd); clientfd = -1; sigprocmask(SIG_UNBLOCK, &set, NULL); } static void standalone_server(void) { int on; struct addrinfo hints, *res, *res6; fd_set rs; int max_fd; # ifndef NO_INETD standalone = 1; # endif memset(&hints, 0, sizeof hints); hints.ai_flags = AI_PASSIVE; hints.ai_family = AF_INET; hints.ai_socktype = SOCK_STREAM; hints.ai_addr = NULL; on = 1; if (listenfd == -1 && no_ipv4 == 0 && getaddrinfo(standalone_ip, standalone_port, &hints, &res) == 0) { if ((listenfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1 || setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof on) != 0) { int old_errno; freeaddrinfo(res); cant_bind: old_errno = errno; perror(MSG_STANDALONE_FAILED); logfile(LOG_ERR, MSG_STANDALONE_FAILED ": [%s]", strerror(old_errno)); return; } # ifdef TCP_FASTOPEN { # ifdef __APPLE__ int tfo = 1; # else int tfo = 5; # endif setsockopt(listenfd, IPPROTO_TCP, TCP_FASTOPEN, (void *) &tfo, sizeof tfo); } # endif if (bind(listenfd, res->ai_addr, (socklen_t) res->ai_addrlen) != 0 || listen(listenfd, maxusers > 0U ? 3U + maxusers / 8U : DEFAULT_BACKLOG) != 0) { freeaddrinfo(res); goto cant_bind; } freeaddrinfo(res); set_cloexec_flag(listenfd); } if (listenfd6 == -1 && v6ready != 0) { hints.ai_family = AF_INET6; if (getaddrinfo(standalone_ip, standalone_port, &hints, &res6) == 0) { if ((listenfd6 = socket(AF_INET6, SOCK_STREAM, IPPROTO_TCP)) == -1 || setsockopt(listenfd6, SOL_SOCKET, SO_REUSEADDR, (char *) &on, sizeof on) != 0) { freeaddrinfo(res6); goto cant_bind; } # if defined(IPPROTO_IPV6) && defined(IPV6_V6ONLY) (void) setsockopt(listenfd6, IPPROTO_IPV6, IPV6_V6ONLY, (char *) &on, sizeof on); # endif # ifdef TCP_FASTOPEN { int tfo = maxusers > 0U ? 3U + maxusers / 8U : DEFAULT_BACKLOG; setsockopt(listenfd6, IPPROTO_TCP, TCP_FASTOPEN, (void *) &tfo, sizeof tfo); } # endif if (bind(listenfd6, res6->ai_addr, (socklen_t) res6->ai_addrlen) != 0 || listen(listenfd6, maxusers > 0U ? 3U + maxusers / 8U : DEFAULT_BACKLOG) != 0) { freeaddrinfo(res6); goto cant_bind; } freeaddrinfo(res6); set_cloexec_flag(listenfd6); } } if (listenfd == -1 && listenfd6 == -1) { # ifdef EADDRNOTAVAIL errno = EADDRNOTAVAIL; # endif goto cant_bind; } updatepidfile(); setprocessname("pure-ftpd (SERVER)"); FD_ZERO(&rs); if (listenfd > listenfd6) { max_fd = listenfd; } else { max_fd = listenfd6; } max_fd++; while (stop_server == 0) { safe_fd_set(listenfd, &rs); safe_fd_set(listenfd6, &rs); if (select(max_fd, &rs, NULL, NULL, NULL) <= 0) { if (errno != EINTR) { (void) sleep(1); } continue; } if (safe_fd_isset(listenfd, &rs)) { accept_client(listenfd); } if (safe_fd_isset(listenfd6, &rs)) { accept_client(listenfd6); } } } #endif #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) static struct passwd *fakegetpwnam(const char * const name) { static struct passwd pwd; (void) name; pwd.pw_name = pwd.pw_gecos = pwd.pw_shell = "ftp"; pwd.pw_passwd = "*"; pwd.pw_uid = (uid_t) 42U; pwd.pw_gid = (gid_t) 42U; pwd.pw_dir = WIN32_ANON_DIR; return &pwd; } #endif int pureftpd_start(int argc, char *argv[], const char *home_directory_) { #ifndef NO_GETOPT_LONG int option_index = 0; #endif int fodder; int bypass_ipv6 = 0; struct passwd *pw; (void) home_directory_; #ifdef NON_ROOT_FTP home_directory = home_directory_; #endif client_init_reply_buf(); #ifdef HAVE_GETPAGESIZE page_size = (size_t) getpagesize(); #elif defined(_SC_PAGESIZE) page_size = (size_t) sysconf(_SC_PAGESIZE); #elif defined(_SC_PAGE_SIZE) page_size = (size_t) sysconf(_SC_PAGE_SIZE); #else page_size = (size_t) 4096U; #endif #ifdef HAVE_SETLOCALE # ifdef LC_MESSAGES (void) setlocale(LC_MESSAGES, MESSAGES_LOCALE); # endif # ifdef LC_CTYPE (void) setlocale(LC_CTYPE, "C"); # endif # ifdef LC_COLLATE (void) setlocale(LC_COLLATE, "C"); # endif #endif init_tz(); (void) strerror(ENOENT); #ifndef SAVE_DESCRIPTORS openlog("pure-ftpd", LOG_NDELAY | log_pid, DEFAULT_FACILITY); #endif #ifdef USE_CAPABILITIES set_initial_caps(); #endif set_signals(); loggedin = 0; #ifdef BANNER_ENVIRON # ifdef COOKIE { const char *a; if ((a = getenv("BANNER")) != NULL && *a != 0) { fortunes_file = strdup(a); } } # endif #endif #ifndef MINIMAL if (argc == 2 && *argv[1] != '-' && sc_build_command_line_from_file(argv[1], NULL, simpleconf_options, (sizeof simpleconf_options) / (sizeof simpleconf_options[0]), argv[0], &argc, &argv) != 0) { die(421, LOG_ERR, MSG_CONF_ERR); } #endif while ((fodder = #ifndef NO_GETOPT_LONG getopt_long(argc, argv, GETOPT_OPTIONS, long_options, &option_index) #else getopt(argc, argv, GETOPT_OPTIONS) #endif ) != -1) { switch (fodder) { case 's': { if ((pw = getpwnam("ftp")) != NULL || (pw = getpwnam("_ftp")) != NULL) { warez = pw->pw_uid; } else { logfile(LOG_ERR, MSG_NO_FTP_ACCOUNT); } break; } case '0': { no_truncate = 1; break; } case '4': { bypass_ipv6 = 1; break; } case '6': { no_ipv4 = 1; break; } case '1': { log_pid = LOG_PID; break; } #ifndef NO_STANDALONE case 'S': { char *struck; if ((struck = strchr(optarg, ',')) != NULL) { *struck = 0; if (*optarg != 0) { if (standalone_ip == NULL && (standalone_ip = strdup(optarg)) == NULL) { die_mem(); } } *struck = ','; if (struck[1] != 0) { if ((standalone_port = strdup(struck + 1)) == NULL) { die_mem(); } } } else { if ((standalone_port = strdup(optarg)) == NULL) { die_mem(); } } break; } #endif case 'D': { force_ls_a = 1; break; } #ifdef THROTTLING case 't': case 'T': { char *struck; const char *tr_bw_ul = NULL; const char *tr_bw_dl = NULL; if ((struck = strchr(optarg, ':')) != NULL) { *struck = 0; if (*optarg != 0) { tr_bw_ul = optarg; } if (struck[1] != 0) { tr_bw_dl = &struck[1]; } } else { tr_bw_ul = tr_bw_dl = optarg; } if ((tr_bw_ul == NULL || *tr_bw_ul == 0) && (tr_bw_dl == NULL || *tr_bw_dl == 0)) { bad_bw: die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_THROTTLING ": %s" , optarg); } if (tr_bw_dl != NULL) { if ((throttling_bandwidth_dl = strtoul(tr_bw_dl, NULL, 0) * 1024UL) == 0UL) { goto bad_bw; } } if (tr_bw_ul != NULL) { if ((throttling_bandwidth_ul = strtoul(tr_bw_ul, NULL, 0) * 1024UL) == 0UL) { goto bad_bw; } } throttling_delay = 1000000 / (throttling_bandwidth_dl | throttling_bandwidth_ul); if (fodder == 't') { throttling = 1; } else { throttling = 2; } break; } #endif case 'a': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; chroot_trustedgid = strtoul(nptr, &endptr, 0); if (!nptr || !*nptr || !endptr || *endptr) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_TRUSTED_GID ": %s" , optarg); } userchroot = 1; break; } case 'x': { dot_write_ok = 0; break; } case 'X': { dot_write_ok = dot_read_ok = 0; break; } case 'z': { dot_read_anon_ok = 1; break; } case 'Z': { be_customer_proof = 1; break; } case 'A': { userchroot = 2; break; } case 'w': { allowfxp = 1; break; } case 'W': { allowfxp = 2; break; } case 'd': { if (logging < 2) { logging++; } break; } case 'b': { broken_client_compat = 1; break; } case 'c': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; maxusers = (unsigned int) strtoul(nptr, &endptr, 0); if (!nptr || !*nptr || !endptr || *endptr || !maxusers) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_USER_LIMIT ": %s" , optarg); } break; } #ifndef NO_STANDALONE case 'B': { daemonize = 1; break; } case 'C': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; maxip = (unsigned int) strtoul(nptr, &endptr, 0); if (!nptr || !*nptr || !endptr || *endptr || !maxip) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_USER_LIMIT ": %s" , optarg); } break; } #endif #ifdef PER_USER_LIMITS case 'y': { int ret; ret = sscanf(optarg, "%u:%u", &per_user_max, &per_anon_max); if (ret != 2) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_USER_LIMIT ": %s" , optarg); } break; } #endif #ifdef WITH_TLS case '2': { char *struck; char *key_file_; if ((struck = strchr(optarg, ',')) != NULL) { *struck = 0; key_file_ = struck + 1; } else { key_file_ = optarg; } if (*optarg == 0 || *key_file_ == 0) { die(421, LOG_ERR, MSG_CONF_ERR ": TLS"); } if ((cert_file = strdup(optarg)) == NULL) { die_mem(); } if ((key_file = strdup(key_file_)) == NULL) { die_mem(); } break; } case '3': tls_extcert_parse(optarg); use_extcert++; break; case 'Y': { if ((enforce_tls_auth = atoi(optarg)) < 0 || enforce_tls_auth > 3) { die(421, LOG_ERR, MSG_CONF_ERR ": TLS"); } break; } case 'J': { while (*optarg == '-') { if (strncmp(optarg, "-S:", sizeof "-S:" - (size_t) 1U) == 0) { optarg += sizeof "-S:" - (size_t) 1U; } else if (strncmp(optarg, "-C:", sizeof "-C:" - (size_t) 1U) == 0) { optarg += sizeof "-C:" - (size_t) 1U; ssl_verify_client_cert = 1; } } if ((tlsciphersuite = strdup(optarg)) == NULL) { die_mem(); } break; } #endif case 'e': { anon_only = 1; break; } case 'E': { anon_only = -1; break; } #ifdef COOKIE case 'F': { # ifdef BANNER_ENVIRON free(fortunes_file); # endif fortunes_file = strdup(optarg); break; } #endif case 'f': { int n = 0; if (strcasecmp(optarg, "none") == 0) { no_syslog = 1; break; } while (facilitynames[n].c_name && strcasecmp(facilitynames[n].c_name, optarg) != 0) { n++; } if (facilitynames[n].c_name) { syslog_facility = facilitynames[n].c_val; } else { logfile(LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_FACILITY ": %s", optarg); } break; } case 'l': { const Authentication *auth_list_pnt = auth_list; const char *opt = optarg; Authentications *new_auth; size_t auth_name_len; for (;;) { auth_name_len = strlen(auth_list_pnt->name); if (strncasecmp(opt, auth_list_pnt->name, auth_name_len) == 0) { char *file = NULL; opt += auth_name_len; if (*opt == ':') { opt++; if (*opt != 0) { if ((file = strdup(opt)) == NULL) { die_mem(); } } } if (auth_list_pnt->parse != NULL) { auth_list_pnt->parse(file); } if ((new_auth = malloc(sizeof *new_auth)) == NULL) { die_mem(); } new_auth->auth = auth_list_pnt; new_auth->conf_file = file; new_auth->next = NULL; if (last_authentications == NULL) { first_authentications = new_auth; } else { last_authentications->next = new_auth; } last_authentications = new_auth; break; } auth_list_pnt++; if (auth_list_pnt->name == NULL) { die(421, LOG_ERR, MSG_AUTH_UNKNOWN ": %s", opt); } } break; } case 'm': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; maxload = strtod(nptr, &endptr); if (!nptr || !*nptr || !endptr || *endptr || maxload <= 0.0) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_LOAD_LIMIT ": %s" , optarg); } break; } case 'M': { allow_anon_mkdir = 1; break; } case 'N': { disallow_passive = 1; break; } #if defined(WITH_UPLOAD_SCRIPT) case 'o': { do_upload_script = 1; break; } #endif #ifdef WITH_ALTLOG case 'O': { char *optarg_copy; char *delpoint; if ((optarg_copy = strdup(optarg)) == NULL) { die_mem(); } if ((delpoint = strchr(optarg_copy, ALTLOG_DELIMITER)) == NULL) { altlog_format = ALTLOG_DEFAULT; delpoint = optarg_copy; } else { const AltLogPrefixes *altlogprefixes_pnt = altlogprefixes; *delpoint++ = 0; do { if (strcasecmp(optarg_copy, altlogprefixes_pnt->prefix) == 0) { altlog_format = altlogprefixes_pnt->format; break; } altlogprefixes_pnt++; } while (altlogprefixes_pnt->prefix != NULL); if (altlog_format == ALTLOG_NONE) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_UNKNOWN_ALTLOG ": %s", optarg_copy); } } if (*delpoint != '/') { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_SANITY_FILE_FAILURE, delpoint); } if (altlog_filename == NULL && (altlog_filename = strdup(delpoint)) == NULL) { die_mem(); } (void) free(optarg_copy); break; } #endif case 'p': { int ret; ret = sscanf(optarg, "%u:%u", &firstport, &lastport); if (ret != 2 || firstport < 1024U || lastport > 65535U || lastport < firstport) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_PORTS_RANGE ": %s" , optarg); } break; } case 'L': { int ret; ret = sscanf(optarg, "%u:%u", &max_ls_files, &max_ls_depth); if (ret != 2 || max_ls_files < 1U || max_ls_depth < 1U) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_LS_LIMITS ": %s" , optarg); } break; } #ifdef QUOTAS case 'n': { int ret; ret = sscanf(optarg, "%llu:%llu", &user_quota_files, &user_quota_size); if (ret != 2) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_QUOTA ": %s" , optarg); } user_quota_size *= (1024ULL * 1024ULL); break; } #endif case 'P': { if (force_passive_ip_s == NULL && (force_passive_ip_s = strdup(optarg)) == NULL) { die_mem(); } break; } #ifdef RATIOS case 'q': case 'Q': { int ret; ret = sscanf(optarg, "%u:%u", &ratio_upload, &ratio_download); if (ret != 2 || ratio_upload < 1U || ratio_download < 1U) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_RATIO ": %s" , optarg); } if (fodder == 'Q') { ratio_for_non_anon = 1; } break; } #endif case 'r': { autorename = 1; break; } case 'R': { nochmod = 1; break; } case 'K': { keepallfiles = 1; break; } #ifndef NO_STANDALONE case 'g': { if ((pid_file = strdup(optarg)) == NULL) { die_mem(); } break; } #endif case 'G': { disallow_rename = 1; break; } case 'H': { resolve_hostnames = 0; break; } case 'I': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; idletime = strtoul(nptr, &endptr, 0) * 60UL; if (idletime <= 0) { idletime = DEFAULT_IDLE; } break; } case 'i': { anon_noupload = 1; break; } case 'j': { create_home = 1; break; } case 'k': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; maxdiskusagepct = 1.0 - (strtod(nptr, &endptr) / 100.0); if (maxdiskusagepct >= 1.0 || maxdiskusagepct < 0.0) { maxdiskusagepct = 0.0; } break; } case 'u': { const char *nptr; char *endptr; long tmp; nptr = optarg; endptr = NULL; tmp = strtol(nptr, &endptr, 10); if (!nptr || !*nptr || !endptr || *endptr || tmp < 0) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_UID_LIMIT ": %s" , optarg); } useruid = (uid_t) tmp; break; } case 'U': { char *optarg_copy; char *struck; const char *tr_umask = NULL; const char *tr_umask_d = NULL; if ((optarg_copy = strdup(optarg)) == NULL) { die_mem(); } if ((struck = strchr(optarg_copy, ':')) != NULL) { *struck = 0; if (*optarg_copy != 0) { tr_umask = optarg_copy; } if (struck[1] != 0) { tr_umask_d = &struck[1]; } } else { tr_umask = tr_umask_d = optarg_copy; } if ((tr_umask == NULL || *tr_umask == 0) && (tr_umask_d == NULL || *tr_umask_d == 0)) { bad_umask: die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_UMASK ": %s", optarg_copy); } if (tr_umask != NULL) { if ((u_mask = strtoul(tr_umask, NULL, 8)) > 0777) { goto bad_umask; } } if (tr_umask_d != NULL) { if ((u_mask_d = strtoul(tr_umask_d, NULL, 8)) > 0777) { goto bad_umask; } } (void) free(optarg_copy); break; } #ifdef WITH_VIRTUAL_HOSTS case 'V': { if (trustedip == NULL && (trustedip = malloc(sizeof *trustedip)) == NULL) { die_mem(); } if (generic_aton(optarg, trustedip) != 0) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_TRUSTED_IP); } break; } #endif #ifdef WITH_BONJOUR case 'v': { char *rdvname; char *end; if ((rdvname = strdup(optarg)) == NULL) { die_mem(); } doregistration(rdvname, strtoul(standalone_port, &end, 10)); break; } #endif case 'h': { #ifndef NON_ROOT_FTP if (geteuid() == (uid_t) 0) #endif { puts(PACKAGE " v" VERSION VERSION_PRIVSEP "\n"); } #ifndef NO_GETOPT_LONG { const struct option *options = long_options; do { printf("-%c\t--%s\t%s\n", options->val, options->name, options->has_arg ? "" : ""); options++; } while (options->name != NULL); } #endif exit(EXIT_SUCCESS); } default: die(421, LOG_ERR, MSG_ILLEGAL_OPTION); } } if (optind < argc) { die(421, LOG_ERR, MSG_INVALID_ARGUMENT, argv[optind]); } if (first_authentications == NULL) { if ((first_authentications = malloc(sizeof *first_authentications)) == NULL) { die_mem(); } first_authentications->auth = DEFAULT_AUTHENTICATION; first_authentications->conf_file = NULL; first_authentications->next = NULL; } #ifndef NO_STANDALONE dodaemonize(); #endif #ifndef SAVE_DESCRIPTORS if (no_syslog == 0 && (log_pid || syslog_facility != DEFAULT_FACILITY)) { closelog(); openlog("pure-ftpd", LOG_NDELAY | log_pid, syslog_facility); } #endif (void) umask((mode_t) 0); clearargs(argc, argv); idletime_noop = (double) idletime * 2.0; if (firstport) { unsigned int portmax; portmax = (lastport - firstport + 1) / 2; if (!maxusers || maxusers > portmax) { maxusers = portmax; /* ... so we don't run out of ports */ } } if (bypass_ipv6 == 0) { check_ipv6_support(); } #if defined(WITH_UPLOAD_SCRIPT) if (do_upload_script != 0) { upload_pipe_open(); } #endif #ifdef WITH_DIRALIASES if (init_aliases() != 0) { logfile(LOG_ERR, MSG_ALIASES_BROKEN_FILE); } #endif #ifdef WITH_TLS if (enforce_tls_auth > 0) { (void) tls_init_library(); } #endif #if !defined(NO_STANDALONE) && !defined(NO_INETD) if (check_standalone() != 0) { standalone_server(); } else { doit(); } #elif !defined(NO_STANDALONE) && defined(NO_INETD) standalone_server(); #elif defined(NO_STANDALONE) && !defined(NO_INETD) doit(); #else # error Configuration error #endif #ifdef WITH_UPLOAD_SCRIPT upload_pipe_close(); #endif { Authentications *auth_scan = first_authentications; Authentications *previous; while (auth_scan != NULL) { if (auth_scan->auth->exit != NULL) { auth_scan->auth->exit(); } free(auth_scan->conf_file); previous = auth_scan; auth_scan = auth_scan->next; free(previous); } } first_authentications = last_authentications = NULL; free(trustedip); #ifndef NO_STANDALONE iptrack_free(); unlink(pid_file); #endif closelog(); #ifdef WITH_TLS tls_free_library(); tls_extcert_exit(); free((void *) client_sni_name); #endif alt_arc4random_close(); _EXIT(EXIT_SUCCESS); return 0; } pure-ftpd-1.0.49.orig/src/privsep_p.h0000644000175000017500000000324613350542502016361 0ustar rackeracke#ifndef __PRIVSEP_P_H__ #define __PRIVSEP_P_H__ 1 #ifndef CMSG_ALIGN # define CMSG_ALIGN(len) (((len) + sizeof(int) - (size_t) 1U) \ & (size_t) ~(sizeof(int) - (size_t) 1U)) #endif #ifndef CMSG_SPACE # define CMSG_SPACE(len) \ (CMSG_ALIGN(sizeof(struct cmsghdr)) + CMSG_ALIGN(len)) #endif #ifndef CMSG_LEN # define CMSG_LEN(len) (CMSG_ALIGN(sizeof(struct cmsghdr)) + (len)) #endif #ifndef PRIVSEP_USER # define PRIVSEP_USER "_pure-ftpd" #endif typedef enum PrivSepCmd_ { PRIVSEPCMD_NONE, PRIVSEPCMD_ANSWER_ERROR, PRIVSEPCMD_ANSWER_FD, PRIVSEPCMD_BINDRESPORT, PRIVSEPCMD_ANSWER_BINDRESPORT #ifdef FTPWHO , PRIVSEPCMD_REMOVEFTPWHOENTRY, PRIVSEPCMD_ANSWER_REMOVEFTPWHOENTRY #endif } PrivSepCmd; typedef struct PrivSepQuery_BindResPort_ { PrivSepCmd cmd; int protocol; struct sockaddr_storage ss; } PrivSepQuery_BindResPort; #ifdef FTPWHO typedef struct PrivSepQuery_RemoveFtpwhoEntry_ { PrivSepCmd cmd; } PrivSepQuery_RemoveFtpwhoEntry; #endif typedef struct PrivSepQuery_Cmd_ { PrivSepCmd cmd; } PrivSepQuery_Cmd; typedef union PrivSepQuery_ { PrivSepQuery_BindResPort bindresport; #ifdef FTPWHO PrivSepQuery_RemoveFtpwhoEntry removeftpwhoentry; #endif PrivSepQuery_Cmd cmd; } PrivSepQuery; #ifdef FTPWHO typedef struct PrivSepAnswer_RemoveFtpwhoEntry_ { PrivSepCmd cmd; } PrivSepAnswer_RemoveFtpwhoEntry; #endif typedef struct PrivSepAnswer_Cmd_ { PrivSepCmd cmd; } PrivSepAnswer_Cmd; typedef union PrivSepAnswer_ { #ifdef FTPWHO PrivSepAnswer_RemoveFtpwhoEntry removeftpwhoentry; #endif PrivSepAnswer_Cmd cmd; } PrivSepAnswer; static int psfd = -1; static uid_t privsep_uid; #endif pure-ftpd-1.0.49.orig/src/crypto-sha1.h0000644000175000017500000000064313446174132016530 0ustar rackeracke/* * SHA-1 in C * By Steve Reid * 100% Public Domain */ #ifndef __SHA1_H__ #define __SHA1_H__ 1 typedef struct { uint32_t state[5]; uint32_t count[2]; unsigned char buffer[64]; } SHA1_CTX; void SHA1Init(SHA1_CTX * context); void SHA1Update(SHA1_CTX * context, const unsigned char * data, size_t len); void SHA1Final(unsigned char digest[20], SHA1_CTX * context); #endif pure-ftpd-1.0.49.orig/src/bsd-getopt_long.h0000644000175000017500000001146413446174132017450 0ustar rackeracke /* $OpenBSD: getopt_long.c,v 1.13 2003/06/03 01:52:40 millert Exp $ */ /* $NetBSD: getopt_long.c,v 1.15 2002/01/31 22:43:40 tv Exp $ */ /* * Copyright (c) 2002 Todd C. Miller * * Permission to use, copy, modify, and distribute this software for any * purpose with or without fee is hereby granted, provided that the above * copyright notice and this permission notice appear in all copies. * * THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL * WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES * OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE * FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION * OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ /*- * Copyright (c) 2000 The NetBSD Foundation, Inc. * All rights reserved. * * This code is derived from software contributed to The NetBSD Foundation * by Dieter Baron and Thomas Klausner. * * 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 acknowledgement: * This product includes software developed by the NetBSD * Foundation, Inc. and its contributors. * 4. Neither the name of The NetBSD Foundation nor the names of its * contributors may be used to endorse or promote products derived * from this software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS * ``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 FOUNDATION 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. */ #ifndef __BSD_GETOPT_LONG_H__ #define __BSD_GETOPT_LONG_H__ 1 #ifndef HAVE_GETOPT_LONG /* * GNU-like getopt_long() and 4.4BSD getsubopt()/optreset extensions */ # ifndef no_argument # define no_argument 0 # endif # ifndef required_argument # define required_argument 1 # endif # ifndef optional_argument # define optional_argument 2 # endif struct pure_option { /* name of long option */ const char *name; /* * one of no_argument, required_argument, and optional_argument: * whether option takes an argument */ int has_arg; /* if not NULL, set *flag to val when option found */ int *flag; /* if flag not NULL, value to set *flag to; else return value */ int val; }; int pure_getopt_long(int nargc, char * const *nargv, const char *options, const struct pure_option *long_options, int *idx); int pure_getopt_long_only(int nargc, char * const *nargv, const char *options, const struct pure_option *long_options, int *idx); int pure_getopt(int nargc, char * const *nargv, const char *options); extern const char *pure_optarg; /* getopt(3) external variables */ extern int pure_opterr; extern int pure_optind; extern int pure_optopt; extern int pure_optreset; /* prefix+macros just to avoid clashes with existing getopt() implementations */ # ifndef IN_GETOPT_LONG_C # undef option # define option pure_option # undef getopt_long # define getopt_long(A, B, C, D, E) pure_getopt_long(A, B, C, D, E) # undef getopt_long_only # define getopt_long_only(A, B, C, D, E) pure_getopt_long_only(A, B, C, D, E) # undef getopt # define getopt(A, B, C) pure_getopt(A, B, C) # undef optarg # define optarg pure_optarg # undef opterr # define opterr pure_opterr # undef optind # define optind pure_optind # undef optopt # define optopt pure_optopt # undef optreset # define optreset pure_optreset # endif #endif #endif pure-ftpd-1.0.49.orig/src/ftpwho-read.h0000644000175000017500000000023013350542501016557 0ustar rackeracke#ifndef __FTPWHO_READ_H__ #define __FTPWHO_READ_H__ 1 #ifdef PER_USER_LIMITS unsigned int ftpwho_read_count(const char * const user); #endif #endif pure-ftpd-1.0.49.orig/src/messages_fr_funny.h0000644000175000017500000003561713446174132020104 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Y a une couillasse dans ton TLSCipherSuite '%s'" #define MSG_TIMEOUT "Putain mais achete-toi des doigts" #define MSG_CAPABILITIES "Ton kernel m'a envoye chier" #define MSG_CLIENT_CLOSED_CNX "Le mec s'est casse" #define MSG_CLIENT_READ_ERR "Il s'est deco comme un porc" #define MSG_CANT_OPEN_CNX "Je te parle pas a toi" #define MSG_CANT_CREATE_DATA_SOCKET "Fuck off" #define MSG_DEBUG_CLIENT_IS "Le mec a pour IP " #define MSG_SYNTAX_ERROR_IP "C'est quoi cette IP de merde ?" #define MSG_PORT_SUCCESSFUL "Ta commande PORT tu peux te la foutre au cul" #define MSG_ONLY_IPV4V6 "C'est quoi ce protocole de merde ?" #define MSG_ONLY_IPV4 "T'as que de l'IPv4, loser" #define MSG_TIMEOUT_PARSER "Putain mais tu dors ou quoi ? Degage, bouffon" #define MSG_LINE_TOO_LONG "Sale pute, t'as voulu me baiser" #define MSG_LOG_OVERFLOW "Sale pute, t'as voulu me baiser" #define MSG_GOODBYE "Degage connard, tu m'as balance %llu Ko dans la gueule et pompe %llu Ko." #define MSG_DEBUG_COMMAND "Commande" #define MSG_IS_YOUR_CURRENT_LOCATION "c'est la ou tu te trouves ducon" #define MSG_NOT_LOGGED_IN "Dans tes reves" #define MSG_AUTH_UNIMPLEMENTED "Je crypterai pas ta merde" #define MSG_NO_FILE_NAME "Et le nom du fichier, tu me le chies ?" #define MSG_NO_DIRECTORY_NAME "File un nom de repertoire, on verra apres" #define MSG_NO_RESTART_POINT "Super, essaye encore" #define MSG_ABOR_SUCCESS "L'enfoire, il a coupe mon transfert" #define MSG_MISSING_ARG "Le mec, il sait meme pas se servir du FTP" #define MSG_GARBAGE_FOUND "Mais bien sur... y en a pas un peu trop, la ?" #define MSG_VALUE_TOO_LARGE "Comment il se la pete. Va te faire foutre" #define MSG_IDLE_TIME "Tu crois que je vais poireauter %lu secondes ?" #define MSG_SITE_HELP "Le manuel du petit branleur :" #define MSG_BAD_CHMOD "Ton chmod, tu vas le bouffer" #define MSG_UNKNOWN_EXTENSION "est une extension a la con" #define MSG_XDBG_OK "Genre tu vas debugger mon soft... Pfft... Le niveau est %d" #define MSG_UNKNOWN_COMMAND "Va te faire foutre" #define MSG_TIMEOUT_NOOP "Putain mais tu glandes depuis %lu secondes ? T'es mort ?" #define MSG_TIMEOUT_DATA "Eh, ca fait %lu secondes que je m'emmerde" #define MSG_SLEEPING "Fais tourner le techi..." #define MSG_ALREADY_LOGGED "Tu t'amuses ?" #define MSG_ANY_PASSWORD "Eh, t'as pas une cloppe ?" #define MSG_ANONYMOUS_LOGGED "Salut tete de mort. Si tu peta mon FTP ma parole j'te bute" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Ahah, le bouffon, il est sur un serveur virtuel" #define MSG_USER_OK "Eh %s ! File-moi ton code de carte bleue" #define MSG_CANT_DO_TWICE "Et la marmotte, elle met le chocolat dans le papier d'alu" #define MSG_UNABLE_SECURE_ANON "C'est quoi ce delire, le ftp anonyme il est tout fucke" #define MSG_BANDWIDTH_RESTRICTED "T'es un bouffon, tu merites une bande passante de merde" #define MSG_NO_PASSWORD_NEEDED "Si tu me balances un mot de passe, t'es vraiment trop con" #define MSG_NOTRUST "Ton compte, j'ai enveloppe un keebab dedans" #define MSG_WHOAREYOU "Eh, mais tu joues a quoi, la ?" #define MSG_AUTH_FAILED "Va te faire foutre" #define MSG_AUTH_TOOMANY "Degage connard, va jouer ailleurs" #define MSG_NO_HOMEDIR "Mon pitbull a bouffe ton home directory" #define MSG_NO_HOMEDIR2 "%s s'est fait enculer" #define MSG_START_SLASH "Bon, on va direct en /" #define MSG_USER_GROUP_ACCESS "Putain, %s il fait partie de" #define MSG_FXP_SUPPORT "Le FXP est active, alors balance de la wawa" #define MSG_RATIO "T'es un pote, j'te fais un ratio de %u:%u (UL/DL)" #define MSG_CHROOT_FAILED "Le chroot() deconne" #define MSG_CURRENT_DIR_IS "OK. On va voir si y a de la bonne dans %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Mais tu restes dans ta cite : %s" #define MSG_IS_NOW_LOGGED_IN "%s vient de debarquer" #define MSG_CANT_CHANGE_DIR "C'est quoi ce delire, je peux pas aller dans %s" #define MSG_PATH_TOO_LONG "Tu delires" #define MSG_CANT_PASV "Gros con, c'est pas la bonne commande pour IPv6" #define MSG_CANT_PASSIVE "J'en veux pas de ta connexion passive de merde" #define MSG_PORTS_BUSY "La machine est toute flinguee, y a pu de port libre" #define MSG_GETSOCKNAME_DATA "J'ai trop bu, je vais gerber un gros meulard" #define MSG_GETPEERNAME "Y a eu un sale delire, j'ai pas pu voir qui c'etait" #define MSG_INVALID_IP "Adresse de merde" #define MSG_NO_EPSV "C'est quoi ce client a deux balles ?" #define MSG_BAD_PORT "Ton port < 1024 tu va le bouffer avec tes couilles" #define MSG_NO_FXP "Tu crois que je vais parler a %s ? Tu reves (seulement a %s)" #define MSG_FXP "Transfert de 0-day warez : depuis %s vers %s" #define MSG_NO_DATA_CONN "Sans connexion de donnees ca va etre hardos" #define MSG_ACCEPT_FAILED "Putain, mais j'en veux pas de ta socket" #define MSG_ACCEPT_SUCCESS "Tu pues de la gueule" #define MSG_CNX_PORT_FAILED "Je peux pas aller sur le port %d" #define MSG_CNX_PORT "Ca me casse les couilles, mais je vais me connecter au port %d" #define MSG_ANON_CANT_MKD "Un utilisateur anonyme ca cree pas de repertoire, bordel" #define MSG_ANON_CANT_RMD "Tu touches pas a ce repertoire, ou je peta ta reum" #define MSG_ANON_CANT_RENAME "Tu me cherches ou quoi ?" #define MSG_ANON_CANT_CHANGE_PERMS "C'est ca, va jouer au chmod avec ta soeur" #define MSG_GLOB_NO_MEMORY "Bordel, y a pas assez de memoire pour %s" #define MSG_PROBABLY_DENIED "(ou alors t'as essayer de me faire un coup de pute)" #define MSG_GLOB_READ_ERROR "Ca me fait chier d'evaluer %s" #define MSG_GLOB_NO_MATCH "Tu sors ca d'ou ? Y a pas de %s dans %s" #define MSG_CHMOD_FAILED "Va te faire enculer et touche pas a %s" #define MSG_CHMOD_SUCCESS "Un chmod sur %s c'est little player quand meme" #define MSG_CHMOD_TOTAL_FAILURE "Ahah comment t'as trop l'air d'un con sur ce coup-la" #define MSG_ANON_CANT_DELETE "Tu touches pas a ce putain de fichier ou je te butte" #define MSG_ANON_CANT_OVERWRITE "Ce fichier, il est cool, alors t'es gentil, tu touches pas" #define MSG_DELE_FAILED "T'as pas assez de couilles pour butter %s" #define MSG_DELE_SUCCESS "%s%s%s%s s'est fait defoncer la face" #define MSG_DELE_TOTAL_FAILURE "Total loser" #define MSG_LOAD_TOO_HIGH \ "Le serveur a une putain de charge de %3.2f .\n" \ "Alors tu vas pomper ailleurs.\n" \ "(par contre tu peux toujours balancer de la bonne stuff)." #define MSG_OPEN_FAILURE "Dans tes reves, le fichier %s" #define MSG_OPEN_FAILURE2 "Mais va te faire foutre, bordel" #define MSG_STAT_FAILURE "La taille du fichier c'est quoi ?" #define MSG_STAT_FAILURE2 "Sans fichier ca va pas etre facile" #define MSG_REST_TOO_LARGE_FOR_FILE "Ton offset de ouf %lld il devrait pas depasser %lld." #define MSG_REST_RESET "Chez Simone, c'est 10 balles la pipe" #define MSG_NOT_REGULAR_FILE "Et mon pipe, tu l'as vu mon gros pipe ?" #define MSG_NOT_MODERATED \ "Ca te plairait de pomper ce fichier, hein ?\n" \ "Il a pas ete modere alors : FUCK OFF." #define MSG_RATIO_DENIAL \ "T'es un bouffon, ton ratio est de %u:%u .\n" \ "T'as balance %llu Ko et pompe %llu Ko.\n" \ "Alors balance de la stuff ou casse-toi." #define MSG_NO_MORE_TO_DOWNLOAD "Plus rien a pomper" #define MSG_WINNER "Total respekt" #define MSG_KBYTES_LEFT "%.1f Ko a pomper" #define MSG_ABORTED "Putain mais pourquoi t'as tout arrete ? T'es con ou quoi ?" #define MSG_DATA_WRITE_FAILED "Il m'a raccroche a la gueule cet enfoire" #define MSG_DATA_READ_FAILED "Putain il s'est barre, l'encule" #define MSG_MMAP_FAILED "Le systeme il est fucke, meme le mmap() il marche pas" #define MSG_WRITE_FAILED "Une sodo par un ours, ca te dit ?" #define MSG_TRANSFER_RATE_M "%.3f secondes (mesurees ici), %.2f Mo par seconde" #define MSG_TRANSFER_RATE_K "%.3f secondes (mesurees ici), %.2f Ko par seconde" #define MSG_TRANSFER_RATE_B "%.3f secondes (mesurees ici), %.2f octets par seconde" #define MSG_SPACE_FREE_M "%.1f Mo dispos pour rajouter de la bonne" #define MSG_SPACE_FREE_K "%f Ko dispos, c'est tout ?" #define MSG_DOWNLOADED "leeche" #define MSG_REST_NOT_NUMERIC "REST c'est pas pour les bouffons" #define MSG_REST_ASCII_STRICT "C'est quoi ton client de merde ?" #define MSG_REST_ASCII_WORKAROUND "Ton client de merde veut recommencer en %lld." #define MSG_REST_SUCCESS "Ok, on se la refait a partir de %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Dans tes reves, ce repertoire" #define MSG_SANITY_FILE_FAILURE "Ca te fait envie, le fichier %s, hein ?" #define MSG_MKD_FAILURE "Ton repertoire, il pue la fouf moisie" #define MSG_MKD_SUCCESS "Tiens, ton repertoire a la con" #define MSG_RMD_FAILURE "Genre tu veux peta le repertoire, ahahah" #define MSG_RMD_SUCCESS "T'es vraiment un batard d'avoir peta le repertoire" #define MSG_TIMESTAMP_FAILURE "C'est quoi ce systeme de merde ?" #define MSG_MODE_ERROR "Il sort d'ou ton MODE a deux balles ?" #define MSG_CREATE_FAILURE "T'es trop con, j'en veux pas de ton fichier" #define MSG_ABRT_ONLY "Tu te degonfles, bouffon ?" #define MSG_UPLOAD_PARTIAL "Il en manque la moitie, c'est trop nul" #define MSG_REMOVED "s'est mange un kick dans la face" #define MSG_UPLOADED "a ete balance" #define MSG_GMTIME_FAILURE "Eh, eh, eh, t'as l'heure ?" #define MSG_TYPE_8BIT_FAILURE "Elle sort d'ou ton architecture ?" #define MSG_TYPE_UNKNOWN "TYPE de merde" #define MSG_TYPE_SUCCESS "TYPE on va se le faire en" #define MSG_STRU_FAILURE "Seul F(ile) assure" #define MSG_MODE_FAILURE "Mode S(tream)" #define MSG_RENAME_ABORT "Je renomme rien, ca me fait chier" #define MSG_RENAME_RNFR_SUCCESS "Putain moi j'aimais bien l'ancien nom" #define MSG_FILE_DOESNT_EXIST "Ouais, sauf que le fichier il existe pas" #define MSG_RENAME_ALREADY_THERE "Y a deja un truc qui s'appelle comme ca" #define MSG_RENAME_NORNFR "T'as rien compris a la vie" #define MSG_RENAME_FAILURE "Ahaahaha, ca a foire, bien fait" #define MSG_RENAME_SUCCESS "Bon voila, c'est fait" #define MSG_NO_SUPERSERVER "Pure-FTPd faut le lancer a partir d'un super-serveur" #define MSG_NO_FTP_ACCOUNT "Y a meme pas de compte 'ftp' sur cette becane de merde" #define MSG_CONF_ERR "Ta conf elle est pourrie" #define MSG_NO_VIRTUAL_FILE "Et le fichier de conf avec les users, il est ou ?" #define MSG_ILLEGAL_THROTTLING "C'est quoi ton delire avec la bande passante ?" #define MSG_ILLEGAL_TRUSTED_GID "gid de confiance toute defoncee" #define MSG_ILLEGAL_USER_LIMIT "Limitation utilisateur de merde" #define MSG_ILLEGAL_FACILITY "Tu sais meme pas te servir du syslog" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Et la confi LDAP je me la fous au cul ?" #define MSG_ILLEGAL_LOAD_LIMIT "Eh, tu sais pas c'est quoi une limite de charge ?" #define MSG_ILLEGAL_PORTS_RANGE "Liste de ports toute fuckee" #define MSG_ILLEGAL_LS_LIMITS "Limitations de 'ls' toutes merdiques" #define MSG_ILLEGAL_FORCE_PASSIVE "Tu forces les connexions vers n'importe nawak" #define MSG_ILLEGAL_RATIO "Ratio d'upload/download tout pourrave" #define MSG_ILLEGAL_UID_LIMIT "Limitation d'UID merdique" #define MSG_ILLEGAL_OPTION "Faut lire le manuel, bouffon" #define MSG_LDAP_MISSING_BASE "LDAPBaseDN manquant dans le fichier de configuration LDAP" #define MSG_LDAP_WRONG_PARMS "Parametre LDAP pourrave" #define MSG_NEW_CONNECTION "%s ramene son cul" #define MSG_WELCOME_TO "C'est de la bonne :" #define MSG_MAX_USERS "%lu relous (le maximum) sont deja connectes, degage" #define MSG_NB_USERS "T'es le numero %u sur les %u max." #define MSG_WELCOME_TIME "L'heure locale est %02d:%02d. Port du serveur : %u." #define MSG_ANONYMOUS_FTP_ONLY "Je prend que les mecs anonymes" #define MSG_RATIOS_EVERYONE "Y A DES RATIOS POUR TOUS LES UTILISATEURS :" #define MSG_RATIOS_ANONYMOUS "LES UTILISATEURS ANONYMES ONT DES RATIOS DE UL/DL :" #define MSG_RATIOS_RULE "Pour leecher %u Mo, tu dois balancer %u Mo." #define MSG_INFO_IDLE_M "Si tu pionces plus de %lu minutes, tu te fais tej." #define MSG_INFO_IDLE_S "Si tu pionces plus de %lu secondes tu te fais tej." #define MSG_CANT_READ_FILE "[%s] il suce des bites en enfer" #define MSG_LS_TRUNCATED "Je t'en file %u et c'est deja pas mal" #define MSG_LS_SUCCESS "%u elements, y a de la stuff" #define MSG_LOGOUT "Cassos." #define MSG_AUTH_FAILED_LOG "[%s] c'est un batard, il connait pas son code" #define MSG_ILLEGAL_UMASK "Umask pourrave" #define MSG_STANDALONE_FAILED "Le serveur en standalone ? Tu reves." #define MSG_NO_ANONYMOUS_LOGIN "Soit t'as un compte ici, soit tu te casses tout de suite" #define MSG_ANONYMOUS_ANY_PASSWORD "Eh, elle est bonne ta soeur ?" #define MSG_MAX_USERS_IP "Trop de relous (%lu) depuis cette IP" #define MSG_ACTIVE_DISABLED "Mode actif plus actif du tout" #define MSG_TRANSFER_SUCCESSFUL "C'est bon, tu l'as recuperee, ta merde ?" #define MSG_NO_DISK_SPACE "Bordel, mon disque est plein !" #define MSG_OUT_OF_MEMORY "Bordel, ma memoire est pleine !" #define MSG_ILLEGAL_TRUSTED_IP "Fous une IP valide et ca ira mieux" #define MSG_NO_ASCII_RESUME "D'abord tu degages le fichier, apres on discute" #define MSG_UNKNOWN_ALTLOG "Format d'historique de merde" #define MSG_ACCOUNT_DISABLED "Le comte [%s] s'est fait buter" #define MSG_SQL_WRONG_PARMS "Parametre SQL a la con" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Fichier de configuration SQL foireux" #define MSG_SQL_MISSING_SERVER "Pas de serveur dans la configuration SQL" #define MSG_SQL_DOWN "Le serveur SQL est tout destroy" #define MSG_ILLEGAL_QUOTA "Quota tout pourri" #define MSG_QUOTA_FILES "%llu fichiers utilises (%d%%) - autorises : %llu fichiers" #define MSG_QUOTA_SIZE "%llu Ko utilises (%d%%) - autorises : %llu Ko" #define MSG_QUOTA_EXCEEDED "T'as explose ton quota : [%s] va etre pulverise" #define MSG_AUTH_UNKNOWN "C'est quoi ta methode d'authentification a 2 balles ?" #define MSG_PDB_BROKEN "Impossible de lire le fichier puredb indexe (ou il est dans un vieux format) - Essayez pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s c'est un truc de flemmard a la place de %s." #define MSG_ALIASES_UNKNOWN "Je connais pas %s." #define MSG_ALIASES_BROKEN_FILE "Ahahah gros naze, ton fichier d'alias est tout pourrave" #define MSG_ALIASES_LIST "Si t'as la flemme, tu peux utiliser ces raccourcis :" #define MSG_PERUSER_MAX "T'es deja la %lu fois, j'en ai marre de voir ta gueule" #define MSG_IPV6_OK "Si t'es pas un batard, tu peux te connecter en IPv6." #define MSG_TLS_INFO "TLS: Direct, le scarla il deale du %s (%s) en %d bits !" #define MSG_TLS_WEAK "TLS: C'est quoi ce chiffrement de tafiole ?" #define MSG_TLS_NEEDED "Ecoute-moi connard : t'as 10 secondes pour configurer\n" \ "ton client de merde en TLS. En attendant, degage." #define MSG_ILLEGAL_CHARSET "Ton jeu de caractere il puxore grave." #define MSG_TLS_NO_CTX "TLS: contexte introuvable. Cassos." #define MSG_PROT_OK "Niveau de super mega protection : \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Le reglage envoye avec PROT est une grosse daube que je refuse pour transmettre des donnees." #define MSG_PROT_UNKNOWN_LEVEL "C'est quoi ce niveau de protection %s ? Pas compris. Je vais donc choisir \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT ca marche qu'apres un PBSZ reussi" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP n'a pas retourne d'attribut userPassword, ptet que les droits d'acces LDAP chient." #define MSG_LDAP_INVALID_AUTH_METHOD "LDAPAuthMethod dans le fichier de conf, ca doit etre 'bind' ou 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/tls.h0000644000175000017500000000154613446174132015163 0ustar rackeracke#ifndef __TLS_H__ #define __TLS_H__ 1 #ifdef WITH_TLS # include # include # include # include # include # ifdef HAVE_OPENSSL_EC_H # include # endif int tls_init_library(void); void tls_free_library(void); int tls_init_new_session(void); int tls_init_data_session(const int fd, const int passive); void tls_close_session(SSL **cnx); # ifndef IN_TLS_C extern # endif SSL_CTX *tls_ctx; # ifndef IN_TLS_C extern # endif SSL *tls_cnx; # ifndef IN_TLS_C extern # endif int tls_cnx_handshook; # ifndef IN_TLS_C extern # endif SSL *tls_data_cnx; # ifndef IN_TLS_C extern # endif int tls_data_cnx_handshook; /* The minimal number of bits we accept for a cipher */ # define MINIMAL_CIPHER_STRENGTH_BITS 128 # define MAX_CERTIFICATE_DEPTH 6 #endif #endif pure-ftpd-1.0.49.orig/src/parser.h0000644000175000017500000000036513350542502015645 0ustar rackeracke#ifndef __PARSER_H__ #define __PARSER_H__ 1 typedef struct ConfigKeywords_ { const char *keyword; char **value; } ConfigKeywords; int generic_parser(const char * const file, ConfigKeywords *config_keywords); #endif pure-ftpd-1.0.49.orig/src/pure-certd.c0000644000175000017500000002357613450665410016434 0ustar rackeracke#include #ifndef WITH_TLS #include int main(void) { puts("Please compile the server with --with-tls to use this feature.\n" "Thank you."); return 0; } #else #include "ftpd.h" #include "tls_extcert.h" #include "pure-certd_p.h" #include "safe_rw.h" #ifdef WITH_DMALLOC # include #endif static void setcloexec(const int fd) { fcntl(fd, F_SETFD, FD_CLOEXEC); } static int closedesc_all(const int closestdin) { int fodder; if (closestdin != 0) { (void) close(0); if ((fodder = open("/dev/null", O_RDONLY)) == -1) { return -1; } (void) dup2(fodder, 0); if (fodder > 0) { (void) close(fodder); } } if ((fodder = open("/dev/null", O_WRONLY)) == -1) { return -1; } (void) dup2(fodder, 1); (void) dup2(1, 2); if (fodder > 2) { (void) close(fodder); } return 0; } static void dodaemonize(void) { pid_t child; if (daemonize != 0) { if ((child = fork()) == (pid_t) -1) { perror("Daemonization failed - fork"); return; } else if (child != (pid_t) 0) { _exit(EXIT_SUCCESS); } else if (setsid() == (pid_t) -1) { perror("Daemonization failed : setsid"); } (void) chdir("/"); #ifdef HAVE_CLOSEFROM (void) closefrom(3); #endif (void) closedesc_all(1); } } static int init(void) { #ifndef NON_ROOT_FTP if (geteuid() != (uid_t) 0) { fprintf(stderr, "Sorry, but you have to be root to run this program\n"); return -1; } #endif return 0; } static void usage(void) { #ifndef NO_GETOPT_LONG const struct option *options = long_options; do { printf("-%c\t--%s\t%s\n", options->val, options->name, options->has_arg ? "" : ""); options++; } while (options->name != NULL); #endif exit(EXIT_SUCCESS); } static int parseoptions(int argc, char *argv[]) { #ifndef NO_GETOPT_LONG int option_index = 0; #endif int fodder; while ((fodder = #ifndef NO_GETOPT_LONG getopt_long(argc, argv, GETOPT_OPTIONS, long_options, &option_index) #else getopt(argc, argv, GETOPT_OPTIONS) #endif ) != -1) { switch (fodder) { case 'B': { daemonize = 1; break; } case 'g': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; gid = (gid_t) strtoul(nptr, &endptr, 10); if (!nptr || !*nptr || !endptr || *endptr) { perror("Illegal GID - Must be a number\n"); } break; } case 'p': { if ((certd_pid_file = strdup(optarg)) == NULL) { perror("Oh no ! More memory !"); } break; } #ifndef NO_GETOPT_LONG case 'h': { usage(); } #endif case 'r': { if (script == NULL && (script = strdup(optarg)) == NULL) { perror("Oh no ! More memory !"); } break; } case 's': { if (socketpath == NULL && (socketpath = strdup(optarg)) == NULL) { perror("Oh no ! More memory !"); } break; } case 'u': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; uid = (uid_t) strtoul(nptr, &endptr, 10); if (!*nptr || !endptr || *endptr) { perror("Illegal UID - Must be a number\n"); } break; } default: usage(); } } return 0; } static int changeuidgid(void) { #ifndef NON_ROOT_FTP if ( # ifdef HAVE_SETGROUPS setgroups(1U, &gid) || # endif setgid(gid) || setegid(gid) || setuid(uid) || seteuid(uid) || chdir("/")) { return -1; } #endif return 0; } static void newenv_str(const char * const var, const char * const str) { size_t s; char *v; if (str == NULL || *str == 0) { return; } s = strlen(var) + strlen(str) + (size_t) 2U; if ((v = malloc(s)) == NULL) { return; } if (SNCHECK(snprintf(v, s, "%s=%s", var, str), s)) { free(v); return; } #ifdef HAVE_PUTENV putenv(v); #endif } static void updatepidfile(void) { int fd; char buf[42]; size_t buf_len; if (SNCHECK(snprintf(buf, sizeof buf, "%lu\n", (unsigned long) getpid()), sizeof buf)) { return; } if (unlink(certd_pid_file) != 0 && errno != ENOENT) { return; } if ((fd = open(certd_pid_file, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW, (mode_t) 0644)) == -1) { return; } buf_len = strlen(buf); if (safe_write(fd, buf, buf_len, -1) != (ssize_t) buf_len) { ftruncate(fd, (off_t) 0); } close(fd); } static void callback_client_sni_name(const char *str) { newenv_str(ENV_CERTD_SNI_NAME, str); } static void callback_client_end(const char *str) { (void) str; ended = 1; } static void process(const int clientfd) { ssize_t readnb; char *linepnt; char *crpoint; pid_t pid; int pfds[2]; char line[4096]; while ((readnb = read(clientfd, line, sizeof line - 1U)) < (ssize_t) 0 && (errno == EINTR || errno == EIO)); if (readnb <= (ssize_t) 0) { return; } line[readnb] = 0; if (pipe(pfds) != 0) { return; } pid = fork(); if (pid == (pid_t) -1) { close(pfds[0]); close(pfds[1]); return; } if (pid != (pid_t) 0) { close(pfds[1]); /* close the output side of the pipe */ if ((readnb = safe_read(pfds[0], line, sizeof line - 1U)) > (ssize_t) 0) { (void) safe_write(clientfd, line, readnb, -1); } #ifdef HAVE_WAITPID (void) waitpid(pid, NULL, 0); #else while (wait3(NULL, 0, NULL) != pid); #endif close(pfds[0]); return; } /* now, we are in the child */ close(clientfd); close(kindy); close(pfds[0]); /* close the input side of the pipe */ closedesc_all(1); linepnt = line; while ((crpoint = strchr(linepnt, '\n')) != NULL) { const CertdCallBack *scanned; size_t keyword_len; *crpoint = 0; scanned = certd_callbacks; while (scanned->keyword != NULL) { keyword_len = strlen(scanned->keyword); if (strncmp(scanned->keyword, linepnt, keyword_len) == 0) { scanned->func(linepnt + keyword_len); break; } scanned++; } linepnt = crpoint + 1; } if (ended == 0) { close(pfds[1]); _exit(EXIT_FAILURE); } if (dup2(pfds[1], 1) == -1) { close(pfds[1]); _exit(EXIT_FAILURE); } close(pfds[1]); #ifdef DO_CERTD_TIMEOUT (void) alarm(CERTD_SCRIPT_TIMEOUT); #endif (void) execl(script, script, (char *) NULL); _exit(EXIT_SUCCESS); } int listencnx(void) { struct sockaddr_un *saddr; int clientfd; int ret = -1; const size_t socketpath_len = strlen(socketpath); if ((saddr = malloc(sizeof(*saddr) + socketpath_len + (size_t) 1U)) == NULL) { perror("No more memory to listen to anything"); goto bye; } memcpy(saddr->sun_path, socketpath, socketpath_len + (size_t) 1U); saddr->sun_family = AF_UNIX; (void) unlink(socketpath); (void) umask(077); if ((kindy = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror("Unable to create a local socket"); goto bye; } setcloexec(kindy); if (bind(kindy, (struct sockaddr *) saddr, SUN_LEN(saddr)) != 0) { perror("Unable to bind a local socket"); goto bye; } if (chmod(socketpath, 0600) != 0) { perror("Unable to change perms on the local socket"); goto bye; } if (listen(kindy, CERTD_BACKLOG) != 0) { perror("Unable to listen the local socket"); goto bye; } if (changeuidgid() < 0) { perror("Identity change"); goto bye; } do { if ((clientfd = accept(kindy, NULL, NULL)) == -1) { if (exit_certd != 0) { break; } (void) sleep(1); continue; } setcloexec(clientfd); process(clientfd); close(clientfd); } while (exit_certd == 0); ret = 0; bye: if (kindy != -1) { close(kindy); kindy = -1; } (void) unlink(socketpath); free(saddr); return ret; } static RETSIGTYPE sigterm(int sig) { (void) sig; exit_certd = 1; if (kindy != -1) { close(kindy); kindy = -1; } } int main(int argc, char *argv[]) { int err; #ifdef HAVE_SETLOCALE # ifdef LC_MESSAGES (void) setlocale(LC_MESSAGES, ""); # endif # ifdef LC_CTYPE (void) setlocale(LC_CTYPE, ""); # endif # ifdef LC_COLLATE (void) setlocale(LC_COLLATE, ""); # endif #endif if (init() < 0) { return -1; } (void) signal(SIGTERM, sigterm); (void) signal(SIGQUIT, sigterm); (void) signal(SIGINT, sigterm); #ifdef SIGXCPU (void) signal(SIGXCPU, sigterm); #endif if (parseoptions(argc, argv) < 0) { return -1; } if (script == NULL || *script != '/') { fprintf(stderr, "You must give -r /path/to/cert/program\n"); return -2; } if (socketpath == NULL || *socketpath == 0) { fprintf(stderr, "You must give -s /path/to/socket\n"); return -2; } if (daemonize != 0) { dodaemonize(); } updatepidfile(); #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); #endif #ifdef SIGCHLD signal(SIGCHLD, SIG_DFL); #endif err = listencnx(); (void) unlink(certd_pid_file); return err; } #endif pure-ftpd-1.0.49.orig/src/upload-pipe.h0000644000175000017500000000107013350542502016562 0ustar rackeracke#ifndef __UPLOAD_PIPE_H__ #define __UPLOAD_PIPE_H__ 1 #ifndef UPLOAD_PIPE_FILE # ifdef NON_ROOT_FTP # define UPLOAD_PIPE_FILE CONFDIR "/pure-ftpd.upload.pipe" # else # define UPLOAD_PIPE_FILE STATEDIR "/run/pure-ftpd.upload.pipe" # endif #endif #ifndef UPLOAD_PIPE_LOCK # ifdef NON_ROOT_FTP # define UPLOAD_PIPE_LOCK CONFDIR "/pure-ftpd.upload.lock" # else # define UPLOAD_PIPE_LOCK STATEDIR "/run/pure-ftpd.upload.lock" # endif #endif int upload_pipe_open(void); int upload_pipe_push(const char *vuser, const char *file); void upload_pipe_close(void); #endif pure-ftpd-1.0.49.orig/src/utils.c0000644000175000017500000000204213450665410015503 0ustar rackeracke #include #include "ftpd.h" #include "utils.h" #ifdef WITH_DMALLOC # include #endif #ifdef HAVE_LIBSODIUM # if !defined(pure_memzero) || !defined(pure_memcmp) # error pure_memzero/pure_memcmp not defined # endif #else void pure_memzero(void * const pnt, const size_t len) { # ifdef HAVE_EXPLICIT_BZERO explicit_bzero(pnt, len); # else volatile unsigned char *pnt_ = (volatile unsigned char *) pnt; size_t i = (size_t) 0U; while (i < len) { pnt_[i++] = 0U; } # endif } int pure_memcmp(const void * const b1_, const void * const b2_, size_t len) { const unsigned char *b1 = (const unsigned char *) b1_; const unsigned char *b2 = (const unsigned char *) b2_; size_t i; unsigned char d = (unsigned char) 0U; for (i = 0U; i < len; i++) { d |= b1[i] ^ b2[i]; } return (int) ((1 & ((d - 1) >> 8)) - 1); } #endif int pure_strcmp(const char * const s1, const char * const s2) { return pure_memcmp(s1, s2, strlen(s1) + 1U); } pure-ftpd-1.0.49.orig/src/log_mysql.c0000644000175000017500000005440313450665410016361 0ustar rackeracke#include #ifdef WITH_MYSQL # include "ftpd.h" # include "parser.h" # include "log_mysql_p.h" # include "log_mysql.h" # include "messages.h" # include "crypto.h" # include "crypto-sha1.h" # include "alt_arc4random.h" # include "utils.h" #ifdef HAVE_LIBSODIUM # include #endif #ifdef WITH_DMALLOC # include # endif static int pw_mysql_validate_name(const char *name) { if (name == NULL || *name == 0) { return -1; } do { if ((*name >= 'a' && *name <= 'z') || (*name >= 'A' && *name <= 'Z') || (*name >= '0' && *name <= '9') || *name == ' ' || *name == '-' || *name == '_' || *name == '\'' || *name == '.' || *name == ':' || *name == '@' || *name == '+') { /* God bless the Ruby 'unless' keyword */ } else { return -1; } name++; } while (*name != 0); return 0; } static char *pw_mysql_escape_string(MYSQL * const id_sql_server, const char *from) { size_t from_len; size_t to_len; char *to; unsigned long escaped_len; unsigned int t; unsigned char t1, t2, t3, t4; if (from == NULL) { return NULL; } from_len = strlen(from); to_len = from_len * 2U + (size_t) 1U; if ((to = malloc(to_len + (size_t) 4U)) == NULL) { return NULL; } t = zrand(); t1 = t & 0xff; t2 = (t >> 8) & 0xff; t = zrand(); t3 = t & 0xff; t4 = (t >> 8) & 0xff; to[to_len] = (char) t1; to[to_len + 1] = (char) t2; to[to_len + 2] = (char) t3; to[to_len + 3] = (char) t4; /* * I really hate giving a buffer without any size to a 3rd party function. * The "to" buffer is allocated on the heap, not on the stack, if * mysql_real_escape_string() is buggy, the stack shouldn't be already * smashed at this point, but data from other malloc can be corrupted and * bad things can happen. It make sense to wipe this area as soon as * possible instead of doing anything with the heap. We'll end up with * a segmentation violation, but without any possible exploit. */ escaped_len = mysql_real_escape_string(id_sql_server, to, from, from_len); if (escaped_len >= to_len || (unsigned char) to[to_len] != t1 || (unsigned char) to[to_len + 1] != t2 || (unsigned char) to[to_len + 2] != t3 || (unsigned char) to[to_len + 3] != t4) { for (;;) { *to++ = 0; } } to[escaped_len] = 0; return to; } /* * Substitute digraphs for SQL requests. * orig_str is the original string, full of \L, \I, \P, \R and \D. * query is a buffer to handle the result. * query_len is the size of the buffer. * returns the buffer @ if successful, NULL otherwise. -frank. */ static char *sqlsubst(const char *orig_str, char * const query, size_t query_len, const char * const user, const char * const ip, const char * const port, const char * const peer_ip, const char * const decimal_ip) { char *query_pnt = query; const char *orig_str_scan = orig_str; const size_t user_len = (user == NULL ? (size_t) 0U : strlen(user)); const size_t ip_len = (ip == NULL ? (size_t) 0U : strlen(ip)); const size_t port_len = (port == NULL ? (size_t) 0U : strlen(port)); const size_t peer_ip_len = (peer_ip == NULL ? (size_t) 0U : strlen(peer_ip)); const size_t decimal_ip_len = (decimal_ip == NULL ? (size_t) 0U : strlen(decimal_ip)); while (*orig_str_scan != 0) { if (*orig_str_scan == '\\' && orig_str_scan[1] != 0) { orig_str_scan++; switch(tolower((unsigned char) *orig_str_scan)) { case 'l' : if (user_len >= query_len) { return NULL; } if (user_len <= (size_t) 0U) { goto nextone; } memcpy(query_pnt, user, user_len); query_pnt += user_len; query_len -= user_len; goto nextone; case 'i' : if (ip_len >= query_len) { return NULL; } if (ip_len <= (size_t) 0U) { goto nextone; } memcpy(query_pnt, ip, ip_len); query_pnt += ip_len; query_len -= ip_len; goto nextone; case 'p' : if (port_len >= query_len) { return NULL; } if (port_len <= (size_t) 0U) { goto nextone; } memcpy(query_pnt, port, port_len); query_pnt += port_len; query_len -= port_len; goto nextone; case 'r' : if (peer_ip_len >= query_len) { return NULL; } if (peer_ip_len <= (size_t) 0U) { goto nextone; } memcpy(query_pnt, peer_ip, peer_ip_len); query_pnt += peer_ip_len; query_len -= peer_ip_len; goto nextone; case 'd' : if (decimal_ip_len >= query_len) { return NULL; } if (decimal_ip_len <= (size_t) 0U) { goto nextone; } memcpy(query_pnt, decimal_ip, decimal_ip_len); query_pnt += decimal_ip_len; query_len -= decimal_ip_len; goto nextone; default : if (--query_len <= (size_t) 0U) { return NULL; } *query_pnt++ = '\\'; } } if (ISCTRLCODE(*orig_str_scan)) { goto nextone; } if (--query_len <= (size_t) 0U) { return NULL; } *query_pnt++ = *orig_str_scan; nextone: orig_str_scan++; } *query_pnt = 0; return query; } static int pw_mysql_connect(MYSQL ** const id_sql_server) { *id_sql_server = NULL; if ((*id_sql_server = mysql_init(NULL)) == NULL) { down: if (server_down == 0) { const char *mysql_err = "mysql_init()"; if (*id_sql_server != NULL) { mysql_err = mysql_error(*id_sql_server); } server_down++; logfile(LOG_ERR, MSG_SQL_DOWN " [%s]", mysql_err); } return -1; } if (mysql_real_connect(*id_sql_server, server, user, pw, db, port, socket_path, #ifdef CLIENT_MULTI_STATEMENTS CLIENT_MULTI_STATEMENTS #else 0 #endif ) == NULL) { goto down; } if (mysql_ping(*id_sql_server) != 0) { goto down; } server_down = 0; return 0; } static int pw_mysql_simplequery(MYSQL * const id_sql_server, const char * const query) { if (mysql_real_query(id_sql_server, query, strlen(query)) != 0) { return -1; } return 0; } static char *pw_mysql_getquery(MYSQL * const id_sql_server, const char * const orig_query, const char * const account, const char * const ip, const char * const port, const char * const peer_ip, const char * const decimal_ip) { char query[MYSQL_MAX_REQUEST_LENGTH]; MYSQL_RES *qresult = NULL; unsigned long *lengths; char *answer = NULL; MYSQL_ROW row; size_t length; if (orig_query == NULL || *orig_query == 0) { goto bye; } if (sqlsubst(orig_query, query, sizeof query, account, ip, port, peer_ip, decimal_ip) == NULL) { goto bye; } if (mysql_real_query(id_sql_server, query, strlen(query)) != 0) { logfile(LOG_WARNING, MSG_SQL_WRONG_PARMS " : [%s]", query); goto bye; } if (mysql_field_count(id_sql_server) != 1) { goto bye; } if ((qresult = mysql_store_result(id_sql_server)) == NULL) { goto bye; } if (mysql_num_rows(qresult) != 1) { goto bye; } if ((row = mysql_fetch_row(qresult)) == NULL || row[0] == NULL) { goto bye; } lengths = mysql_fetch_lengths(qresult); if (lengths == NULL || (length = (size_t) lengths[0] + (size_t) 1U) <= (size_t) 1U) { goto bye; } if ((answer = malloc(length)) == NULL) { goto bye; } strncpy(answer, row[0], length - (size_t) 1U); answer[length - (size_t) 1U] = 0; bye: if (qresult != NULL) { mysql_free_result(qresult); #ifdef CLIENT_MULTI_STATEMENTS while (mysql_next_result(id_sql_server) == 0) { qresult = mysql_store_result(id_sql_server); mysql_free_result(qresult); } #endif } return answer; } void pw_mysql_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer) { MYSQL *id_sql_server = NULL; const char *spwd = NULL; /* stored password */ const char *uid = sql_default_uid; /* stored system login/uid */ const char *gid = sql_default_gid; /* stored system group/gid */ const char *dir = NULL; /* stored home directory */ #ifdef QUOTAS const char *sqta_fs = NULL; /* stored quota files */ const char *sqta_sz = NULL; /* stored quota size */ #endif #ifdef RATIOS const char *ratio_ul = NULL; /* stored ratio UL */ const char *ratio_dl = NULL; /* stored ratio DL */ #endif #ifdef THROTTLING const char *bandwidth_ul = NULL; /* stored bandwidth UL */ const char *bandwidth_dl = NULL; /* stored bandwidth DL */ #endif char *escaped_account = NULL; char *escaped_ip = NULL; char *escaped_port = NULL; char *escaped_peer_ip = NULL; char *escaped_decimal_ip = NULL; int committed = 1; int crypto_argon2 = 0, crypto_scrypt = 0, crypto_crypt = 0, crypto_mysql = 0, crypto_md5 = 0, crypto_sha1 = 0, crypto_plain = 0; unsigned long decimal_ip_num = 0UL; char decimal_ip[42]; char hbuf[NI_MAXHOST]; char pbuf[NI_MAXSERV]; char phbuf[NI_MAXHOST]; result->auth_ok = 0; if (pw_mysql_validate_name(account) != 0) { goto bye; } if (getnameinfo((const struct sockaddr *) sa, STORAGE_LEN(*sa), hbuf, sizeof hbuf, pbuf, sizeof pbuf, NI_NUMERICHOST | NI_NUMERICSERV) != 0 || getnameinfo((const struct sockaddr *) peer, STORAGE_LEN(*peer), phbuf, sizeof phbuf, NULL, (size_t) 0U, NI_NUMERICHOST) != 0) { goto bye; } *decimal_ip = 0; if (STORAGE_FAMILY(*peer) == AF_INET) { const unsigned char *decimal_ip_raw = (const unsigned char *) &(STORAGE_SIN_ADDR(*peer)); decimal_ip_num = ((unsigned long) decimal_ip_raw[0] << 24) | ((unsigned long) decimal_ip_raw[1] << 16) | (decimal_ip_raw[2] << 8) | decimal_ip_raw[3]; if (SNCHECK(snprintf(decimal_ip, sizeof decimal_ip, "%lu", decimal_ip_num), sizeof decimal_ip)) { goto bye; } } if (pw_mysql_connect(&id_sql_server) != 0) { goto bye; } if ((escaped_account = pw_mysql_escape_string(id_sql_server, account)) == NULL) { goto bye; } if ((escaped_ip = pw_mysql_escape_string(id_sql_server, hbuf)) == NULL) { goto bye; } if ((escaped_port = pw_mysql_escape_string(id_sql_server, pbuf)) == NULL) { goto bye; } if ((escaped_peer_ip = pw_mysql_escape_string(id_sql_server, phbuf)) == NULL) { goto bye; } if ((escaped_decimal_ip = pw_mysql_escape_string(id_sql_server, decimal_ip)) == NULL) { goto bye; } if (transactions != NULL && strcasecmp(transactions, "on") == 0) { if (pw_mysql_simplequery(id_sql_server, MYSQL_TRANSACTION_START) == 0) { committed = 0; } } if ((spwd = pw_mysql_getquery(id_sql_server, sqlreq_getpw, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) == NULL) { goto bye; } if (uid == NULL) { uid = pw_mysql_getquery(id_sql_server, sqlreq_getuid, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip); } if (uid == NULL) { goto bye; } if (gid == NULL) { gid = pw_mysql_getquery(id_sql_server, sqlreq_getgid, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip); } if (gid == NULL) { goto bye; } if ((dir = pw_mysql_getquery(id_sql_server, sqlreq_getdir, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) == NULL) { goto bye; } result->auth_ok--; /* -1 */ if (strcasecmp(crypto, PASSWD_SQL_ANY) == 0) { crypto_argon2++; crypto_scrypt++; crypto_crypt++; crypto_mysql++; crypto_md5++; crypto_sha1++; } else if (strcasecmp(crypto, PASSWD_SQL_ARGON2) == 0) { crypto_argon2++; } else if (strcasecmp(crypto, PASSWD_SQL_SCRYPT) == 0) { crypto_scrypt++; } else if (strcasecmp(crypto, PASSWD_SQL_CRYPT) == 0) { crypto_crypt++; } else if (strcasecmp(crypto, PASSWD_SQL_MYSQL) == 0) { crypto_mysql++; } else if (strcasecmp(crypto, PASSWD_SQL_MD5) == 0) { crypto_md5++; } else if (strcasecmp(crypto, PASSWD_SQL_SHA1) == 0) { crypto_sha1++; } else { /* default to plaintext */ crypto_plain++; } #ifdef crypto_pwhash_STRPREFIX if (crypto_argon2 != 0) { if (crypto_pwhash_str_verify(spwd, password, strlen(password)) == 0) { goto auth_ok; } } #endif #ifdef crypto_pwhash_scryptsalsa208sha256_STRPREFIX if (crypto_scrypt != 0) { if (crypto_pwhash_scryptsalsa208sha256_str_verify (spwd, password, strlen(password)) == 0) { goto auth_ok; } } #endif if (crypto_crypt != 0) { const char *crypted; if ((crypted = (const char *) crypt(password, spwd)) != NULL && pure_strcmp(crypted, spwd) == 0) { goto auth_ok; } } if (crypto_mysql != 0) { char scrambled_password[42]; /* 2 * 20 (sha1 hash size) + 2 */ SHA1_CTX ctx; unsigned char h0[20], h1[20]; char *p; SHA1Init(&ctx); SHA1Update(&ctx, password, strlen(password)); SHA1Final(h0, &ctx); SHA1Init(&ctx); SHA1Update(&ctx, h0, sizeof h0); pure_memzero(h0, sizeof h0); SHA1Final(h1, &ctx); *scrambled_password = '*'; hexify(scrambled_password + 1U, h1, (sizeof scrambled_password) - 1U, sizeof h1); *(p = scrambled_password) = '*'; while (*p++ != 0) { *p = (char) toupper((unsigned char) *p); } if (pure_strcmp(scrambled_password, spwd) == 0) { goto auth_ok; } } if (crypto_md5 != 0) { const char *crypted; if ((crypted = (const char *) crypto_hash_md5(password, 1)) != NULL && pure_strcmp(crypted, spwd) == 0) { goto auth_ok; } } if (crypto_sha1 != 0) { const char *crypted; if ((crypted = (const char *) crypto_hash_sha1(password, 1)) != NULL && pure_strcmp(crypted, spwd) == 0) { goto auth_ok; } } if (crypto_plain != 0) { if (*password != 0 && /* refuse null cleartext passwords */ pure_strcmp(password, spwd) == 0) { goto auth_ok; } } goto bye; auth_ok: /* * do *NOT* accept root uid/gid - if the database is compromized, the FTP * server could also be rooted. */ result->uid = (uid_t) strtoul(uid, NULL, 10); if (result->uid <= (uid_t) 0) { struct passwd *pw; if ((pw = getpwnam(uid)) == NULL || pw->pw_uid <= (uid_t) 0) { goto bye; } result->uid = pw->pw_uid; } result->gid = (gid_t) strtoul(gid, NULL, 10); if (result->gid <= (gid_t) 0) { struct group *gr; if ((gr = getgrnam(gid)) == NULL || (gid_t) gr->gr_gid <= (gid_t) 0) { goto bye; } result->gid = gr->gr_gid; } result->dir = dir; dir = NULL; #ifdef QUOTAS if ((sqta_fs = pw_mysql_getquery(id_sql_server, sqlreq_getqta_fs, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned long long q = strtoull(sqta_fs, NULL, 10); if (q > 0ULL) { result->user_quota_files = q; result->quota_files_changed = 1; } } if ((sqta_sz = pw_mysql_getquery(id_sql_server, sqlreq_getqta_sz, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned long long q = strtoull(sqta_sz, NULL, 10); if (q > 0ULL) { result->user_quota_size = q * (1024UL * 1024UL); result->quota_size_changed = 1; } } #endif #ifdef RATIOS if ((ratio_ul = pw_mysql_getquery(id_sql_server, sqlreq_getratio_ul, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned int q = (unsigned int) strtoul(ratio_ul, NULL, 10); if (q > 0U) { result->ratio_upload = q; result->ratio_ul_changed = 1; } } if ((ratio_dl = pw_mysql_getquery(id_sql_server, sqlreq_getratio_dl, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned int q = (unsigned int) strtoul(ratio_dl, NULL, 10); if (q > 0U) { result->ratio_download = q; result->ratio_dl_changed = 1; } } #endif #ifdef THROTTLING if ((bandwidth_ul = pw_mysql_getquery(id_sql_server, sqlreq_getbandwidth_ul, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned long q = (unsigned long) strtoul(bandwidth_ul, NULL, 10); if (q > 0UL) { result->throttling_bandwidth_ul = q * 1024UL; result->throttling_ul_changed = 1; } } if ((bandwidth_dl = pw_mysql_getquery(id_sql_server, sqlreq_getbandwidth_dl, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned long q = (unsigned long) strtoul(bandwidth_dl, NULL, 10); if (q > 0UL) { result->throttling_bandwidth_dl = q * 1024UL; result->throttling_dl_changed = 1; } } #endif result->slow_tilde_expansion = !tildexp; result->auth_ok = -result->auth_ok; bye: if (committed == 0) { (void) pw_mysql_simplequery(id_sql_server, MYSQL_TRANSACTION_END); } if (id_sql_server != NULL) { mysql_close(id_sql_server); } free((void *) spwd); if (uid != sql_default_uid) { free((void *) uid); } if (gid != sql_default_gid) { free((void *) gid); } free((void *) dir); #ifdef QUOTAS free((void *) sqta_fs); free((void *) sqta_sz); #endif #ifdef RATIOS free((void *) ratio_ul); free((void *) ratio_dl); #endif #ifdef THROTTLING free((void *) bandwidth_ul); free((void *) bandwidth_dl); #endif free((void *) escaped_account); free((void *) escaped_ip); free((void *) escaped_port); free((void *) escaped_peer_ip); free((void *) escaped_decimal_ip); } void pw_mysql_parse(const char * const file) { if (generic_parser(file, mysql_config_keywords) != 0) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_CONFIG_FILE_SQL ": %s", file); } if (server == NULL && socket_path == NULL) { die(421, LOG_ERR, MSG_SQL_MISSING_SERVER); } if (server != NULL && socket_path != NULL) { free(socket_path); socket_path = NULL; } if (tildexp_s != NULL) { if ((tildexp = atoi(tildexp_s)) < 0) { tildexp = 0; } free(tildexp_s); tildexp_s = NULL; } if (port_s != NULL) { port = atoi(port_s); if (port <= 0 || port > 65535) { port = MYSQL_DEFAULT_PORT; } free(port_s); port_s = NULL; } } #define ZFREE(X) do { free(X); (X) = NULL; } while (0) void pw_mysql_exit(void) { ZFREE(server); ZFREE(port_s); port = -1; ZFREE(socket_path); ZFREE(user); ZFREE(pw); ZFREE(db); ZFREE(crypto); ZFREE(transactions); ZFREE(sqlreq_getpw); ZFREE(sqlreq_getuid); ZFREE(sql_default_uid); ZFREE(sqlreq_getgid); ZFREE(sql_default_gid); ZFREE(sqlreq_getdir); #ifdef QUOTAS ZFREE(sqlreq_getqta_fs); ZFREE(sqlreq_getqta_sz); #endif #ifdef RATIOS ZFREE(sqlreq_getratio_ul); ZFREE(sqlreq_getratio_dl); #endif #ifdef THROTTLING ZFREE(sqlreq_getbandwidth_ul); ZFREE(sqlreq_getbandwidth_dl); #endif } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/Makefile.in0000644000175000017500000037322413451110032016243 0ustar rackeracke# Makefile.in generated by automake 1.16.1 from Makefile.am. # @configure_input@ # Copyright (C) 1994-2018 Free Software Foundation, Inc. # This Makefile.in is free software; the Free Software Foundation # gives unlimited permission to copy and/or distribute it, # with or without modifications, as long as this notice is preserved. # This program is distributed in the hope that it will be useful, # but WITHOUT ANY WARRANTY, to the extent permitted by law; without # even the implied warranty of MERCHANTABILITY or FITNESS FOR A # PARTICULAR PURPOSE. @SET_MAKE@ VPATH = @srcdir@ am__is_gnu_make = { \ if test -z '$(MAKELEVEL)'; then \ false; \ elif test -n '$(MAKE_HOST)'; then \ true; \ elif test -n '$(MAKE_VERSION)' && test -n '$(CURDIR)'; then \ true; \ else \ false; \ fi; \ } am__make_running_with_option = \ case $${target_option-} in \ ?) ;; \ *) echo "am__make_running_with_option: internal error: invalid" \ "target option '$${target_option-}' specified" >&2; \ exit 1;; \ esac; \ has_opt=no; \ sane_makeflags=$$MAKEFLAGS; \ if $(am__is_gnu_make); then \ sane_makeflags=$$MFLAGS; \ else \ case $$MAKEFLAGS in \ *\\[\ \ ]*) \ bs=\\; \ sane_makeflags=`printf '%s\n' "$$MAKEFLAGS" \ | sed "s/$$bs$$bs[$$bs $$bs ]*//g"`;; \ esac; \ fi; \ skip_next=no; \ strip_trailopt () \ { \ flg=`printf '%s\n' "$$flg" | sed "s/$$1.*$$//"`; \ }; \ for flg in $$sane_makeflags; do \ test $$skip_next = yes && { skip_next=no; continue; }; \ case $$flg in \ *=*|--*) continue;; \ -*I) strip_trailopt 'I'; skip_next=yes;; \ -*I?*) strip_trailopt 'I';; \ -*O) strip_trailopt 'O'; skip_next=yes;; \ -*O?*) strip_trailopt 'O';; \ -*l) strip_trailopt 'l'; skip_next=yes;; \ -*l?*) strip_trailopt 'l';; \ -[dEDm]) skip_next=yes;; \ -[JT]) skip_next=yes;; \ esac; \ case $$flg in \ *$$target_option*) has_opt=yes; break;; \ esac; \ done; \ test $$has_opt = yes am__make_dryrun = (target_option=n; $(am__make_running_with_option)) am__make_keepgoing = (target_option=k; $(am__make_running_with_option)) pkgdatadir = $(datadir)/@PACKAGE@ pkgincludedir = $(includedir)/@PACKAGE@ pkglibdir = $(libdir)/@PACKAGE@ pkglibexecdir = $(libexecdir)/@PACKAGE@ am__cd = CDPATH="$${ZSH_VERSION+.}$(PATH_SEPARATOR)" && cd install_sh_DATA = $(install_sh) -c -m 644 install_sh_PROGRAM = $(install_sh) -c install_sh_SCRIPT = $(install_sh) -c INSTALL_HEADER = $(INSTALL_DATA) transform = $(program_transform_name) NORMAL_INSTALL = : PRE_INSTALL = : POST_INSTALL = : NORMAL_UNINSTALL = : PRE_UNINSTALL = : POST_UNINSTALL = : sbin_PROGRAMS = pure-authd$(EXEEXT) pure-certd$(EXEEXT) \ pure-ftpd$(EXEEXT) pure-ftpwho$(EXEEXT) pure-mrtginfo$(EXEEXT) \ pure-quotacheck$(EXEEXT) pure-uploadscript$(EXEEXT) bin_PROGRAMS = pure-statsdecode$(EXEEXT) pure-pw$(EXEEXT) \ pure-pwconvert$(EXEEXT) noinst_PROGRAMS = ptracetest$(EXEEXT) subdir = src ACLOCAL_M4 = $(top_srcdir)/aclocal.m4 am__aclocal_m4_deps = $(top_srcdir)/m4/ax_check_compile_flag.m4 \ $(top_srcdir)/m4/ax_check_link_flag.m4 \ $(top_srcdir)/m4/getloadavg.m4 $(top_srcdir)/configure.ac am__configure_deps = $(am__aclocal_m4_deps) $(CONFIGURE_DEPENDENCIES) \ $(ACLOCAL_M4) DIST_COMMON = $(srcdir)/Makefile.am $(am__DIST_COMMON) mkinstalldirs = $(install_sh) -d CONFIG_HEADER = $(top_builddir)/config.h CONFIG_CLEAN_FILES = CONFIG_CLEAN_VPATH_FILES = am__installdirs = "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)" PROGRAMS = $(bin_PROGRAMS) $(noinst_PROGRAMS) $(sbin_PROGRAMS) LIBRARIES = $(noinst_LIBRARIES) AR = ar ARFLAGS = cru AM_V_AR = $(am__v_AR_@AM_V@) am__v_AR_ = $(am__v_AR_@AM_DEFAULT_V@) am__v_AR_0 = @echo " AR " $@; am__v_AR_1 = libpureftpd_a_AR = $(AR) $(ARFLAGS) libpureftpd_a_LIBADD = am_libpureftpd_a_OBJECTS = libpureftpd_a-altlog.$(OBJEXT) \ libpureftpd_a-alt_arc4random.$(OBJEXT) \ libpureftpd_a-bonjour.$(OBJEXT) \ libpureftpd_a-bsd-glob.$(OBJEXT) \ libpureftpd_a-bsd-realpath.$(OBJEXT) \ libpureftpd_a-bsd-getopt_long.$(OBJEXT) \ libpureftpd_a-caps.$(OBJEXT) libpureftpd_a-crypto.$(OBJEXT) \ libpureftpd_a-crypto-md5.$(OBJEXT) \ libpureftpd_a-crypto-sha1.$(OBJEXT) \ libpureftpd_a-daemons.$(OBJEXT) \ libpureftpd_a-diraliases.$(OBJEXT) \ libpureftpd_a-dynamic.$(OBJEXT) \ libpureftpd_a-fakesnprintf.$(OBJEXT) \ libpureftpd_a-fakechroot.$(OBJEXT) \ libpureftpd_a-ftp_parser.$(OBJEXT) \ libpureftpd_a-ftpd.$(OBJEXT) \ libpureftpd_a-ftpwho-update.$(OBJEXT) \ libpureftpd_a-ftpwho-read.$(OBJEXT) \ libpureftpd_a-getloadavg.$(OBJEXT) \ libpureftpd_a-ipstack.$(OBJEXT) \ libpureftpd_a-log_unix.$(OBJEXT) \ libpureftpd_a-log_mysql.$(OBJEXT) \ libpureftpd_a-log_pgsql.$(OBJEXT) \ libpureftpd_a-log_pam.$(OBJEXT) \ libpureftpd_a-log_ldap.$(OBJEXT) \ libpureftpd_a-log_puredb.$(OBJEXT) \ libpureftpd_a-log_extauth.$(OBJEXT) libpureftpd_a-ls.$(OBJEXT) \ libpureftpd_a-mysnprintf.$(OBJEXT) \ libpureftpd_a-parser.$(OBJEXT) libpureftpd_a-privsep.$(OBJEXT) \ libpureftpd_a-quotas.$(OBJEXT) libpureftpd_a-safe_rw.$(OBJEXT) \ libpureftpd_a-simpleconf.$(OBJEXT) \ libpureftpd_a-tls_extcert.$(OBJEXT) \ libpureftpd_a-tls.$(OBJEXT) \ libpureftpd_a-upload-pipe.$(OBJEXT) \ libpureftpd_a-utils.$(OBJEXT) libpureftpd_a_OBJECTS = $(am_libpureftpd_a_OBJECTS) am_ptracetest_OBJECTS = ptracetest.$(OBJEXT) ptracetest_OBJECTS = $(am_ptracetest_OBJECTS) ptracetest_LDADD = $(LDADD) am_pure_authd_OBJECTS = bsd-getopt_long.$(OBJEXT) \ fakesnprintf.$(OBJEXT) mysnprintf.$(OBJEXT) \ pure-authd.$(OBJEXT) safe_rw.$(OBJEXT) pure_authd_OBJECTS = $(am_pure_authd_OBJECTS) pure_authd_LDADD = $(LDADD) am_pure_certd_OBJECTS = bsd-getopt_long.$(OBJEXT) \ fakesnprintf.$(OBJEXT) mysnprintf.$(OBJEXT) \ pure-certd.$(OBJEXT) safe_rw.$(OBJEXT) pure_certd_OBJECTS = $(am_pure_certd_OBJECTS) pure_certd_LDADD = $(LDADD) am_pure_ftpd_OBJECTS = main.$(OBJEXT) pure_ftpd_OBJECTS = $(am_pure_ftpd_OBJECTS) pure_ftpd_DEPENDENCIES = libpureftpd.a ../puredb/src/libpuredb_read.a am_pure_ftpwho_OBJECTS = bsd-getopt_long.$(OBJEXT) \ fakesnprintf.$(OBJEXT) ipstack.$(OBJEXT) mysnprintf.$(OBJEXT) \ pure-ftpwho.$(OBJEXT) pure_ftpwho_OBJECTS = $(am_pure_ftpwho_OBJECTS) pure_ftpwho_LDADD = $(LDADD) am_pure_mrtginfo_OBJECTS = pure_mrtginfo-daemons.$(OBJEXT) \ pure_mrtginfo-fakesnprintf.$(OBJEXT) \ pure_mrtginfo-pure-mrtginfo.$(OBJEXT) \ pure_mrtginfo-mysnprintf.$(OBJEXT) pure_mrtginfo_OBJECTS = $(am_pure_mrtginfo_OBJECTS) pure_mrtginfo_LDADD = $(LDADD) pure_mrtginfo_LINK = $(CCLD) $(pure_mrtginfo_CFLAGS) $(CFLAGS) \ $(AM_LDFLAGS) $(LDFLAGS) -o $@ am_pure_pw_OBJECTS = alt_arc4random.$(OBJEXT) \ bsd-getopt_long.$(OBJEXT) fakesnprintf.$(OBJEXT) \ mysnprintf.$(OBJEXT) pure-pw.$(OBJEXT) safe_rw.$(OBJEXT) \ utils.$(OBJEXT) pure_pw_OBJECTS = $(am_pure_pw_OBJECTS) pure_pw_DEPENDENCIES = ../puredb/src/libpuredb_write.a am_pure_pwconvert_OBJECTS = fakesnprintf.$(OBJEXT) \ mysnprintf.$(OBJEXT) pure-pwconvert.$(OBJEXT) pure_pwconvert_OBJECTS = $(am_pure_pwconvert_OBJECTS) pure_pwconvert_LDADD = $(LDADD) am_pure_quotacheck_OBJECTS = bsd-getopt_long.$(OBJEXT) \ fakesnprintf.$(OBJEXT) mysnprintf.$(OBJEXT) \ pure-quotacheck.$(OBJEXT) safe_rw.$(OBJEXT) pure_quotacheck_OBJECTS = $(am_pure_quotacheck_OBJECTS) pure_quotacheck_LDADD = $(LDADD) am_pure_statsdecode_OBJECTS = fakesnprintf.$(OBJEXT) \ mysnprintf.$(OBJEXT) pure-statsdecode.$(OBJEXT) pure_statsdecode_OBJECTS = $(am_pure_statsdecode_OBJECTS) pure_statsdecode_LDADD = $(LDADD) am_pure_uploadscript_OBJECTS = bsd-getopt_long.$(OBJEXT) \ fakesnprintf.$(OBJEXT) mysnprintf.$(OBJEXT) \ pure-uploadscript.$(OBJEXT) safe_rw.$(OBJEXT) pure_uploadscript_OBJECTS = $(am_pure_uploadscript_OBJECTS) pure_uploadscript_LDADD = $(LDADD) AM_V_P = $(am__v_P_@AM_V@) am__v_P_ = $(am__v_P_@AM_DEFAULT_V@) am__v_P_0 = false am__v_P_1 = : AM_V_GEN = $(am__v_GEN_@AM_V@) am__v_GEN_ = $(am__v_GEN_@AM_DEFAULT_V@) am__v_GEN_0 = @echo " GEN " $@; am__v_GEN_1 = AM_V_at = $(am__v_at_@AM_V@) am__v_at_ = $(am__v_at_@AM_DEFAULT_V@) am__v_at_0 = @ am__v_at_1 = DEFAULT_INCLUDES = -I.@am__isrc@ -I$(top_builddir) depcomp = $(SHELL) $(top_srcdir)/depcomp am__maybe_remake_depfiles = depfiles am__depfiles_remade = ./$(DEPDIR)/alt_arc4random.Po \ ./$(DEPDIR)/bsd-getopt_long.Po ./$(DEPDIR)/fakesnprintf.Po \ ./$(DEPDIR)/ipstack.Po \ ./$(DEPDIR)/libpureftpd_a-alt_arc4random.Po \ ./$(DEPDIR)/libpureftpd_a-altlog.Po \ ./$(DEPDIR)/libpureftpd_a-bonjour.Po \ ./$(DEPDIR)/libpureftpd_a-bsd-getopt_long.Po \ ./$(DEPDIR)/libpureftpd_a-bsd-glob.Po \ ./$(DEPDIR)/libpureftpd_a-bsd-realpath.Po \ ./$(DEPDIR)/libpureftpd_a-caps.Po \ ./$(DEPDIR)/libpureftpd_a-crypto-md5.Po \ ./$(DEPDIR)/libpureftpd_a-crypto-sha1.Po \ ./$(DEPDIR)/libpureftpd_a-crypto.Po \ ./$(DEPDIR)/libpureftpd_a-daemons.Po \ ./$(DEPDIR)/libpureftpd_a-diraliases.Po \ ./$(DEPDIR)/libpureftpd_a-dynamic.Po \ ./$(DEPDIR)/libpureftpd_a-fakechroot.Po \ ./$(DEPDIR)/libpureftpd_a-fakesnprintf.Po \ ./$(DEPDIR)/libpureftpd_a-ftp_parser.Po \ ./$(DEPDIR)/libpureftpd_a-ftpd.Po \ ./$(DEPDIR)/libpureftpd_a-ftpwho-read.Po \ ./$(DEPDIR)/libpureftpd_a-ftpwho-update.Po \ ./$(DEPDIR)/libpureftpd_a-getloadavg.Po \ ./$(DEPDIR)/libpureftpd_a-ipstack.Po \ ./$(DEPDIR)/libpureftpd_a-log_extauth.Po \ ./$(DEPDIR)/libpureftpd_a-log_ldap.Po \ ./$(DEPDIR)/libpureftpd_a-log_mysql.Po \ ./$(DEPDIR)/libpureftpd_a-log_pam.Po \ ./$(DEPDIR)/libpureftpd_a-log_pgsql.Po \ ./$(DEPDIR)/libpureftpd_a-log_puredb.Po \ ./$(DEPDIR)/libpureftpd_a-log_unix.Po \ ./$(DEPDIR)/libpureftpd_a-ls.Po \ ./$(DEPDIR)/libpureftpd_a-mysnprintf.Po \ ./$(DEPDIR)/libpureftpd_a-parser.Po \ ./$(DEPDIR)/libpureftpd_a-privsep.Po \ ./$(DEPDIR)/libpureftpd_a-quotas.Po \ ./$(DEPDIR)/libpureftpd_a-safe_rw.Po \ ./$(DEPDIR)/libpureftpd_a-simpleconf.Po \ ./$(DEPDIR)/libpureftpd_a-tls.Po \ ./$(DEPDIR)/libpureftpd_a-tls_extcert.Po \ ./$(DEPDIR)/libpureftpd_a-upload-pipe.Po \ ./$(DEPDIR)/libpureftpd_a-utils.Po ./$(DEPDIR)/main.Po \ ./$(DEPDIR)/mysnprintf.Po ./$(DEPDIR)/ptracetest.Po \ ./$(DEPDIR)/pure-authd.Po ./$(DEPDIR)/pure-certd.Po \ ./$(DEPDIR)/pure-ftpwho.Po ./$(DEPDIR)/pure-pw.Po \ ./$(DEPDIR)/pure-pwconvert.Po ./$(DEPDIR)/pure-quotacheck.Po \ ./$(DEPDIR)/pure-statsdecode.Po \ ./$(DEPDIR)/pure-uploadscript.Po \ ./$(DEPDIR)/pure_mrtginfo-daemons.Po \ ./$(DEPDIR)/pure_mrtginfo-fakesnprintf.Po \ ./$(DEPDIR)/pure_mrtginfo-mysnprintf.Po \ ./$(DEPDIR)/pure_mrtginfo-pure-mrtginfo.Po \ ./$(DEPDIR)/safe_rw.Po ./$(DEPDIR)/utils.Po am__mv = mv -f AM_V_lt = $(am__v_lt_@AM_V@) am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) am__v_lt_0 = --silent am__v_lt_1 = COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) AM_V_CC = $(am__v_CC_@AM_V@) am__v_CC_ = $(am__v_CC_@AM_DEFAULT_V@) am__v_CC_0 = @echo " CC " $@; am__v_CC_1 = CCLD = $(CC) LINK = $(CCLD) $(AM_CFLAGS) $(CFLAGS) $(AM_LDFLAGS) $(LDFLAGS) -o $@ AM_V_CCLD = $(am__v_CCLD_@AM_V@) am__v_CCLD_ = $(am__v_CCLD_@AM_DEFAULT_V@) am__v_CCLD_0 = @echo " CCLD " $@; am__v_CCLD_1 = SOURCES = $(libpureftpd_a_SOURCES) $(ptracetest_SOURCES) \ $(pure_authd_SOURCES) $(pure_certd_SOURCES) \ $(pure_ftpd_SOURCES) $(pure_ftpwho_SOURCES) \ $(pure_mrtginfo_SOURCES) $(pure_pw_SOURCES) \ $(pure_pwconvert_SOURCES) $(pure_quotacheck_SOURCES) \ $(pure_statsdecode_SOURCES) $(pure_uploadscript_SOURCES) DIST_SOURCES = $(libpureftpd_a_SOURCES) $(ptracetest_SOURCES) \ $(pure_authd_SOURCES) $(pure_certd_SOURCES) \ $(pure_ftpd_SOURCES) $(pure_ftpwho_SOURCES) \ $(pure_mrtginfo_SOURCES) $(pure_pw_SOURCES) \ $(pure_pwconvert_SOURCES) $(pure_quotacheck_SOURCES) \ $(pure_statsdecode_SOURCES) $(pure_uploadscript_SOURCES) am__can_run_installinfo = \ case $$AM_UPDATE_INFO_DIR in \ n|no|NO) false;; \ *) (install-info --version) >/dev/null 2>&1;; \ esac am__tagged_files = $(HEADERS) $(SOURCES) $(TAGS_FILES) $(LISP) # Read a list of newline-separated strings from the standard input, # and print each of them once, without duplicates. Input order is # *not* preserved. am__uniquify_input = $(AWK) '\ BEGIN { nonempty = 0; } \ { items[$$0] = 1; nonempty = 1; } \ END { if (nonempty) { for (i in items) print i; }; } \ ' # Make sure the list of sources is unique. This is necessary because, # e.g., the same source file might be shared among _SOURCES variables # for different programs/libraries. am__define_uniq_tagged_files = \ list='$(am__tagged_files)'; \ unique=`for i in $$list; do \ if test -f "$$i"; then echo $$i; else echo $(srcdir)/$$i; fi; \ done | $(am__uniquify_input)` ETAGS = etags CTAGS = ctags am__DIST_COMMON = $(srcdir)/Makefile.in $(top_srcdir)/depcomp DISTFILES = $(DIST_COMMON) $(DIST_SOURCES) $(TEXINFOS) $(EXTRA_DIST) ACLOCAL = @ACLOCAL@ ALLOCA = @ALLOCA@ AMTAR = @AMTAR@ AM_DEFAULT_VERBOSITY = @AM_DEFAULT_VERBOSITY@ AUTOCONF = @AUTOCONF@ AUTOHEADER = @AUTOHEADER@ AUTOMAKE = @AUTOMAKE@ AWK = @AWK@ BONJOUR_LDADD = @BONJOUR_LDADD@ CC = @CC@ CCDEPMODE = @CCDEPMODE@ CFLAGS = @CFLAGS@ CONFDIR = @CONFDIR@ CPP = @CPP@ CPPFLAGS = @CPPFLAGS@ CWFLAGS = @CWFLAGS@ CYGPATH_W = @CYGPATH_W@ DEFS = @DEFS@ DEPDIR = @DEPDIR@ ECHO_C = @ECHO_C@ ECHO_N = @ECHO_N@ ECHO_T = @ECHO_T@ EGREP = @EGREP@ EXEEXT = @EXEEXT@ GETLOADAVG_LIBS = @GETLOADAVG_LIBS@ GREP = @GREP@ INSTALL = @INSTALL@ INSTALL_DATA = @INSTALL_DATA@ INSTALL_PROGRAM = @INSTALL_PROGRAM@ INSTALL_SCRIPT = @INSTALL_SCRIPT@ INSTALL_STRIP_PROGRAM = @INSTALL_STRIP_PROGRAM@ KMEM_GROUP = @KMEM_GROUP@ LDAP_SSL_LIBS = @LDAP_SSL_LIBS@ LDFLAGS = @LDFLAGS@ LIBOBJS = @LIBOBJS@ LIBS = @LIBS@ LOCALSTATEDIR = @LOCALSTATEDIR@ LTLIBOBJS = @LTLIBOBJS@ MAINT = @MAINT@ MAKEINFO = @MAKEINFO@ MKDIR_P = @MKDIR_P@ NEED_SETGID = @NEED_SETGID@ OBJEXT = @OBJEXT@ PACKAGE = @PACKAGE@ PACKAGE_BUGREPORT = @PACKAGE_BUGREPORT@ PACKAGE_NAME = @PACKAGE_NAME@ PACKAGE_STRING = @PACKAGE_STRING@ PACKAGE_TARNAME = @PACKAGE_TARNAME@ PACKAGE_URL = @PACKAGE_URL@ PACKAGE_VERSION = @PACKAGE_VERSION@ PATH_SEPARATOR = @PATH_SEPARATOR@ POW_LIB = @POW_LIB@ RANLIB = @RANLIB@ SET_MAKE = @SET_MAKE@ SHELL = @SHELL@ STRIP = @STRIP@ VERSION = @VERSION@ abs_builddir = @abs_builddir@ abs_srcdir = @abs_srcdir@ abs_top_builddir = @abs_top_builddir@ abs_top_srcdir = @abs_top_srcdir@ ac_ct_CC = @ac_ct_CC@ am__include = @am__include@ am__leading_dot = @am__leading_dot@ am__quote = @am__quote@ am__tar = @am__tar@ am__untar = @am__untar@ bindir = @bindir@ build_alias = @build_alias@ builddir = @builddir@ certfile = @certfile@ datadir = @datadir@ datarootdir = @datarootdir@ docdir = @docdir@ dvidir = @dvidir@ exec_prefix = @exec_prefix@ host_alias = @host_alias@ htmldir = @htmldir@ includedir = @includedir@ infodir = @infodir@ install_sh = @install_sh@ keyfile = @keyfile@ libdir = @libdir@ libexecdir = @libexecdir@ localedir = @localedir@ localstatedir = @localstatedir@ mandir = @mandir@ mkdir_p = @mkdir_p@ oldincludedir = @oldincludedir@ pdfdir = @pdfdir@ prefix = @prefix@ program_transform_name = @program_transform_name@ psdir = @psdir@ sbindir = @sbindir@ sharedstatedir = @sharedstatedir@ srcdir = @srcdir@ sysconfdir = @sysconfdir@ target_alias = @target_alias@ top_build_prefix = @top_build_prefix@ top_builddir = @top_builddir@ top_srcdir = @top_srcdir@ noinst_LIBRARIES = libpureftpd.a libpureftpd_a_CFLAGS = -DINCLUDE_IO_WRAPPERS=1 libpureftpd_a_DEPENDS = \ ../puredb/src/libpuredb_read.a libpureftpd_a_SOURCES = \ altlog.c \ altlog.h \ alt_arc4random.c \ alt_arc4random.h \ bonjour.h \ bonjour.c \ bsd-glob.c \ bsd-glob.h \ bsd-realpath.h \ bsd-realpath.c \ bsd-getopt_long.c \ bsd-getopt_long.h \ caps.c \ caps_p.h \ caps.h \ crypto.c \ crypto.h \ crypto-md5.c \ crypto-md5.h \ crypto-sha1.c \ crypto-sha1.h \ daemons.c \ diraliases.h \ diraliases.c \ dynamic.c \ dynamic.h \ fakesnprintf.h \ fakesnprintf.c \ fakechroot.h \ fakechroot.c \ ftp_parser.c \ ftpd.c \ ftpd_p.h \ ftpd.h \ ftpwho-update.c \ ftpwho-update.h \ ftpwho-update_p.h \ ftpwho-read.h \ ftpwho-read.c \ getloadavg.h \ getloadavg.c \ globals.h \ ipstack.c \ ipstack.h \ log_unix.c \ log_unix.h \ log_mysql.c \ log_mysql.h \ log_mysql_p.h \ log_pgsql.c \ log_pgsql.h \ log_pgsql_p.h \ log_pam.c \ log_pam.h \ log_ldap.c \ log_ldap.h \ log_ldap_p.h \ log_puredb.c \ log_puredb.h \ log_extauth.c \ log_extauth.h \ log_extauth_p.h \ ls.c \ ls_p.h \ messages.h \ messages_cs_cz.h \ messages_da.h \ messages_de.h \ messages_en.h \ messages_es.h \ messages_fr.h \ messages_fr_funny.h \ messages_hu.h \ messages_it.h \ messages_kr.h \ messages_nl.h \ messages_pl.h \ messages_pt_br.h \ messages_ro.h \ messages_sk.h \ messages_sq.h \ messages_sv.h \ messages_no.h \ messages_ru.h \ messages_tr.h \ messages_zh_cn.h \ messages_zh_tw.h \ mysnprintf.c \ mysnprintf.h \ parser.c \ parser_p.h \ parser.h \ privsep.h \ privsep_p.h \ privsep.c \ quotas.h \ quotas.c \ safe_rw.h \ safe_rw.c \ simpleconf.h \ simpleconf_ftpd.h \ simpleconf.c \ syslognames.h \ tls.h \ tls_extcert.h \ tls_extcert_p.h \ tls_extcert.c \ tls.c \ upload-pipe.c \ upload-pipe.h \ utils.c \ utils.h pure_ftpd_DEPENDS = \ libpureftpd.a \ ../puredb/src/libpuredb_read.a pure_ftpd_LDADD = \ libpureftpd.a \ ../puredb/src/libpuredb_read.a \ @LDAP_SSL_LIBS@ @GETLOADAVG_LIBS@ @BONJOUR_LDADD@ pure_ftpd_SOURCES = \ main.c pure_mrtginfo_CFLAGS = -DIN_PURE_MRTGINFO=1 pure_mrtginfo_SOURCES = \ daemons.c \ fakesnprintf.h \ fakesnprintf.c \ messages.h \ pure-mrtginfo.c \ mysnprintf.c \ mysnprintf.h pure_ftpwho_SOURCES = \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ ftpwho-update.h \ ipstack.c \ ipstack.h \ mysnprintf.c \ mysnprintf.h \ pure-ftpwho.c \ syslognames.h pure_uploadscript_SOURCES = \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ ftpwho-update.h \ mysnprintf.c \ mysnprintf.h \ pure-uploadscript.c \ pure-uploadscript_p.h \ safe_rw.c \ safe_rw.h \ syslognames.h pure_statsdecode_SOURCES = \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-statsdecode.c pure_quotacheck_SOURCES = \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-quotacheck.c \ safe_rw.c \ safe_rw.h pure_pw_DEPENDS = \ ../puredb/src/libpuredb_write.a pure_pw_LDADD = \ ../puredb/src/libpuredb_write.a pure_pw_SOURCES = \ alt_arc4random.c \ alt_arc4random.h \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-pw.c \ pure-pw.h \ safe_rw.c \ safe_rw.h \ utils.c \ utils.h pure_pwconvert_SOURCES = \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-pwconvert.c pure_authd_SOURCES = \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-authd.c \ pure-authd_p.h \ safe_rw.c \ safe_rw.h pure_certd_SOURCES = \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-certd.c \ pure-certd_p.h \ safe_rw.c \ safe_rw.h ptracetest_SOURCES = \ ptracetest.c all: all-am .SUFFIXES: .SUFFIXES: .c .o .obj $(srcdir)/Makefile.in: @MAINTAINER_MODE_TRUE@ $(srcdir)/Makefile.am $(am__configure_deps) @for dep in $?; do \ case '$(am__configure_deps)' in \ *$$dep*) \ ( cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh ) \ && { if test -f $@; then exit 0; else break; fi; }; \ exit 1;; \ esac; \ done; \ echo ' cd $(top_srcdir) && $(AUTOMAKE) --gnu src/Makefile'; \ $(am__cd) $(top_srcdir) && \ $(AUTOMAKE) --gnu src/Makefile Makefile: $(srcdir)/Makefile.in $(top_builddir)/config.status @case '$?' in \ *config.status*) \ cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh;; \ *) \ echo ' cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles)'; \ cd $(top_builddir) && $(SHELL) ./config.status $(subdir)/$@ $(am__maybe_remake_depfiles);; \ esac; $(top_builddir)/config.status: $(top_srcdir)/configure $(CONFIG_STATUS_DEPENDENCIES) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(top_srcdir)/configure: @MAINTAINER_MODE_TRUE@ $(am__configure_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(ACLOCAL_M4): @MAINTAINER_MODE_TRUE@ $(am__aclocal_m4_deps) cd $(top_builddir) && $(MAKE) $(AM_MAKEFLAGS) am--refresh $(am__aclocal_m4_deps): install-binPROGRAMS: $(bin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(bindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(bindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(bindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(bindir)$$dir" || exit $$?; \ } \ ; done uninstall-binPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(bin_PROGRAMS)'; test -n "$(bindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(bindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(bindir)" && rm -f $$files clean-binPROGRAMS: -test -z "$(bin_PROGRAMS)" || rm -f $(bin_PROGRAMS) clean-noinstPROGRAMS: -test -z "$(noinst_PROGRAMS)" || rm -f $(noinst_PROGRAMS) install-sbinPROGRAMS: $(sbin_PROGRAMS) @$(NORMAL_INSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ if test -n "$$list"; then \ echo " $(MKDIR_P) '$(DESTDIR)$(sbindir)'"; \ $(MKDIR_P) "$(DESTDIR)$(sbindir)" || exit 1; \ fi; \ for p in $$list; do echo "$$p $$p"; done | \ sed 's/$(EXEEXT)$$//' | \ while read p p1; do if test -f $$p \ ; then echo "$$p"; echo "$$p"; else :; fi; \ done | \ sed -e 'p;s,.*/,,;n;h' \ -e 's|.*|.|' \ -e 'p;x;s,.*/,,;s/$(EXEEXT)$$//;$(transform);s/$$/$(EXEEXT)/' | \ sed 'N;N;N;s,\n, ,g' | \ $(AWK) 'BEGIN { files["."] = ""; dirs["."] = 1 } \ { d=$$3; if (dirs[d] != 1) { print "d", d; dirs[d] = 1 } \ if ($$2 == $$4) files[d] = files[d] " " $$1; \ else { print "f", $$3 "/" $$4, $$1; } } \ END { for (d in files) print "f", d, files[d] }' | \ while read type dir files; do \ if test "$$dir" = .; then dir=; else dir=/$$dir; fi; \ test -z "$$files" || { \ echo " $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files '$(DESTDIR)$(sbindir)$$dir'"; \ $(INSTALL_PROGRAM_ENV) $(INSTALL_PROGRAM) $$files "$(DESTDIR)$(sbindir)$$dir" || exit $$?; \ } \ ; done uninstall-sbinPROGRAMS: @$(NORMAL_UNINSTALL) @list='$(sbin_PROGRAMS)'; test -n "$(sbindir)" || list=; \ files=`for p in $$list; do echo "$$p"; done | \ sed -e 'h;s,^.*/,,;s/$(EXEEXT)$$//;$(transform)' \ -e 's/$$/$(EXEEXT)/' \ `; \ test -n "$$list" || exit 0; \ echo " ( cd '$(DESTDIR)$(sbindir)' && rm -f" $$files ")"; \ cd "$(DESTDIR)$(sbindir)" && rm -f $$files clean-sbinPROGRAMS: -test -z "$(sbin_PROGRAMS)" || rm -f $(sbin_PROGRAMS) clean-noinstLIBRARIES: -test -z "$(noinst_LIBRARIES)" || rm -f $(noinst_LIBRARIES) libpureftpd.a: $(libpureftpd_a_OBJECTS) $(libpureftpd_a_DEPENDENCIES) $(EXTRA_libpureftpd_a_DEPENDENCIES) $(AM_V_at)-rm -f libpureftpd.a $(AM_V_AR)$(libpureftpd_a_AR) libpureftpd.a $(libpureftpd_a_OBJECTS) $(libpureftpd_a_LIBADD) $(AM_V_at)$(RANLIB) libpureftpd.a ptracetest$(EXEEXT): $(ptracetest_OBJECTS) $(ptracetest_DEPENDENCIES) $(EXTRA_ptracetest_DEPENDENCIES) @rm -f ptracetest$(EXEEXT) $(AM_V_CCLD)$(LINK) $(ptracetest_OBJECTS) $(ptracetest_LDADD) $(LIBS) pure-authd$(EXEEXT): $(pure_authd_OBJECTS) $(pure_authd_DEPENDENCIES) $(EXTRA_pure_authd_DEPENDENCIES) @rm -f pure-authd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pure_authd_OBJECTS) $(pure_authd_LDADD) $(LIBS) pure-certd$(EXEEXT): $(pure_certd_OBJECTS) $(pure_certd_DEPENDENCIES) $(EXTRA_pure_certd_DEPENDENCIES) @rm -f pure-certd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pure_certd_OBJECTS) $(pure_certd_LDADD) $(LIBS) pure-ftpd$(EXEEXT): $(pure_ftpd_OBJECTS) $(pure_ftpd_DEPENDENCIES) $(EXTRA_pure_ftpd_DEPENDENCIES) @rm -f pure-ftpd$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pure_ftpd_OBJECTS) $(pure_ftpd_LDADD) $(LIBS) pure-ftpwho$(EXEEXT): $(pure_ftpwho_OBJECTS) $(pure_ftpwho_DEPENDENCIES) $(EXTRA_pure_ftpwho_DEPENDENCIES) @rm -f pure-ftpwho$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pure_ftpwho_OBJECTS) $(pure_ftpwho_LDADD) $(LIBS) pure-mrtginfo$(EXEEXT): $(pure_mrtginfo_OBJECTS) $(pure_mrtginfo_DEPENDENCIES) $(EXTRA_pure_mrtginfo_DEPENDENCIES) @rm -f pure-mrtginfo$(EXEEXT) $(AM_V_CCLD)$(pure_mrtginfo_LINK) $(pure_mrtginfo_OBJECTS) $(pure_mrtginfo_LDADD) $(LIBS) pure-pw$(EXEEXT): $(pure_pw_OBJECTS) $(pure_pw_DEPENDENCIES) $(EXTRA_pure_pw_DEPENDENCIES) @rm -f pure-pw$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pure_pw_OBJECTS) $(pure_pw_LDADD) $(LIBS) pure-pwconvert$(EXEEXT): $(pure_pwconvert_OBJECTS) $(pure_pwconvert_DEPENDENCIES) $(EXTRA_pure_pwconvert_DEPENDENCIES) @rm -f pure-pwconvert$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pure_pwconvert_OBJECTS) $(pure_pwconvert_LDADD) $(LIBS) pure-quotacheck$(EXEEXT): $(pure_quotacheck_OBJECTS) $(pure_quotacheck_DEPENDENCIES) $(EXTRA_pure_quotacheck_DEPENDENCIES) @rm -f pure-quotacheck$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pure_quotacheck_OBJECTS) $(pure_quotacheck_LDADD) $(LIBS) pure-statsdecode$(EXEEXT): $(pure_statsdecode_OBJECTS) $(pure_statsdecode_DEPENDENCIES) $(EXTRA_pure_statsdecode_DEPENDENCIES) @rm -f pure-statsdecode$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pure_statsdecode_OBJECTS) $(pure_statsdecode_LDADD) $(LIBS) pure-uploadscript$(EXEEXT): $(pure_uploadscript_OBJECTS) $(pure_uploadscript_DEPENDENCIES) $(EXTRA_pure_uploadscript_DEPENDENCIES) @rm -f pure-uploadscript$(EXEEXT) $(AM_V_CCLD)$(LINK) $(pure_uploadscript_OBJECTS) $(pure_uploadscript_LDADD) $(LIBS) mostlyclean-compile: -rm -f *.$(OBJEXT) distclean-compile: -rm -f *.tab.c @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/alt_arc4random.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/bsd-getopt_long.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/fakesnprintf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ipstack.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-alt_arc4random.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-altlog.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-bonjour.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-bsd-getopt_long.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-bsd-glob.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-bsd-realpath.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-caps.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-crypto-md5.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-crypto-sha1.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-crypto.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-daemons.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-diraliases.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-dynamic.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-fakechroot.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-fakesnprintf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-ftp_parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-ftpd.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-ftpwho-read.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-ftpwho-update.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-getloadavg.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-ipstack.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-log_extauth.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-log_ldap.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-log_mysql.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-log_pam.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-log_pgsql.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-log_puredb.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-log_unix.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-ls.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-mysnprintf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-parser.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-privsep.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-quotas.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-safe_rw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-simpleconf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-tls.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-tls_extcert.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-upload-pipe.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/libpureftpd_a-utils.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/main.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/mysnprintf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/ptracetest.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure-authd.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure-certd.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure-ftpwho.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure-pw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure-pwconvert.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure-quotacheck.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure-statsdecode.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure-uploadscript.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure_mrtginfo-daemons.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure_mrtginfo-fakesnprintf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure_mrtginfo-mysnprintf.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pure_mrtginfo-pure-mrtginfo.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/safe_rw.Po@am__quote@ # am--include-marker @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/utils.Po@am__quote@ # am--include-marker $(am__depfiles_remade): @$(MKDIR_P) $(@D) @echo '# dummy' >$@-t && $(am__mv) $@-t $@ am--depfiles: $(am__depfiles_remade) .c.o: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ $< @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ $< .c.obj: @am__fastdepCC_TRUE@ $(AM_V_CC)$(COMPILE) -MT $@ -MD -MP -MF $(DEPDIR)/$*.Tpo -c -o $@ `$(CYGPATH_W) '$<'` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/$*.Tpo $(DEPDIR)/$*.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$<' object='$@' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(COMPILE) -c -o $@ `$(CYGPATH_W) '$<'` libpureftpd_a-altlog.o: altlog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-altlog.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-altlog.Tpo -c -o libpureftpd_a-altlog.o `test -f 'altlog.c' || echo '$(srcdir)/'`altlog.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-altlog.Tpo $(DEPDIR)/libpureftpd_a-altlog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='altlog.c' object='libpureftpd_a-altlog.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-altlog.o `test -f 'altlog.c' || echo '$(srcdir)/'`altlog.c libpureftpd_a-altlog.obj: altlog.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-altlog.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-altlog.Tpo -c -o libpureftpd_a-altlog.obj `if test -f 'altlog.c'; then $(CYGPATH_W) 'altlog.c'; else $(CYGPATH_W) '$(srcdir)/altlog.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-altlog.Tpo $(DEPDIR)/libpureftpd_a-altlog.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='altlog.c' object='libpureftpd_a-altlog.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-altlog.obj `if test -f 'altlog.c'; then $(CYGPATH_W) 'altlog.c'; else $(CYGPATH_W) '$(srcdir)/altlog.c'; fi` libpureftpd_a-alt_arc4random.o: alt_arc4random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-alt_arc4random.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-alt_arc4random.Tpo -c -o libpureftpd_a-alt_arc4random.o `test -f 'alt_arc4random.c' || echo '$(srcdir)/'`alt_arc4random.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-alt_arc4random.Tpo $(DEPDIR)/libpureftpd_a-alt_arc4random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alt_arc4random.c' object='libpureftpd_a-alt_arc4random.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-alt_arc4random.o `test -f 'alt_arc4random.c' || echo '$(srcdir)/'`alt_arc4random.c libpureftpd_a-alt_arc4random.obj: alt_arc4random.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-alt_arc4random.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-alt_arc4random.Tpo -c -o libpureftpd_a-alt_arc4random.obj `if test -f 'alt_arc4random.c'; then $(CYGPATH_W) 'alt_arc4random.c'; else $(CYGPATH_W) '$(srcdir)/alt_arc4random.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-alt_arc4random.Tpo $(DEPDIR)/libpureftpd_a-alt_arc4random.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='alt_arc4random.c' object='libpureftpd_a-alt_arc4random.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-alt_arc4random.obj `if test -f 'alt_arc4random.c'; then $(CYGPATH_W) 'alt_arc4random.c'; else $(CYGPATH_W) '$(srcdir)/alt_arc4random.c'; fi` libpureftpd_a-bonjour.o: bonjour.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-bonjour.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-bonjour.Tpo -c -o libpureftpd_a-bonjour.o `test -f 'bonjour.c' || echo '$(srcdir)/'`bonjour.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-bonjour.Tpo $(DEPDIR)/libpureftpd_a-bonjour.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bonjour.c' object='libpureftpd_a-bonjour.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-bonjour.o `test -f 'bonjour.c' || echo '$(srcdir)/'`bonjour.c libpureftpd_a-bonjour.obj: bonjour.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-bonjour.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-bonjour.Tpo -c -o libpureftpd_a-bonjour.obj `if test -f 'bonjour.c'; then $(CYGPATH_W) 'bonjour.c'; else $(CYGPATH_W) '$(srcdir)/bonjour.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-bonjour.Tpo $(DEPDIR)/libpureftpd_a-bonjour.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bonjour.c' object='libpureftpd_a-bonjour.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-bonjour.obj `if test -f 'bonjour.c'; then $(CYGPATH_W) 'bonjour.c'; else $(CYGPATH_W) '$(srcdir)/bonjour.c'; fi` libpureftpd_a-bsd-glob.o: bsd-glob.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-bsd-glob.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-bsd-glob.Tpo -c -o libpureftpd_a-bsd-glob.o `test -f 'bsd-glob.c' || echo '$(srcdir)/'`bsd-glob.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-bsd-glob.Tpo $(DEPDIR)/libpureftpd_a-bsd-glob.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bsd-glob.c' object='libpureftpd_a-bsd-glob.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-bsd-glob.o `test -f 'bsd-glob.c' || echo '$(srcdir)/'`bsd-glob.c libpureftpd_a-bsd-glob.obj: bsd-glob.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-bsd-glob.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-bsd-glob.Tpo -c -o libpureftpd_a-bsd-glob.obj `if test -f 'bsd-glob.c'; then $(CYGPATH_W) 'bsd-glob.c'; else $(CYGPATH_W) '$(srcdir)/bsd-glob.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-bsd-glob.Tpo $(DEPDIR)/libpureftpd_a-bsd-glob.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bsd-glob.c' object='libpureftpd_a-bsd-glob.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-bsd-glob.obj `if test -f 'bsd-glob.c'; then $(CYGPATH_W) 'bsd-glob.c'; else $(CYGPATH_W) '$(srcdir)/bsd-glob.c'; fi` libpureftpd_a-bsd-realpath.o: bsd-realpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-bsd-realpath.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-bsd-realpath.Tpo -c -o libpureftpd_a-bsd-realpath.o `test -f 'bsd-realpath.c' || echo '$(srcdir)/'`bsd-realpath.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-bsd-realpath.Tpo $(DEPDIR)/libpureftpd_a-bsd-realpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bsd-realpath.c' object='libpureftpd_a-bsd-realpath.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-bsd-realpath.o `test -f 'bsd-realpath.c' || echo '$(srcdir)/'`bsd-realpath.c libpureftpd_a-bsd-realpath.obj: bsd-realpath.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-bsd-realpath.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-bsd-realpath.Tpo -c -o libpureftpd_a-bsd-realpath.obj `if test -f 'bsd-realpath.c'; then $(CYGPATH_W) 'bsd-realpath.c'; else $(CYGPATH_W) '$(srcdir)/bsd-realpath.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-bsd-realpath.Tpo $(DEPDIR)/libpureftpd_a-bsd-realpath.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bsd-realpath.c' object='libpureftpd_a-bsd-realpath.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-bsd-realpath.obj `if test -f 'bsd-realpath.c'; then $(CYGPATH_W) 'bsd-realpath.c'; else $(CYGPATH_W) '$(srcdir)/bsd-realpath.c'; fi` libpureftpd_a-bsd-getopt_long.o: bsd-getopt_long.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-bsd-getopt_long.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-bsd-getopt_long.Tpo -c -o libpureftpd_a-bsd-getopt_long.o `test -f 'bsd-getopt_long.c' || echo '$(srcdir)/'`bsd-getopt_long.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-bsd-getopt_long.Tpo $(DEPDIR)/libpureftpd_a-bsd-getopt_long.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bsd-getopt_long.c' object='libpureftpd_a-bsd-getopt_long.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-bsd-getopt_long.o `test -f 'bsd-getopt_long.c' || echo '$(srcdir)/'`bsd-getopt_long.c libpureftpd_a-bsd-getopt_long.obj: bsd-getopt_long.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-bsd-getopt_long.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-bsd-getopt_long.Tpo -c -o libpureftpd_a-bsd-getopt_long.obj `if test -f 'bsd-getopt_long.c'; then $(CYGPATH_W) 'bsd-getopt_long.c'; else $(CYGPATH_W) '$(srcdir)/bsd-getopt_long.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-bsd-getopt_long.Tpo $(DEPDIR)/libpureftpd_a-bsd-getopt_long.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='bsd-getopt_long.c' object='libpureftpd_a-bsd-getopt_long.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-bsd-getopt_long.obj `if test -f 'bsd-getopt_long.c'; then $(CYGPATH_W) 'bsd-getopt_long.c'; else $(CYGPATH_W) '$(srcdir)/bsd-getopt_long.c'; fi` libpureftpd_a-caps.o: caps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-caps.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-caps.Tpo -c -o libpureftpd_a-caps.o `test -f 'caps.c' || echo '$(srcdir)/'`caps.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-caps.Tpo $(DEPDIR)/libpureftpd_a-caps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps.c' object='libpureftpd_a-caps.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-caps.o `test -f 'caps.c' || echo '$(srcdir)/'`caps.c libpureftpd_a-caps.obj: caps.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-caps.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-caps.Tpo -c -o libpureftpd_a-caps.obj `if test -f 'caps.c'; then $(CYGPATH_W) 'caps.c'; else $(CYGPATH_W) '$(srcdir)/caps.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-caps.Tpo $(DEPDIR)/libpureftpd_a-caps.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='caps.c' object='libpureftpd_a-caps.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-caps.obj `if test -f 'caps.c'; then $(CYGPATH_W) 'caps.c'; else $(CYGPATH_W) '$(srcdir)/caps.c'; fi` libpureftpd_a-crypto.o: crypto.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-crypto.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-crypto.Tpo -c -o libpureftpd_a-crypto.o `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-crypto.Tpo $(DEPDIR)/libpureftpd_a-crypto.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto.c' object='libpureftpd_a-crypto.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-crypto.o `test -f 'crypto.c' || echo '$(srcdir)/'`crypto.c libpureftpd_a-crypto.obj: crypto.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-crypto.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-crypto.Tpo -c -o libpureftpd_a-crypto.obj `if test -f 'crypto.c'; then $(CYGPATH_W) 'crypto.c'; else $(CYGPATH_W) '$(srcdir)/crypto.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-crypto.Tpo $(DEPDIR)/libpureftpd_a-crypto.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto.c' object='libpureftpd_a-crypto.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-crypto.obj `if test -f 'crypto.c'; then $(CYGPATH_W) 'crypto.c'; else $(CYGPATH_W) '$(srcdir)/crypto.c'; fi` libpureftpd_a-crypto-md5.o: crypto-md5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-crypto-md5.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-crypto-md5.Tpo -c -o libpureftpd_a-crypto-md5.o `test -f 'crypto-md5.c' || echo '$(srcdir)/'`crypto-md5.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-crypto-md5.Tpo $(DEPDIR)/libpureftpd_a-crypto-md5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-md5.c' object='libpureftpd_a-crypto-md5.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-crypto-md5.o `test -f 'crypto-md5.c' || echo '$(srcdir)/'`crypto-md5.c libpureftpd_a-crypto-md5.obj: crypto-md5.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-crypto-md5.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-crypto-md5.Tpo -c -o libpureftpd_a-crypto-md5.obj `if test -f 'crypto-md5.c'; then $(CYGPATH_W) 'crypto-md5.c'; else $(CYGPATH_W) '$(srcdir)/crypto-md5.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-crypto-md5.Tpo $(DEPDIR)/libpureftpd_a-crypto-md5.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-md5.c' object='libpureftpd_a-crypto-md5.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-crypto-md5.obj `if test -f 'crypto-md5.c'; then $(CYGPATH_W) 'crypto-md5.c'; else $(CYGPATH_W) '$(srcdir)/crypto-md5.c'; fi` libpureftpd_a-crypto-sha1.o: crypto-sha1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-crypto-sha1.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-crypto-sha1.Tpo -c -o libpureftpd_a-crypto-sha1.o `test -f 'crypto-sha1.c' || echo '$(srcdir)/'`crypto-sha1.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-crypto-sha1.Tpo $(DEPDIR)/libpureftpd_a-crypto-sha1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-sha1.c' object='libpureftpd_a-crypto-sha1.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-crypto-sha1.o `test -f 'crypto-sha1.c' || echo '$(srcdir)/'`crypto-sha1.c libpureftpd_a-crypto-sha1.obj: crypto-sha1.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-crypto-sha1.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-crypto-sha1.Tpo -c -o libpureftpd_a-crypto-sha1.obj `if test -f 'crypto-sha1.c'; then $(CYGPATH_W) 'crypto-sha1.c'; else $(CYGPATH_W) '$(srcdir)/crypto-sha1.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-crypto-sha1.Tpo $(DEPDIR)/libpureftpd_a-crypto-sha1.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='crypto-sha1.c' object='libpureftpd_a-crypto-sha1.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-crypto-sha1.obj `if test -f 'crypto-sha1.c'; then $(CYGPATH_W) 'crypto-sha1.c'; else $(CYGPATH_W) '$(srcdir)/crypto-sha1.c'; fi` libpureftpd_a-daemons.o: daemons.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-daemons.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-daemons.Tpo -c -o libpureftpd_a-daemons.o `test -f 'daemons.c' || echo '$(srcdir)/'`daemons.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-daemons.Tpo $(DEPDIR)/libpureftpd_a-daemons.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemons.c' object='libpureftpd_a-daemons.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-daemons.o `test -f 'daemons.c' || echo '$(srcdir)/'`daemons.c libpureftpd_a-daemons.obj: daemons.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-daemons.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-daemons.Tpo -c -o libpureftpd_a-daemons.obj `if test -f 'daemons.c'; then $(CYGPATH_W) 'daemons.c'; else $(CYGPATH_W) '$(srcdir)/daemons.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-daemons.Tpo $(DEPDIR)/libpureftpd_a-daemons.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemons.c' object='libpureftpd_a-daemons.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-daemons.obj `if test -f 'daemons.c'; then $(CYGPATH_W) 'daemons.c'; else $(CYGPATH_W) '$(srcdir)/daemons.c'; fi` libpureftpd_a-diraliases.o: diraliases.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-diraliases.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-diraliases.Tpo -c -o libpureftpd_a-diraliases.o `test -f 'diraliases.c' || echo '$(srcdir)/'`diraliases.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-diraliases.Tpo $(DEPDIR)/libpureftpd_a-diraliases.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='diraliases.c' object='libpureftpd_a-diraliases.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-diraliases.o `test -f 'diraliases.c' || echo '$(srcdir)/'`diraliases.c libpureftpd_a-diraliases.obj: diraliases.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-diraliases.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-diraliases.Tpo -c -o libpureftpd_a-diraliases.obj `if test -f 'diraliases.c'; then $(CYGPATH_W) 'diraliases.c'; else $(CYGPATH_W) '$(srcdir)/diraliases.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-diraliases.Tpo $(DEPDIR)/libpureftpd_a-diraliases.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='diraliases.c' object='libpureftpd_a-diraliases.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-diraliases.obj `if test -f 'diraliases.c'; then $(CYGPATH_W) 'diraliases.c'; else $(CYGPATH_W) '$(srcdir)/diraliases.c'; fi` libpureftpd_a-dynamic.o: dynamic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-dynamic.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-dynamic.Tpo -c -o libpureftpd_a-dynamic.o `test -f 'dynamic.c' || echo '$(srcdir)/'`dynamic.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-dynamic.Tpo $(DEPDIR)/libpureftpd_a-dynamic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dynamic.c' object='libpureftpd_a-dynamic.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-dynamic.o `test -f 'dynamic.c' || echo '$(srcdir)/'`dynamic.c libpureftpd_a-dynamic.obj: dynamic.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-dynamic.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-dynamic.Tpo -c -o libpureftpd_a-dynamic.obj `if test -f 'dynamic.c'; then $(CYGPATH_W) 'dynamic.c'; else $(CYGPATH_W) '$(srcdir)/dynamic.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-dynamic.Tpo $(DEPDIR)/libpureftpd_a-dynamic.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='dynamic.c' object='libpureftpd_a-dynamic.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-dynamic.obj `if test -f 'dynamic.c'; then $(CYGPATH_W) 'dynamic.c'; else $(CYGPATH_W) '$(srcdir)/dynamic.c'; fi` libpureftpd_a-fakesnprintf.o: fakesnprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-fakesnprintf.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-fakesnprintf.Tpo -c -o libpureftpd_a-fakesnprintf.o `test -f 'fakesnprintf.c' || echo '$(srcdir)/'`fakesnprintf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-fakesnprintf.Tpo $(DEPDIR)/libpureftpd_a-fakesnprintf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fakesnprintf.c' object='libpureftpd_a-fakesnprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-fakesnprintf.o `test -f 'fakesnprintf.c' || echo '$(srcdir)/'`fakesnprintf.c libpureftpd_a-fakesnprintf.obj: fakesnprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-fakesnprintf.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-fakesnprintf.Tpo -c -o libpureftpd_a-fakesnprintf.obj `if test -f 'fakesnprintf.c'; then $(CYGPATH_W) 'fakesnprintf.c'; else $(CYGPATH_W) '$(srcdir)/fakesnprintf.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-fakesnprintf.Tpo $(DEPDIR)/libpureftpd_a-fakesnprintf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fakesnprintf.c' object='libpureftpd_a-fakesnprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-fakesnprintf.obj `if test -f 'fakesnprintf.c'; then $(CYGPATH_W) 'fakesnprintf.c'; else $(CYGPATH_W) '$(srcdir)/fakesnprintf.c'; fi` libpureftpd_a-fakechroot.o: fakechroot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-fakechroot.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-fakechroot.Tpo -c -o libpureftpd_a-fakechroot.o `test -f 'fakechroot.c' || echo '$(srcdir)/'`fakechroot.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-fakechroot.Tpo $(DEPDIR)/libpureftpd_a-fakechroot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fakechroot.c' object='libpureftpd_a-fakechroot.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-fakechroot.o `test -f 'fakechroot.c' || echo '$(srcdir)/'`fakechroot.c libpureftpd_a-fakechroot.obj: fakechroot.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-fakechroot.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-fakechroot.Tpo -c -o libpureftpd_a-fakechroot.obj `if test -f 'fakechroot.c'; then $(CYGPATH_W) 'fakechroot.c'; else $(CYGPATH_W) '$(srcdir)/fakechroot.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-fakechroot.Tpo $(DEPDIR)/libpureftpd_a-fakechroot.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fakechroot.c' object='libpureftpd_a-fakechroot.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-fakechroot.obj `if test -f 'fakechroot.c'; then $(CYGPATH_W) 'fakechroot.c'; else $(CYGPATH_W) '$(srcdir)/fakechroot.c'; fi` libpureftpd_a-ftp_parser.o: ftp_parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ftp_parser.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-ftp_parser.Tpo -c -o libpureftpd_a-ftp_parser.o `test -f 'ftp_parser.c' || echo '$(srcdir)/'`ftp_parser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ftp_parser.Tpo $(DEPDIR)/libpureftpd_a-ftp_parser.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftp_parser.c' object='libpureftpd_a-ftp_parser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ftp_parser.o `test -f 'ftp_parser.c' || echo '$(srcdir)/'`ftp_parser.c libpureftpd_a-ftp_parser.obj: ftp_parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ftp_parser.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-ftp_parser.Tpo -c -o libpureftpd_a-ftp_parser.obj `if test -f 'ftp_parser.c'; then $(CYGPATH_W) 'ftp_parser.c'; else $(CYGPATH_W) '$(srcdir)/ftp_parser.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ftp_parser.Tpo $(DEPDIR)/libpureftpd_a-ftp_parser.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftp_parser.c' object='libpureftpd_a-ftp_parser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ftp_parser.obj `if test -f 'ftp_parser.c'; then $(CYGPATH_W) 'ftp_parser.c'; else $(CYGPATH_W) '$(srcdir)/ftp_parser.c'; fi` libpureftpd_a-ftpd.o: ftpd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ftpd.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-ftpd.Tpo -c -o libpureftpd_a-ftpd.o `test -f 'ftpd.c' || echo '$(srcdir)/'`ftpd.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ftpd.Tpo $(DEPDIR)/libpureftpd_a-ftpd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftpd.c' object='libpureftpd_a-ftpd.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ftpd.o `test -f 'ftpd.c' || echo '$(srcdir)/'`ftpd.c libpureftpd_a-ftpd.obj: ftpd.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ftpd.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-ftpd.Tpo -c -o libpureftpd_a-ftpd.obj `if test -f 'ftpd.c'; then $(CYGPATH_W) 'ftpd.c'; else $(CYGPATH_W) '$(srcdir)/ftpd.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ftpd.Tpo $(DEPDIR)/libpureftpd_a-ftpd.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftpd.c' object='libpureftpd_a-ftpd.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ftpd.obj `if test -f 'ftpd.c'; then $(CYGPATH_W) 'ftpd.c'; else $(CYGPATH_W) '$(srcdir)/ftpd.c'; fi` libpureftpd_a-ftpwho-update.o: ftpwho-update.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ftpwho-update.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-ftpwho-update.Tpo -c -o libpureftpd_a-ftpwho-update.o `test -f 'ftpwho-update.c' || echo '$(srcdir)/'`ftpwho-update.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ftpwho-update.Tpo $(DEPDIR)/libpureftpd_a-ftpwho-update.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftpwho-update.c' object='libpureftpd_a-ftpwho-update.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ftpwho-update.o `test -f 'ftpwho-update.c' || echo '$(srcdir)/'`ftpwho-update.c libpureftpd_a-ftpwho-update.obj: ftpwho-update.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ftpwho-update.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-ftpwho-update.Tpo -c -o libpureftpd_a-ftpwho-update.obj `if test -f 'ftpwho-update.c'; then $(CYGPATH_W) 'ftpwho-update.c'; else $(CYGPATH_W) '$(srcdir)/ftpwho-update.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ftpwho-update.Tpo $(DEPDIR)/libpureftpd_a-ftpwho-update.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftpwho-update.c' object='libpureftpd_a-ftpwho-update.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ftpwho-update.obj `if test -f 'ftpwho-update.c'; then $(CYGPATH_W) 'ftpwho-update.c'; else $(CYGPATH_W) '$(srcdir)/ftpwho-update.c'; fi` libpureftpd_a-ftpwho-read.o: ftpwho-read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ftpwho-read.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-ftpwho-read.Tpo -c -o libpureftpd_a-ftpwho-read.o `test -f 'ftpwho-read.c' || echo '$(srcdir)/'`ftpwho-read.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ftpwho-read.Tpo $(DEPDIR)/libpureftpd_a-ftpwho-read.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftpwho-read.c' object='libpureftpd_a-ftpwho-read.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ftpwho-read.o `test -f 'ftpwho-read.c' || echo '$(srcdir)/'`ftpwho-read.c libpureftpd_a-ftpwho-read.obj: ftpwho-read.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ftpwho-read.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-ftpwho-read.Tpo -c -o libpureftpd_a-ftpwho-read.obj `if test -f 'ftpwho-read.c'; then $(CYGPATH_W) 'ftpwho-read.c'; else $(CYGPATH_W) '$(srcdir)/ftpwho-read.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ftpwho-read.Tpo $(DEPDIR)/libpureftpd_a-ftpwho-read.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ftpwho-read.c' object='libpureftpd_a-ftpwho-read.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ftpwho-read.obj `if test -f 'ftpwho-read.c'; then $(CYGPATH_W) 'ftpwho-read.c'; else $(CYGPATH_W) '$(srcdir)/ftpwho-read.c'; fi` libpureftpd_a-getloadavg.o: getloadavg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-getloadavg.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-getloadavg.Tpo -c -o libpureftpd_a-getloadavg.o `test -f 'getloadavg.c' || echo '$(srcdir)/'`getloadavg.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-getloadavg.Tpo $(DEPDIR)/libpureftpd_a-getloadavg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getloadavg.c' object='libpureftpd_a-getloadavg.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-getloadavg.o `test -f 'getloadavg.c' || echo '$(srcdir)/'`getloadavg.c libpureftpd_a-getloadavg.obj: getloadavg.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-getloadavg.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-getloadavg.Tpo -c -o libpureftpd_a-getloadavg.obj `if test -f 'getloadavg.c'; then $(CYGPATH_W) 'getloadavg.c'; else $(CYGPATH_W) '$(srcdir)/getloadavg.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-getloadavg.Tpo $(DEPDIR)/libpureftpd_a-getloadavg.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='getloadavg.c' object='libpureftpd_a-getloadavg.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-getloadavg.obj `if test -f 'getloadavg.c'; then $(CYGPATH_W) 'getloadavg.c'; else $(CYGPATH_W) '$(srcdir)/getloadavg.c'; fi` libpureftpd_a-ipstack.o: ipstack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ipstack.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-ipstack.Tpo -c -o libpureftpd_a-ipstack.o `test -f 'ipstack.c' || echo '$(srcdir)/'`ipstack.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ipstack.Tpo $(DEPDIR)/libpureftpd_a-ipstack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipstack.c' object='libpureftpd_a-ipstack.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ipstack.o `test -f 'ipstack.c' || echo '$(srcdir)/'`ipstack.c libpureftpd_a-ipstack.obj: ipstack.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ipstack.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-ipstack.Tpo -c -o libpureftpd_a-ipstack.obj `if test -f 'ipstack.c'; then $(CYGPATH_W) 'ipstack.c'; else $(CYGPATH_W) '$(srcdir)/ipstack.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ipstack.Tpo $(DEPDIR)/libpureftpd_a-ipstack.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ipstack.c' object='libpureftpd_a-ipstack.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ipstack.obj `if test -f 'ipstack.c'; then $(CYGPATH_W) 'ipstack.c'; else $(CYGPATH_W) '$(srcdir)/ipstack.c'; fi` libpureftpd_a-log_unix.o: log_unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_unix.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_unix.Tpo -c -o libpureftpd_a-log_unix.o `test -f 'log_unix.c' || echo '$(srcdir)/'`log_unix.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_unix.Tpo $(DEPDIR)/libpureftpd_a-log_unix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_unix.c' object='libpureftpd_a-log_unix.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_unix.o `test -f 'log_unix.c' || echo '$(srcdir)/'`log_unix.c libpureftpd_a-log_unix.obj: log_unix.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_unix.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_unix.Tpo -c -o libpureftpd_a-log_unix.obj `if test -f 'log_unix.c'; then $(CYGPATH_W) 'log_unix.c'; else $(CYGPATH_W) '$(srcdir)/log_unix.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_unix.Tpo $(DEPDIR)/libpureftpd_a-log_unix.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_unix.c' object='libpureftpd_a-log_unix.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_unix.obj `if test -f 'log_unix.c'; then $(CYGPATH_W) 'log_unix.c'; else $(CYGPATH_W) '$(srcdir)/log_unix.c'; fi` libpureftpd_a-log_mysql.o: log_mysql.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_mysql.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_mysql.Tpo -c -o libpureftpd_a-log_mysql.o `test -f 'log_mysql.c' || echo '$(srcdir)/'`log_mysql.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_mysql.Tpo $(DEPDIR)/libpureftpd_a-log_mysql.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_mysql.c' object='libpureftpd_a-log_mysql.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_mysql.o `test -f 'log_mysql.c' || echo '$(srcdir)/'`log_mysql.c libpureftpd_a-log_mysql.obj: log_mysql.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_mysql.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_mysql.Tpo -c -o libpureftpd_a-log_mysql.obj `if test -f 'log_mysql.c'; then $(CYGPATH_W) 'log_mysql.c'; else $(CYGPATH_W) '$(srcdir)/log_mysql.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_mysql.Tpo $(DEPDIR)/libpureftpd_a-log_mysql.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_mysql.c' object='libpureftpd_a-log_mysql.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_mysql.obj `if test -f 'log_mysql.c'; then $(CYGPATH_W) 'log_mysql.c'; else $(CYGPATH_W) '$(srcdir)/log_mysql.c'; fi` libpureftpd_a-log_pgsql.o: log_pgsql.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_pgsql.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_pgsql.Tpo -c -o libpureftpd_a-log_pgsql.o `test -f 'log_pgsql.c' || echo '$(srcdir)/'`log_pgsql.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_pgsql.Tpo $(DEPDIR)/libpureftpd_a-log_pgsql.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_pgsql.c' object='libpureftpd_a-log_pgsql.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_pgsql.o `test -f 'log_pgsql.c' || echo '$(srcdir)/'`log_pgsql.c libpureftpd_a-log_pgsql.obj: log_pgsql.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_pgsql.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_pgsql.Tpo -c -o libpureftpd_a-log_pgsql.obj `if test -f 'log_pgsql.c'; then $(CYGPATH_W) 'log_pgsql.c'; else $(CYGPATH_W) '$(srcdir)/log_pgsql.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_pgsql.Tpo $(DEPDIR)/libpureftpd_a-log_pgsql.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_pgsql.c' object='libpureftpd_a-log_pgsql.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_pgsql.obj `if test -f 'log_pgsql.c'; then $(CYGPATH_W) 'log_pgsql.c'; else $(CYGPATH_W) '$(srcdir)/log_pgsql.c'; fi` libpureftpd_a-log_pam.o: log_pam.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_pam.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_pam.Tpo -c -o libpureftpd_a-log_pam.o `test -f 'log_pam.c' || echo '$(srcdir)/'`log_pam.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_pam.Tpo $(DEPDIR)/libpureftpd_a-log_pam.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_pam.c' object='libpureftpd_a-log_pam.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_pam.o `test -f 'log_pam.c' || echo '$(srcdir)/'`log_pam.c libpureftpd_a-log_pam.obj: log_pam.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_pam.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_pam.Tpo -c -o libpureftpd_a-log_pam.obj `if test -f 'log_pam.c'; then $(CYGPATH_W) 'log_pam.c'; else $(CYGPATH_W) '$(srcdir)/log_pam.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_pam.Tpo $(DEPDIR)/libpureftpd_a-log_pam.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_pam.c' object='libpureftpd_a-log_pam.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_pam.obj `if test -f 'log_pam.c'; then $(CYGPATH_W) 'log_pam.c'; else $(CYGPATH_W) '$(srcdir)/log_pam.c'; fi` libpureftpd_a-log_ldap.o: log_ldap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_ldap.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_ldap.Tpo -c -o libpureftpd_a-log_ldap.o `test -f 'log_ldap.c' || echo '$(srcdir)/'`log_ldap.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_ldap.Tpo $(DEPDIR)/libpureftpd_a-log_ldap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_ldap.c' object='libpureftpd_a-log_ldap.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_ldap.o `test -f 'log_ldap.c' || echo '$(srcdir)/'`log_ldap.c libpureftpd_a-log_ldap.obj: log_ldap.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_ldap.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_ldap.Tpo -c -o libpureftpd_a-log_ldap.obj `if test -f 'log_ldap.c'; then $(CYGPATH_W) 'log_ldap.c'; else $(CYGPATH_W) '$(srcdir)/log_ldap.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_ldap.Tpo $(DEPDIR)/libpureftpd_a-log_ldap.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_ldap.c' object='libpureftpd_a-log_ldap.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_ldap.obj `if test -f 'log_ldap.c'; then $(CYGPATH_W) 'log_ldap.c'; else $(CYGPATH_W) '$(srcdir)/log_ldap.c'; fi` libpureftpd_a-log_puredb.o: log_puredb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_puredb.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_puredb.Tpo -c -o libpureftpd_a-log_puredb.o `test -f 'log_puredb.c' || echo '$(srcdir)/'`log_puredb.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_puredb.Tpo $(DEPDIR)/libpureftpd_a-log_puredb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_puredb.c' object='libpureftpd_a-log_puredb.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_puredb.o `test -f 'log_puredb.c' || echo '$(srcdir)/'`log_puredb.c libpureftpd_a-log_puredb.obj: log_puredb.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_puredb.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_puredb.Tpo -c -o libpureftpd_a-log_puredb.obj `if test -f 'log_puredb.c'; then $(CYGPATH_W) 'log_puredb.c'; else $(CYGPATH_W) '$(srcdir)/log_puredb.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_puredb.Tpo $(DEPDIR)/libpureftpd_a-log_puredb.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_puredb.c' object='libpureftpd_a-log_puredb.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_puredb.obj `if test -f 'log_puredb.c'; then $(CYGPATH_W) 'log_puredb.c'; else $(CYGPATH_W) '$(srcdir)/log_puredb.c'; fi` libpureftpd_a-log_extauth.o: log_extauth.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_extauth.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_extauth.Tpo -c -o libpureftpd_a-log_extauth.o `test -f 'log_extauth.c' || echo '$(srcdir)/'`log_extauth.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_extauth.Tpo $(DEPDIR)/libpureftpd_a-log_extauth.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_extauth.c' object='libpureftpd_a-log_extauth.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_extauth.o `test -f 'log_extauth.c' || echo '$(srcdir)/'`log_extauth.c libpureftpd_a-log_extauth.obj: log_extauth.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-log_extauth.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-log_extauth.Tpo -c -o libpureftpd_a-log_extauth.obj `if test -f 'log_extauth.c'; then $(CYGPATH_W) 'log_extauth.c'; else $(CYGPATH_W) '$(srcdir)/log_extauth.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-log_extauth.Tpo $(DEPDIR)/libpureftpd_a-log_extauth.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='log_extauth.c' object='libpureftpd_a-log_extauth.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-log_extauth.obj `if test -f 'log_extauth.c'; then $(CYGPATH_W) 'log_extauth.c'; else $(CYGPATH_W) '$(srcdir)/log_extauth.c'; fi` libpureftpd_a-ls.o: ls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ls.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-ls.Tpo -c -o libpureftpd_a-ls.o `test -f 'ls.c' || echo '$(srcdir)/'`ls.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ls.Tpo $(DEPDIR)/libpureftpd_a-ls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ls.c' object='libpureftpd_a-ls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ls.o `test -f 'ls.c' || echo '$(srcdir)/'`ls.c libpureftpd_a-ls.obj: ls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-ls.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-ls.Tpo -c -o libpureftpd_a-ls.obj `if test -f 'ls.c'; then $(CYGPATH_W) 'ls.c'; else $(CYGPATH_W) '$(srcdir)/ls.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-ls.Tpo $(DEPDIR)/libpureftpd_a-ls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='ls.c' object='libpureftpd_a-ls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-ls.obj `if test -f 'ls.c'; then $(CYGPATH_W) 'ls.c'; else $(CYGPATH_W) '$(srcdir)/ls.c'; fi` libpureftpd_a-mysnprintf.o: mysnprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-mysnprintf.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-mysnprintf.Tpo -c -o libpureftpd_a-mysnprintf.o `test -f 'mysnprintf.c' || echo '$(srcdir)/'`mysnprintf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-mysnprintf.Tpo $(DEPDIR)/libpureftpd_a-mysnprintf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mysnprintf.c' object='libpureftpd_a-mysnprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-mysnprintf.o `test -f 'mysnprintf.c' || echo '$(srcdir)/'`mysnprintf.c libpureftpd_a-mysnprintf.obj: mysnprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-mysnprintf.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-mysnprintf.Tpo -c -o libpureftpd_a-mysnprintf.obj `if test -f 'mysnprintf.c'; then $(CYGPATH_W) 'mysnprintf.c'; else $(CYGPATH_W) '$(srcdir)/mysnprintf.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-mysnprintf.Tpo $(DEPDIR)/libpureftpd_a-mysnprintf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mysnprintf.c' object='libpureftpd_a-mysnprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-mysnprintf.obj `if test -f 'mysnprintf.c'; then $(CYGPATH_W) 'mysnprintf.c'; else $(CYGPATH_W) '$(srcdir)/mysnprintf.c'; fi` libpureftpd_a-parser.o: parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-parser.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-parser.Tpo -c -o libpureftpd_a-parser.o `test -f 'parser.c' || echo '$(srcdir)/'`parser.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-parser.Tpo $(DEPDIR)/libpureftpd_a-parser.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parser.c' object='libpureftpd_a-parser.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-parser.o `test -f 'parser.c' || echo '$(srcdir)/'`parser.c libpureftpd_a-parser.obj: parser.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-parser.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-parser.Tpo -c -o libpureftpd_a-parser.obj `if test -f 'parser.c'; then $(CYGPATH_W) 'parser.c'; else $(CYGPATH_W) '$(srcdir)/parser.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-parser.Tpo $(DEPDIR)/libpureftpd_a-parser.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='parser.c' object='libpureftpd_a-parser.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-parser.obj `if test -f 'parser.c'; then $(CYGPATH_W) 'parser.c'; else $(CYGPATH_W) '$(srcdir)/parser.c'; fi` libpureftpd_a-privsep.o: privsep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-privsep.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-privsep.Tpo -c -o libpureftpd_a-privsep.o `test -f 'privsep.c' || echo '$(srcdir)/'`privsep.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-privsep.Tpo $(DEPDIR)/libpureftpd_a-privsep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='privsep.c' object='libpureftpd_a-privsep.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-privsep.o `test -f 'privsep.c' || echo '$(srcdir)/'`privsep.c libpureftpd_a-privsep.obj: privsep.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-privsep.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-privsep.Tpo -c -o libpureftpd_a-privsep.obj `if test -f 'privsep.c'; then $(CYGPATH_W) 'privsep.c'; else $(CYGPATH_W) '$(srcdir)/privsep.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-privsep.Tpo $(DEPDIR)/libpureftpd_a-privsep.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='privsep.c' object='libpureftpd_a-privsep.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-privsep.obj `if test -f 'privsep.c'; then $(CYGPATH_W) 'privsep.c'; else $(CYGPATH_W) '$(srcdir)/privsep.c'; fi` libpureftpd_a-quotas.o: quotas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-quotas.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-quotas.Tpo -c -o libpureftpd_a-quotas.o `test -f 'quotas.c' || echo '$(srcdir)/'`quotas.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-quotas.Tpo $(DEPDIR)/libpureftpd_a-quotas.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='quotas.c' object='libpureftpd_a-quotas.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-quotas.o `test -f 'quotas.c' || echo '$(srcdir)/'`quotas.c libpureftpd_a-quotas.obj: quotas.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-quotas.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-quotas.Tpo -c -o libpureftpd_a-quotas.obj `if test -f 'quotas.c'; then $(CYGPATH_W) 'quotas.c'; else $(CYGPATH_W) '$(srcdir)/quotas.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-quotas.Tpo $(DEPDIR)/libpureftpd_a-quotas.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='quotas.c' object='libpureftpd_a-quotas.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-quotas.obj `if test -f 'quotas.c'; then $(CYGPATH_W) 'quotas.c'; else $(CYGPATH_W) '$(srcdir)/quotas.c'; fi` libpureftpd_a-safe_rw.o: safe_rw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-safe_rw.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-safe_rw.Tpo -c -o libpureftpd_a-safe_rw.o `test -f 'safe_rw.c' || echo '$(srcdir)/'`safe_rw.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-safe_rw.Tpo $(DEPDIR)/libpureftpd_a-safe_rw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='safe_rw.c' object='libpureftpd_a-safe_rw.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-safe_rw.o `test -f 'safe_rw.c' || echo '$(srcdir)/'`safe_rw.c libpureftpd_a-safe_rw.obj: safe_rw.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-safe_rw.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-safe_rw.Tpo -c -o libpureftpd_a-safe_rw.obj `if test -f 'safe_rw.c'; then $(CYGPATH_W) 'safe_rw.c'; else $(CYGPATH_W) '$(srcdir)/safe_rw.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-safe_rw.Tpo $(DEPDIR)/libpureftpd_a-safe_rw.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='safe_rw.c' object='libpureftpd_a-safe_rw.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-safe_rw.obj `if test -f 'safe_rw.c'; then $(CYGPATH_W) 'safe_rw.c'; else $(CYGPATH_W) '$(srcdir)/safe_rw.c'; fi` libpureftpd_a-simpleconf.o: simpleconf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-simpleconf.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-simpleconf.Tpo -c -o libpureftpd_a-simpleconf.o `test -f 'simpleconf.c' || echo '$(srcdir)/'`simpleconf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-simpleconf.Tpo $(DEPDIR)/libpureftpd_a-simpleconf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simpleconf.c' object='libpureftpd_a-simpleconf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-simpleconf.o `test -f 'simpleconf.c' || echo '$(srcdir)/'`simpleconf.c libpureftpd_a-simpleconf.obj: simpleconf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-simpleconf.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-simpleconf.Tpo -c -o libpureftpd_a-simpleconf.obj `if test -f 'simpleconf.c'; then $(CYGPATH_W) 'simpleconf.c'; else $(CYGPATH_W) '$(srcdir)/simpleconf.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-simpleconf.Tpo $(DEPDIR)/libpureftpd_a-simpleconf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='simpleconf.c' object='libpureftpd_a-simpleconf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-simpleconf.obj `if test -f 'simpleconf.c'; then $(CYGPATH_W) 'simpleconf.c'; else $(CYGPATH_W) '$(srcdir)/simpleconf.c'; fi` libpureftpd_a-tls_extcert.o: tls_extcert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-tls_extcert.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-tls_extcert.Tpo -c -o libpureftpd_a-tls_extcert.o `test -f 'tls_extcert.c' || echo '$(srcdir)/'`tls_extcert.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-tls_extcert.Tpo $(DEPDIR)/libpureftpd_a-tls_extcert.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tls_extcert.c' object='libpureftpd_a-tls_extcert.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-tls_extcert.o `test -f 'tls_extcert.c' || echo '$(srcdir)/'`tls_extcert.c libpureftpd_a-tls_extcert.obj: tls_extcert.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-tls_extcert.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-tls_extcert.Tpo -c -o libpureftpd_a-tls_extcert.obj `if test -f 'tls_extcert.c'; then $(CYGPATH_W) 'tls_extcert.c'; else $(CYGPATH_W) '$(srcdir)/tls_extcert.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-tls_extcert.Tpo $(DEPDIR)/libpureftpd_a-tls_extcert.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tls_extcert.c' object='libpureftpd_a-tls_extcert.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-tls_extcert.obj `if test -f 'tls_extcert.c'; then $(CYGPATH_W) 'tls_extcert.c'; else $(CYGPATH_W) '$(srcdir)/tls_extcert.c'; fi` libpureftpd_a-tls.o: tls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-tls.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-tls.Tpo -c -o libpureftpd_a-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-tls.Tpo $(DEPDIR)/libpureftpd_a-tls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tls.c' object='libpureftpd_a-tls.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-tls.o `test -f 'tls.c' || echo '$(srcdir)/'`tls.c libpureftpd_a-tls.obj: tls.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-tls.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-tls.Tpo -c -o libpureftpd_a-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-tls.Tpo $(DEPDIR)/libpureftpd_a-tls.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='tls.c' object='libpureftpd_a-tls.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-tls.obj `if test -f 'tls.c'; then $(CYGPATH_W) 'tls.c'; else $(CYGPATH_W) '$(srcdir)/tls.c'; fi` libpureftpd_a-upload-pipe.o: upload-pipe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-upload-pipe.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-upload-pipe.Tpo -c -o libpureftpd_a-upload-pipe.o `test -f 'upload-pipe.c' || echo '$(srcdir)/'`upload-pipe.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-upload-pipe.Tpo $(DEPDIR)/libpureftpd_a-upload-pipe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='upload-pipe.c' object='libpureftpd_a-upload-pipe.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-upload-pipe.o `test -f 'upload-pipe.c' || echo '$(srcdir)/'`upload-pipe.c libpureftpd_a-upload-pipe.obj: upload-pipe.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-upload-pipe.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-upload-pipe.Tpo -c -o libpureftpd_a-upload-pipe.obj `if test -f 'upload-pipe.c'; then $(CYGPATH_W) 'upload-pipe.c'; else $(CYGPATH_W) '$(srcdir)/upload-pipe.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-upload-pipe.Tpo $(DEPDIR)/libpureftpd_a-upload-pipe.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='upload-pipe.c' object='libpureftpd_a-upload-pipe.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-upload-pipe.obj `if test -f 'upload-pipe.c'; then $(CYGPATH_W) 'upload-pipe.c'; else $(CYGPATH_W) '$(srcdir)/upload-pipe.c'; fi` libpureftpd_a-utils.o: utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-utils.o -MD -MP -MF $(DEPDIR)/libpureftpd_a-utils.Tpo -c -o libpureftpd_a-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-utils.Tpo $(DEPDIR)/libpureftpd_a-utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='libpureftpd_a-utils.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-utils.o `test -f 'utils.c' || echo '$(srcdir)/'`utils.c libpureftpd_a-utils.obj: utils.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -MT libpureftpd_a-utils.obj -MD -MP -MF $(DEPDIR)/libpureftpd_a-utils.Tpo -c -o libpureftpd_a-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/libpureftpd_a-utils.Tpo $(DEPDIR)/libpureftpd_a-utils.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='utils.c' object='libpureftpd_a-utils.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libpureftpd_a_CFLAGS) $(CFLAGS) -c -o libpureftpd_a-utils.obj `if test -f 'utils.c'; then $(CYGPATH_W) 'utils.c'; else $(CYGPATH_W) '$(srcdir)/utils.c'; fi` pure_mrtginfo-daemons.o: daemons.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -MT pure_mrtginfo-daemons.o -MD -MP -MF $(DEPDIR)/pure_mrtginfo-daemons.Tpo -c -o pure_mrtginfo-daemons.o `test -f 'daemons.c' || echo '$(srcdir)/'`daemons.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pure_mrtginfo-daemons.Tpo $(DEPDIR)/pure_mrtginfo-daemons.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemons.c' object='pure_mrtginfo-daemons.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -c -o pure_mrtginfo-daemons.o `test -f 'daemons.c' || echo '$(srcdir)/'`daemons.c pure_mrtginfo-daemons.obj: daemons.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -MT pure_mrtginfo-daemons.obj -MD -MP -MF $(DEPDIR)/pure_mrtginfo-daemons.Tpo -c -o pure_mrtginfo-daemons.obj `if test -f 'daemons.c'; then $(CYGPATH_W) 'daemons.c'; else $(CYGPATH_W) '$(srcdir)/daemons.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pure_mrtginfo-daemons.Tpo $(DEPDIR)/pure_mrtginfo-daemons.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='daemons.c' object='pure_mrtginfo-daemons.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -c -o pure_mrtginfo-daemons.obj `if test -f 'daemons.c'; then $(CYGPATH_W) 'daemons.c'; else $(CYGPATH_W) '$(srcdir)/daemons.c'; fi` pure_mrtginfo-fakesnprintf.o: fakesnprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -MT pure_mrtginfo-fakesnprintf.o -MD -MP -MF $(DEPDIR)/pure_mrtginfo-fakesnprintf.Tpo -c -o pure_mrtginfo-fakesnprintf.o `test -f 'fakesnprintf.c' || echo '$(srcdir)/'`fakesnprintf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pure_mrtginfo-fakesnprintf.Tpo $(DEPDIR)/pure_mrtginfo-fakesnprintf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fakesnprintf.c' object='pure_mrtginfo-fakesnprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -c -o pure_mrtginfo-fakesnprintf.o `test -f 'fakesnprintf.c' || echo '$(srcdir)/'`fakesnprintf.c pure_mrtginfo-fakesnprintf.obj: fakesnprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -MT pure_mrtginfo-fakesnprintf.obj -MD -MP -MF $(DEPDIR)/pure_mrtginfo-fakesnprintf.Tpo -c -o pure_mrtginfo-fakesnprintf.obj `if test -f 'fakesnprintf.c'; then $(CYGPATH_W) 'fakesnprintf.c'; else $(CYGPATH_W) '$(srcdir)/fakesnprintf.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pure_mrtginfo-fakesnprintf.Tpo $(DEPDIR)/pure_mrtginfo-fakesnprintf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='fakesnprintf.c' object='pure_mrtginfo-fakesnprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -c -o pure_mrtginfo-fakesnprintf.obj `if test -f 'fakesnprintf.c'; then $(CYGPATH_W) 'fakesnprintf.c'; else $(CYGPATH_W) '$(srcdir)/fakesnprintf.c'; fi` pure_mrtginfo-pure-mrtginfo.o: pure-mrtginfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -MT pure_mrtginfo-pure-mrtginfo.o -MD -MP -MF $(DEPDIR)/pure_mrtginfo-pure-mrtginfo.Tpo -c -o pure_mrtginfo-pure-mrtginfo.o `test -f 'pure-mrtginfo.c' || echo '$(srcdir)/'`pure-mrtginfo.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pure_mrtginfo-pure-mrtginfo.Tpo $(DEPDIR)/pure_mrtginfo-pure-mrtginfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pure-mrtginfo.c' object='pure_mrtginfo-pure-mrtginfo.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -c -o pure_mrtginfo-pure-mrtginfo.o `test -f 'pure-mrtginfo.c' || echo '$(srcdir)/'`pure-mrtginfo.c pure_mrtginfo-pure-mrtginfo.obj: pure-mrtginfo.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -MT pure_mrtginfo-pure-mrtginfo.obj -MD -MP -MF $(DEPDIR)/pure_mrtginfo-pure-mrtginfo.Tpo -c -o pure_mrtginfo-pure-mrtginfo.obj `if test -f 'pure-mrtginfo.c'; then $(CYGPATH_W) 'pure-mrtginfo.c'; else $(CYGPATH_W) '$(srcdir)/pure-mrtginfo.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pure_mrtginfo-pure-mrtginfo.Tpo $(DEPDIR)/pure_mrtginfo-pure-mrtginfo.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='pure-mrtginfo.c' object='pure_mrtginfo-pure-mrtginfo.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -c -o pure_mrtginfo-pure-mrtginfo.obj `if test -f 'pure-mrtginfo.c'; then $(CYGPATH_W) 'pure-mrtginfo.c'; else $(CYGPATH_W) '$(srcdir)/pure-mrtginfo.c'; fi` pure_mrtginfo-mysnprintf.o: mysnprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -MT pure_mrtginfo-mysnprintf.o -MD -MP -MF $(DEPDIR)/pure_mrtginfo-mysnprintf.Tpo -c -o pure_mrtginfo-mysnprintf.o `test -f 'mysnprintf.c' || echo '$(srcdir)/'`mysnprintf.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pure_mrtginfo-mysnprintf.Tpo $(DEPDIR)/pure_mrtginfo-mysnprintf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mysnprintf.c' object='pure_mrtginfo-mysnprintf.o' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -c -o pure_mrtginfo-mysnprintf.o `test -f 'mysnprintf.c' || echo '$(srcdir)/'`mysnprintf.c pure_mrtginfo-mysnprintf.obj: mysnprintf.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -MT pure_mrtginfo-mysnprintf.obj -MD -MP -MF $(DEPDIR)/pure_mrtginfo-mysnprintf.Tpo -c -o pure_mrtginfo-mysnprintf.obj `if test -f 'mysnprintf.c'; then $(CYGPATH_W) 'mysnprintf.c'; else $(CYGPATH_W) '$(srcdir)/mysnprintf.c'; fi` @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/pure_mrtginfo-mysnprintf.Tpo $(DEPDIR)/pure_mrtginfo-mysnprintf.Po @AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='mysnprintf.c' object='pure_mrtginfo-mysnprintf.obj' libtool=no @AMDEPBACKSLASH@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(pure_mrtginfo_CFLAGS) $(CFLAGS) -c -o pure_mrtginfo-mysnprintf.obj `if test -f 'mysnprintf.c'; then $(CYGPATH_W) 'mysnprintf.c'; else $(CYGPATH_W) '$(srcdir)/mysnprintf.c'; fi` ID: $(am__tagged_files) $(am__define_uniq_tagged_files); mkid -fID $$unique tags: tags-am TAGS: tags tags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) set x; \ here=`pwd`; \ $(am__define_uniq_tagged_files); \ shift; \ if test -z "$(ETAGS_ARGS)$$*$$unique"; then :; else \ test -n "$$unique" || unique=$$empty_fix; \ if test $$# -gt 0; then \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ "$$@" $$unique; \ else \ $(ETAGS) $(ETAGSFLAGS) $(AM_ETAGSFLAGS) $(ETAGS_ARGS) \ $$unique; \ fi; \ fi ctags: ctags-am CTAGS: ctags ctags-am: $(TAGS_DEPENDENCIES) $(am__tagged_files) $(am__define_uniq_tagged_files); \ test -z "$(CTAGS_ARGS)$$unique" \ || $(CTAGS) $(CTAGSFLAGS) $(AM_CTAGSFLAGS) $(CTAGS_ARGS) \ $$unique GTAGS: here=`$(am__cd) $(top_builddir) && pwd` \ && $(am__cd) $(top_srcdir) \ && gtags -i $(GTAGS_ARGS) "$$here" cscopelist: cscopelist-am cscopelist-am: $(am__tagged_files) list='$(am__tagged_files)'; \ case "$(srcdir)" in \ [\\/]* | ?:[\\/]*) sdir="$(srcdir)" ;; \ *) sdir=$(subdir)/$(srcdir) ;; \ esac; \ for i in $$list; do \ if test -f "$$i"; then \ echo "$(subdir)/$$i"; \ else \ echo "$$sdir/$$i"; \ fi; \ done >> $(top_builddir)/cscope.files distclean-tags: -rm -f TAGS ID GTAGS GRTAGS GSYMS GPATH tags distdir: $(BUILT_SOURCES) $(MAKE) $(AM_MAKEFLAGS) distdir-am distdir-am: $(DISTFILES) @srcdirstrip=`echo "$(srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ topsrcdirstrip=`echo "$(top_srcdir)" | sed 's/[].[^$$\\*]/\\\\&/g'`; \ list='$(DISTFILES)'; \ dist_files=`for file in $$list; do echo $$file; done | \ sed -e "s|^$$srcdirstrip/||;t" \ -e "s|^$$topsrcdirstrip/|$(top_builddir)/|;t"`; \ case $$dist_files in \ */*) $(MKDIR_P) `echo "$$dist_files" | \ sed '/\//!d;s|^|$(distdir)/|;s,/[^/]*$$,,' | \ sort -u` ;; \ esac; \ for file in $$dist_files; do \ if test -f $$file || test -d $$file; then d=.; else d=$(srcdir); fi; \ if test -d $$d/$$file; then \ dir=`echo "/$$file" | sed -e 's,/[^/]*$$,,'`; \ if test -d "$(distdir)/$$file"; then \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ if test -d $(srcdir)/$$file && test $$d != $(srcdir); then \ cp -fpR $(srcdir)/$$file "$(distdir)$$dir" || exit 1; \ find "$(distdir)/$$file" -type d ! -perm -700 -exec chmod u+rwx {} \;; \ fi; \ cp -fpR $$d/$$file "$(distdir)$$dir" || exit 1; \ else \ test -f "$(distdir)/$$file" \ || cp -p $$d/$$file "$(distdir)/$$file" \ || exit 1; \ fi; \ done check-am: all-am check: check-am all-am: Makefile $(PROGRAMS) $(LIBRARIES) installdirs: for dir in "$(DESTDIR)$(bindir)" "$(DESTDIR)$(sbindir)"; do \ test -z "$$dir" || $(MKDIR_P) "$$dir"; \ done install: install-am install-exec: install-exec-am install-data: install-data-am uninstall: uninstall-am install-am: all-am @$(MAKE) $(AM_MAKEFLAGS) install-exec-am install-data-am installcheck: installcheck-am install-strip: if test -z '$(STRIP)'; then \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ install; \ else \ $(MAKE) $(AM_MAKEFLAGS) INSTALL_PROGRAM="$(INSTALL_STRIP_PROGRAM)" \ install_sh_PROGRAM="$(INSTALL_STRIP_PROGRAM)" INSTALL_STRIP_FLAG=-s \ "INSTALL_PROGRAM_ENV=STRIPPROG='$(STRIP)'" install; \ fi mostlyclean-generic: clean-generic: distclean-generic: -test -z "$(CONFIG_CLEAN_FILES)" || rm -f $(CONFIG_CLEAN_FILES) -test . = "$(srcdir)" || test -z "$(CONFIG_CLEAN_VPATH_FILES)" || rm -f $(CONFIG_CLEAN_VPATH_FILES) maintainer-clean-generic: @echo "This command is intended for maintainers to use" @echo "it deletes files that may require special tools to rebuild." clean: clean-am clean-am: clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \ clean-noinstPROGRAMS clean-sbinPROGRAMS mostlyclean-am distclean: distclean-am -rm -f ./$(DEPDIR)/alt_arc4random.Po -rm -f ./$(DEPDIR)/bsd-getopt_long.Po -rm -f ./$(DEPDIR)/fakesnprintf.Po -rm -f ./$(DEPDIR)/ipstack.Po -rm -f ./$(DEPDIR)/libpureftpd_a-alt_arc4random.Po -rm -f ./$(DEPDIR)/libpureftpd_a-altlog.Po -rm -f ./$(DEPDIR)/libpureftpd_a-bonjour.Po -rm -f ./$(DEPDIR)/libpureftpd_a-bsd-getopt_long.Po -rm -f ./$(DEPDIR)/libpureftpd_a-bsd-glob.Po -rm -f ./$(DEPDIR)/libpureftpd_a-bsd-realpath.Po -rm -f ./$(DEPDIR)/libpureftpd_a-caps.Po -rm -f ./$(DEPDIR)/libpureftpd_a-crypto-md5.Po -rm -f ./$(DEPDIR)/libpureftpd_a-crypto-sha1.Po -rm -f ./$(DEPDIR)/libpureftpd_a-crypto.Po -rm -f ./$(DEPDIR)/libpureftpd_a-daemons.Po -rm -f ./$(DEPDIR)/libpureftpd_a-diraliases.Po -rm -f ./$(DEPDIR)/libpureftpd_a-dynamic.Po -rm -f ./$(DEPDIR)/libpureftpd_a-fakechroot.Po -rm -f ./$(DEPDIR)/libpureftpd_a-fakesnprintf.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ftp_parser.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ftpd.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ftpwho-read.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ftpwho-update.Po -rm -f ./$(DEPDIR)/libpureftpd_a-getloadavg.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ipstack.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_extauth.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_ldap.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_mysql.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_pam.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_pgsql.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_puredb.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_unix.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ls.Po -rm -f ./$(DEPDIR)/libpureftpd_a-mysnprintf.Po -rm -f ./$(DEPDIR)/libpureftpd_a-parser.Po -rm -f ./$(DEPDIR)/libpureftpd_a-privsep.Po -rm -f ./$(DEPDIR)/libpureftpd_a-quotas.Po -rm -f ./$(DEPDIR)/libpureftpd_a-safe_rw.Po -rm -f ./$(DEPDIR)/libpureftpd_a-simpleconf.Po -rm -f ./$(DEPDIR)/libpureftpd_a-tls.Po -rm -f ./$(DEPDIR)/libpureftpd_a-tls_extcert.Po -rm -f ./$(DEPDIR)/libpureftpd_a-upload-pipe.Po -rm -f ./$(DEPDIR)/libpureftpd_a-utils.Po -rm -f ./$(DEPDIR)/main.Po -rm -f ./$(DEPDIR)/mysnprintf.Po -rm -f ./$(DEPDIR)/ptracetest.Po -rm -f ./$(DEPDIR)/pure-authd.Po -rm -f ./$(DEPDIR)/pure-certd.Po -rm -f ./$(DEPDIR)/pure-ftpwho.Po -rm -f ./$(DEPDIR)/pure-pw.Po -rm -f ./$(DEPDIR)/pure-pwconvert.Po -rm -f ./$(DEPDIR)/pure-quotacheck.Po -rm -f ./$(DEPDIR)/pure-statsdecode.Po -rm -f ./$(DEPDIR)/pure-uploadscript.Po -rm -f ./$(DEPDIR)/pure_mrtginfo-daemons.Po -rm -f ./$(DEPDIR)/pure_mrtginfo-fakesnprintf.Po -rm -f ./$(DEPDIR)/pure_mrtginfo-mysnprintf.Po -rm -f ./$(DEPDIR)/pure_mrtginfo-pure-mrtginfo.Po -rm -f ./$(DEPDIR)/safe_rw.Po -rm -f ./$(DEPDIR)/utils.Po -rm -f Makefile distclean-am: clean-am distclean-compile distclean-generic \ distclean-tags dvi: dvi-am dvi-am: html: html-am html-am: info: info-am info-am: install-data-am: install-dvi: install-dvi-am install-dvi-am: install-exec-am: install-binPROGRAMS install-sbinPROGRAMS install-html: install-html-am install-html-am: install-info: install-info-am install-info-am: install-man: install-pdf: install-pdf-am install-pdf-am: install-ps: install-ps-am install-ps-am: installcheck-am: maintainer-clean: maintainer-clean-am -rm -f ./$(DEPDIR)/alt_arc4random.Po -rm -f ./$(DEPDIR)/bsd-getopt_long.Po -rm -f ./$(DEPDIR)/fakesnprintf.Po -rm -f ./$(DEPDIR)/ipstack.Po -rm -f ./$(DEPDIR)/libpureftpd_a-alt_arc4random.Po -rm -f ./$(DEPDIR)/libpureftpd_a-altlog.Po -rm -f ./$(DEPDIR)/libpureftpd_a-bonjour.Po -rm -f ./$(DEPDIR)/libpureftpd_a-bsd-getopt_long.Po -rm -f ./$(DEPDIR)/libpureftpd_a-bsd-glob.Po -rm -f ./$(DEPDIR)/libpureftpd_a-bsd-realpath.Po -rm -f ./$(DEPDIR)/libpureftpd_a-caps.Po -rm -f ./$(DEPDIR)/libpureftpd_a-crypto-md5.Po -rm -f ./$(DEPDIR)/libpureftpd_a-crypto-sha1.Po -rm -f ./$(DEPDIR)/libpureftpd_a-crypto.Po -rm -f ./$(DEPDIR)/libpureftpd_a-daemons.Po -rm -f ./$(DEPDIR)/libpureftpd_a-diraliases.Po -rm -f ./$(DEPDIR)/libpureftpd_a-dynamic.Po -rm -f ./$(DEPDIR)/libpureftpd_a-fakechroot.Po -rm -f ./$(DEPDIR)/libpureftpd_a-fakesnprintf.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ftp_parser.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ftpd.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ftpwho-read.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ftpwho-update.Po -rm -f ./$(DEPDIR)/libpureftpd_a-getloadavg.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ipstack.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_extauth.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_ldap.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_mysql.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_pam.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_pgsql.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_puredb.Po -rm -f ./$(DEPDIR)/libpureftpd_a-log_unix.Po -rm -f ./$(DEPDIR)/libpureftpd_a-ls.Po -rm -f ./$(DEPDIR)/libpureftpd_a-mysnprintf.Po -rm -f ./$(DEPDIR)/libpureftpd_a-parser.Po -rm -f ./$(DEPDIR)/libpureftpd_a-privsep.Po -rm -f ./$(DEPDIR)/libpureftpd_a-quotas.Po -rm -f ./$(DEPDIR)/libpureftpd_a-safe_rw.Po -rm -f ./$(DEPDIR)/libpureftpd_a-simpleconf.Po -rm -f ./$(DEPDIR)/libpureftpd_a-tls.Po -rm -f ./$(DEPDIR)/libpureftpd_a-tls_extcert.Po -rm -f ./$(DEPDIR)/libpureftpd_a-upload-pipe.Po -rm -f ./$(DEPDIR)/libpureftpd_a-utils.Po -rm -f ./$(DEPDIR)/main.Po -rm -f ./$(DEPDIR)/mysnprintf.Po -rm -f ./$(DEPDIR)/ptracetest.Po -rm -f ./$(DEPDIR)/pure-authd.Po -rm -f ./$(DEPDIR)/pure-certd.Po -rm -f ./$(DEPDIR)/pure-ftpwho.Po -rm -f ./$(DEPDIR)/pure-pw.Po -rm -f ./$(DEPDIR)/pure-pwconvert.Po -rm -f ./$(DEPDIR)/pure-quotacheck.Po -rm -f ./$(DEPDIR)/pure-statsdecode.Po -rm -f ./$(DEPDIR)/pure-uploadscript.Po -rm -f ./$(DEPDIR)/pure_mrtginfo-daemons.Po -rm -f ./$(DEPDIR)/pure_mrtginfo-fakesnprintf.Po -rm -f ./$(DEPDIR)/pure_mrtginfo-mysnprintf.Po -rm -f ./$(DEPDIR)/pure_mrtginfo-pure-mrtginfo.Po -rm -f ./$(DEPDIR)/safe_rw.Po -rm -f ./$(DEPDIR)/utils.Po -rm -f Makefile maintainer-clean-am: distclean-am maintainer-clean-generic mostlyclean: mostlyclean-am mostlyclean-am: mostlyclean-compile mostlyclean-generic pdf: pdf-am pdf-am: ps: ps-am ps-am: uninstall-am: uninstall-binPROGRAMS uninstall-sbinPROGRAMS .MAKE: install-am install-strip .PHONY: CTAGS GTAGS TAGS all all-am am--depfiles check check-am clean \ clean-binPROGRAMS clean-generic clean-noinstLIBRARIES \ clean-noinstPROGRAMS clean-sbinPROGRAMS cscopelist-am ctags \ ctags-am distclean distclean-compile distclean-generic \ distclean-tags distdir dvi dvi-am html html-am info info-am \ install install-am install-binPROGRAMS install-data \ install-data-am install-dvi install-dvi-am install-exec \ install-exec-am install-html install-html-am install-info \ install-info-am install-man install-pdf install-pdf-am \ install-ps install-ps-am install-sbinPROGRAMS install-strip \ installcheck installcheck-am installdirs maintainer-clean \ maintainer-clean-generic mostlyclean mostlyclean-compile \ mostlyclean-generic pdf pdf-am ps ps-am tags tags-am uninstall \ uninstall-am uninstall-binPROGRAMS uninstall-sbinPROGRAMS .PRECIOUS: Makefile # Tell versions [3.59,3.63) of GNU make to not export all variables. # Otherwise a system limit (for SysV at least) may be exceeded. .NOEXPORT: pure-ftpd-1.0.49.orig/src/ls_p.h0000644000175000017500000000137413350542502015307 0ustar rackeracke#ifndef __LS_P_H__ #define __LS_P_H__ 1 #if defined(GLOB_ABORTED) && !defined(GLOB_ABEND) #define GLOB_ABEND GLOB_ABORTED #endif #define CHUNK_SIZE page_size static unsigned int colwidth; static unsigned int filenames; struct filename { struct filename *down; struct filename *right; int top; char line[1]; }; static struct filename *head; static struct filename *tail; static unsigned int matches; struct userid { struct userid *next; uid_t uid; char *name; }; struct groupid { struct groupid *next; gid_t gid; char *name; }; #ifndef NO_FTP_USERS static struct userid *user_head; static struct groupid *group_head; #endif /* ls options */ int opt_a, opt_C, opt_d, opt_F, opt_l, opt_R, opt_r, opt_t, opt_S; #endif pure-ftpd-1.0.49.orig/src/messages.h0000644000175000017500000000433613350542502016162 0ustar rackeracke#ifndef __MESSAGES_H__ #define __MESSAGES_H__ 1 #if defined(MESSAGES_SQ) # define MESSAGES_LOCALE "sq_AL" # include "messages_sq.h" #elif defined(MESSAGES_DE) # define MESSAGES_LOCALE "de_DE" # include "messages_de.h" #elif defined(MESSAGES_RO) # define MESSAGES_LOCALE "ro_RO" # include "messages_ro.h" #elif defined(MESSAGES_FR) # define MESSAGES_LOCALE "fr_FR" # include "messages_fr.h" #elif defined(MESSAGES_PL) # define MESSAGES_LOCALE "pl_PL" # include "messages_pl.h" #elif defined(MESSAGES_ES) # define MESSAGES_LOCALE "es_ES" # include "messages_es.h" #elif defined(MESSAGES_DA) # define MESSAGES_LOCALE "da_DK" # include "messages_da.h" #elif defined(MESSAGES_NL) # define MESSAGES_LOCALE "nl_NL" # include "messages_nl.h" #elif defined(MESSAGES_IT) # define MESSAGES_LOCALE "it_IT" # include "messages_it.h" #elif defined(MESSAGES_PT_BR) # define MESSAGES_LOCALE "pt_BR" # include "messages_pt_br.h" #elif defined(MESSAGES_SK) # define MESSAGES_LOCALE "sk_SK" # include "messages_sk.h" #elif defined(MESSAGES_KR) # define MESSAGES_LOCALE "ko_KO" # include "messages_kr.h" #elif defined(MESSAGES_FR_FUNNY) # define MESSAGES_LOCALE "fr_FR" # include "messages_fr_funny.h" #elif defined(MESSAGES_SV) # define MESSAGES_LOCALE "sv_SE" # include "messages_sv.h" #elif defined(MESSAGES_NO) # define MESSAGES_LOCALE "no_NO" # include "messages_no.h" #elif defined(MESSAGES_RU) # define MESSAGES_LOCALE "ru_RU" # include "messages_ru.h" #elif defined(MESSAGES_ZH_CN) # define MESSAGES_LOCALE "zh_CN" # include "messages_zh_cn.h" #elif defined(MESSAGES_ZH_TW) # define MESSAGES_LOCALE "zh_TW" # include "messages_zh_tw.h" #elif defined(MESSAGES_CS_CZ) # define MESSAGES_LOCALE "cs_CZ" # include "messages_cs_cz.h" #elif defined(MESSAGES_TR) # define MESSAGES_LOCALE "tr_TR" # include "messages_tr.h" #elif defined(MESSAGES_HU) # define MESSAGES_LOCALE "hu_HU" # include "messages_hu.h" #elif defined(MESSAGES_CA_ES) # define MESSAGES_LOCALE "ca_ES" # include "messages_ca_es.h" #else # define MESSAGES_LOCALE "en_GB" # include "messages_en.h" # ifndef MESSAGES_EN # define MESSAGES_EN 1 # endif #endif /* Favor paranoia over help for sysadmin */ #ifdef PARANOID_MESSAGES # undef MSG_NOTRUST # define MSG_NOTRUST MSG_AUTH_FAILED #endif #endif pure-ftpd-1.0.49.orig/src/ftpwho-update_p.h0000644000175000017500000000017313350542501017453 0ustar rackeracke#ifndef __FTPWHO_UPDATE_P_H__ #define __FTPWHO_UPDATE_P_H__ 1 static int mmap_fd = -1; static struct flock lock; #endif pure-ftpd-1.0.49.orig/src/upload-pipe.c0000644000175000017500000000721713450665410016573 0ustar rackeracke#include #if defined(WITH_UPLOAD_SCRIPT) # include "ftpd.h" # include "ftpwho-update.h" # include "globals.h" # include "upload-pipe.h" # include "safe_rw.h" # ifdef WITH_DMALLOC # include # endif int upload_pipe_open(void) { struct stat st; upload_pipe_close(); anew: if ((upload_pipe_lock = open(UPLOAD_PIPE_LOCK, O_CREAT | O_RDWR | O_NOFOLLOW, (mode_t) 0600)) == -1) { unlink(UPLOAD_PIPE_LOCK); return -1; } if (fstat(upload_pipe_lock, &st) < 0 || (st.st_mode & 0777) != 0600 || !S_ISREG(st.st_mode) || # ifdef NON_ROOT_FTP st.st_uid != geteuid() # else st.st_uid != (uid_t) 0 # endif ) { return -1; } if (lstat(UPLOAD_PIPE_LOCK, &st) < 0 || (st.st_mode & 0777) != 0600 || !S_ISREG(st.st_mode) || # ifdef NON_ROOT_FTP st.st_uid != geteuid() # else st.st_uid != (uid_t) 0 # endif ) { unlink(UPLOAD_PIPE_LOCK); (void) close(upload_pipe_lock); goto anew; } anew2: upload_pipe_fd = open(UPLOAD_PIPE_FILE, O_WRONLY | O_NOFOLLOW); if (upload_pipe_fd == -1 && errno == ENXIO) { upload_pipe_fd = open(UPLOAD_PIPE_FILE, O_RDWR | O_NOFOLLOW); } if (upload_pipe_fd == -1) { if (mkfifo(UPLOAD_PIPE_FILE, (mode_t) 0600) < 0) { upload_pipe_close(); return -1; } goto anew2; } if (fstat(upload_pipe_fd, &st) < 0 || (st.st_mode & 0777) != 0600 || !S_ISFIFO(st.st_mode) || # ifdef NON_ROOT_FTP st.st_uid != geteuid() # else st.st_uid != (uid_t) 0 # endif ) { upload_pipe_close(); return -1; /* Don't fight, I'm too old for that */ } if (lstat(UPLOAD_PIPE_FILE, &st) < 0 || (st.st_mode & 0777) != 0600 || !S_ISFIFO(st.st_mode) || # ifdef NON_ROOT_FTP st.st_uid != geteuid() # else st.st_uid != (uid_t) 0 # endif ) { unlink(UPLOAD_PIPE_FILE); /* Okay, fight a bit :) */ (void) close(upload_pipe_fd); goto anew2; } return upload_pipe_fd; } /* File is already prefixed by \001 */ int upload_pipe_push(const char *vuser, const char *file) { struct flock lock; const char starter = 2; size_t sizeof_starter; size_t sizeof_vuser; size_t sizeof_file; size_t sizeof_buf; char *buf; char *pnt; if (upload_pipe_lock == -1 || upload_pipe_fd == -1 || file == NULL || *file == 0) { return 0; } lock.l_whence = SEEK_SET; lock.l_start = (off_t) 0; lock.l_len = (off_t) 0; lock.l_pid = getpid(); lock.l_type = F_WRLCK; while (fcntl(upload_pipe_lock, F_SETLKW, &lock) < 0) { if (errno != EINTR) { return -1; } } sizeof_starter = (size_t) 1U; sizeof_vuser = strlen(vuser); sizeof_file = strlen(file) + (size_t) 1U; sizeof_buf = sizeof_starter + sizeof_vuser + sizeof_file; if ((buf = malloc(sizeof_buf)) == NULL) { return -1; } pnt = buf; *buf = starter; pnt += sizeof_starter; memcpy(pnt, vuser, sizeof_vuser); pnt += sizeof_vuser; memcpy(pnt, file, sizeof_file); (void) safe_write(upload_pipe_fd, buf, sizeof_buf, -1); free(buf); lock.l_type = F_UNLCK; while (fcntl(upload_pipe_lock, F_SETLK, &lock) < 0 && errno == EINTR); return 0; } void upload_pipe_close(void) { if (upload_pipe_fd != -1) { close(upload_pipe_fd); upload_pipe_fd = -1; } if (upload_pipe_lock != -1) { close(upload_pipe_lock); upload_pipe_lock = -1; } } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/pure-mrtginfo.c0000644000175000017500000000422213450665410017143 0ustar rackeracke#include #include "ftpd.h" #ifdef WITH_DMALLOC # include #endif #ifdef __FreeBSD__ # include # include #endif static const char *uptime(void) { #ifdef __FreeBSD__ struct timeval boottime; time_t now; int mib[2]; size_t size; time_t u; static char buf[1025]; (void)time(&now); mib[0] = CTL_KERN; mib[1] = KERN_BOOTTIME; size = sizeof(boottime); if (sysctl(mib, 2, &boottime, &size, NULL, 0) != -1 && boottime.tv_sec != 0) { u = now - boottime.tv_sec; if (u > 60) u += 30; if (SNCHECK(snprintf(buf, sizeof buf, "%lu days, %lu:%02lu:%02lu", u / 86400UL, u / 3600UL % 24UL, u / 60UL % 60UL, u % 60UL), sizeof buf)) { _exit(EXIT_FAILURE); } } return buf; #else int f; ssize_t r; unsigned long u; static char buf[1025]; if ((f = open("/proc/uptime", O_RDONLY)) == -1) { return "?"; } while ((r = read(f, buf, sizeof buf - 1U)) < (ssize_t) 0 && errno == EINTR); if (r <= (ssize_t) 0) { close(f); return "?"; } close(f); u = strtoul(buf, NULL, 10); if (SNCHECK(snprintf(buf, sizeof buf, "%lu days, %lu:%02lu:%02lu", u / 86400UL, u / 3600UL % 24UL, u / 60UL % 60UL, u % 60UL), sizeof buf)) { _exit(EXIT_FAILURE); } return buf; #endif } static const char *name(void) { static char buf[1025]; if (gethostname(buf, sizeof buf - 1U) != 0) { return "?"; } return buf; } int main(int argc, char *argv[]) { unsigned int d; in_port_t server_port = 21U; #ifdef HAVE_SETLOCALE # ifdef LC_MESSAGES (void) setlocale(LC_MESSAGES, ""); # endif # ifdef LC_CTYPE (void) setlocale(LC_CTYPE, ""); # endif # ifdef LC_COLLATE (void) setlocale(LC_COLLATE, ""); # endif #endif if (argc == 2) { server_port = (in_port_t) strtoul(argv[1], NULL, 10); } d = daemons(server_port); printf("%u\n%u\n%s\n%s\n", d, d, uptime(), name()); return 0; } pure-ftpd-1.0.49.orig/src/log_puredb.c0000644000175000017500000002562513450665410016501 0ustar rackeracke#include #ifdef WITH_PUREDB #include "ftpd.h" #include "messages.h" #include "log_puredb.h" #include "pure-pw.h" #include "../puredb/src/puredb_read.h" #include "utils.h" #ifdef HAVE_LIBSODIUM # include #endif #ifdef WITH_DMALLOC # include #endif static char *pdb_filename; void pw_puredb_parse(const char * const file) { if (file == NULL || *file == 0) { die(421, LOG_ERR, MSG_NO_VIRTUAL_FILE); } if ((pdb_filename = strdup(file)) == NULL) { die_mem(); } } void pw_puredb_exit(void) { free(pdb_filename); } /* * The difference between this strtok() and the libc's one is that * this one doesn't skip empty fields, and takes a char instead of a * string as a delimiter. * This strtok2() variant leaves zeroes. */ static char *my_strtok2(char *str, const char delim) { static char *s; static char save; if (str != NULL) { if (*str == 0) { return NULL; } s = str; scan: while (*s != 0 && *s != delim) { s++; } save = *s; *s = 0; return str; } if (s == NULL || save == 0) { return NULL; } s++; str = s; goto scan; } /* Check whether an IP address matches a pattern. 1 = match 0 = nomatch */ static int access_ip_match(const struct sockaddr_storage * const sa, char * pattern) { unsigned int ip0, ip1, ip2, ip3; unsigned int netbits; unsigned long ip; unsigned long mask; unsigned long saip; const unsigned char *saip_raw; char *comapoint; if (*pattern == 0) { return 1; } if (STORAGE_FAMILY(*sa) != AF_INET) { return 0; /* TODO: IPv6 */ } do { if ((comapoint = strchr(pattern, ',')) != NULL) { *comapoint = 0; } if (sscanf(pattern, "%u.%u.%u.%u/%u", /* IPv4 */ &ip0, &ip1, &ip2, &ip3, &netbits) == 5) { ipcheck: if (STORAGE_FAMILY(*sa) != AF_INET || netbits == 0U) { return -1; } ip = ((unsigned long) ip0 << 24) | ((unsigned long) ip1 << 16) | ((unsigned long) ip2 << 8) | (unsigned long) ip3; ipcheck_ipdone: mask = ~((0x80000000 >> (netbits - 1U)) - 1U); saip_raw = (const unsigned char *) &(STORAGE_SIN_ADDR_CONST(*sa)); saip = ((unsigned long) saip_raw[0] << 24) | ((unsigned long) saip_raw[1] << 16) | ((unsigned long) saip_raw[2] << 8) | (unsigned long) saip_raw[3]; if ((ip & mask) == (saip & mask)) { return 1; } } else if (sscanf(pattern, "%u.%u.%u.%u", &ip0, &ip1, &ip2, &ip3) == 4) { netbits = 32U; goto ipcheck; } else { struct addrinfo hints, *res; int on; memset(&hints, 0, sizeof hints); hints.ai_family = AF_INET; hints.ai_addr = NULL; if ((on = getaddrinfo(pattern, NULL, &hints, &res)) != 0) { logfile(LOG_WARNING, "puredb: [%s] => [%d]", pattern, on); } else if (res->ai_family != AF_INET) { freeaddrinfo(res); } else { const unsigned char * const ip_raw = (const unsigned char *) & (((const struct sockaddr_in *) (void *) (res->ai_addr))->sin_addr.s_addr); ip = ((unsigned long) ip_raw[0] << 24) | ((unsigned long) ip_raw[1] << 16) | ((unsigned long) ip_raw[2] << 8) | (unsigned long) ip_raw[3]; netbits = 32U; freeaddrinfo(res); goto ipcheck_ipdone; } } if (comapoint == NULL) { break; } *comapoint = ','; pattern = comapoint + 1; } while (*pattern != 0); return 0; } /* IP check. 0 = ok, -1 = denied */ static int access_ip_check(const struct sockaddr_storage * const sa, char * const allow, char * const deny) { if (sa == NULL) { return 0; } if (*allow == 0) { if (*deny == 0) { return 0; } if (access_ip_match(sa, deny) != 0) { return -1; } return 0; } if (*deny == 0) { if (access_ip_match(sa, allow) != 0) { return 0; } return -1; } if (access_ip_match(sa, allow) != 0 && access_ip_match(sa, deny) == 0) { return 0; } return -1; } static int time_restrictions_check(const char * const restrictions) { const struct tm *tm; time_t now_t; unsigned int time_begin, time_end; unsigned int now; if (*restrictions == 0) { return 0; } if (sscanf(restrictions, "%u-%u", &time_begin, &time_end) != 2 || (now_t = time(NULL)) == (time_t) -1 || (tm = localtime(&now_t)) == NULL) { return 0; } now = (unsigned int) tm->tm_hour * 100U + (unsigned int) tm->tm_min; if (time_begin <= time_end) { if (time_begin <= now && now <= time_end) { return 0; } return -1; } if (now >= time_begin || now <= time_end) { return 0; } return -1; } static int pw_puredb_parseline(char *line, const char * const pwd, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer, AuthResult * const result) { char *allow_local_ip, *deny_local_ip; char *allow_remote_ip, *deny_remote_ip; const char *time_restrictions; if ((line = my_strtok2(line, *PW_LINE_SEP)) == NULL || *line == 0) { /* pwd */ return -1; } { const char *crypted; int ret = -1; #ifdef crypto_pwhash_STRPREFIX if (crypto_pwhash_str_verify(line, pwd, strlen(pwd)) == 0) { /* pass */ } else #endif #ifdef crypto_pwhash_scryptsalsa208sha256_STRPREFIX if (crypto_pwhash_scryptsalsa208sha256_str_verify (line, pwd, strlen(pwd)) == 0) { /* pass */ } else #endif { ret = - ((crypted = (const char *) crypt(pwd, line)) == NULL || pure_strcmp(line, crypted) != 0); if (ret != 0) { return -1; } } } if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL || *line == 0) { /* uid */ return -1; } result->uid = (uid_t) strtoul(line, NULL, 10); if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL || *line == 0) { /* gid */ return -1; } result->gid = (gid_t) strtoul(line, NULL, 10); #ifndef ACCEPT_ROOT_VIRTUAL_USERS if (result->uid <= (uid_t) 0 || result->gid <= (gid_t) 0) { return -1; } #endif if (my_strtok2(NULL, *PW_LINE_SEP) == NULL) { /* gecos */ return -1; } if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL || *line == 0) { /* home */ return -1; } if ((result->dir = strdup(line)) == NULL || *result->dir != '/') { return -1; } if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* bw_ul */ return 0; } #ifdef THROTTLING if (*line != 0) { result->throttling_ul_changed = 1; result->throttling_bandwidth_ul = strtoul(line, NULL, 10); } #endif if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* bw_dl */ return 0; } #ifdef THROTTLING if (*line != 0) { result->throttling_dl_changed = 1; result->throttling_bandwidth_dl = strtoul(line, NULL, 10); } #endif if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* ratio up */ return 0; } #ifdef RATIOS if (*line != 0) { result->ratio_upload = (unsigned int) strtoul(line, NULL, 10); if (result->ratio_upload > 0U) { result->ratio_ul_changed = 1; } } #endif if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* ratio down */ return 0; } #ifdef RATIOS if (*line != 0) { result->ratio_download = (unsigned int) strtoul(line, NULL, 10); if (result->ratio_download > 0U) { result->ratio_dl_changed = 1; } } #endif if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* max cnx */ return 0; } #ifdef PER_USER_LIMITS if (*line != 0) { result->per_user_max = (unsigned int) strtoull(line, NULL, 10); } #endif if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* files quota */ return 0; } #ifdef QUOTAS if (*line != 0) { result->quota_files_changed = 1; result->user_quota_files = strtoull(line, NULL, 10); } #endif if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* size quota */ return 0; } #ifdef QUOTAS if (*line != 0) { result->quota_size_changed = 1; result->user_quota_size = strtoull(line, NULL, 10); } #endif if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* allowed local ip */ return 0; } allow_local_ip = line; if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* denied local ip */ return 0; } deny_local_ip = line; if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* allowed remote ip */ return 0; } allow_remote_ip = line; if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* denied remote ip */ return 0; } deny_remote_ip = line; if (access_ip_check(sa, allow_local_ip, deny_local_ip) != 0 || access_ip_check(peer, allow_remote_ip, deny_remote_ip) != 0) { return -1; } if ((line = my_strtok2(NULL, *PW_LINE_SEP)) == NULL) { /* time restrictions */ return 0; } time_restrictions = line; if (time_restrictions_check(time_restrictions) != 0) { return -1; } return 0; } void pw_puredb_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer) { char *line = NULL; PureDB db; off_t retpos; size_t retlen; result->auth_ok = 0; (void) sa; (void) peer; if (puredb_open(&db, pdb_filename) != 0) { die(421, LOG_ERR, MSG_PDB_BROKEN); } if (puredb_find_s(&db, account, &retpos, &retlen) != 0) { goto bye; } if ((line = puredb_read(&db, retpos, retlen)) == NULL) { goto bye; } result->auth_ok--; if (pw_puredb_parseline(line, password, sa, peer, result) != 0) { goto bye; } result->slow_tilde_expansion = 1; result->auth_ok = -result->auth_ok; bye: puredb_read_free(line); puredb_close(&db); } #endif pure-ftpd-1.0.49.orig/src/ftpwho-update.c0000644000175000017500000001074313450665410017141 0ustar rackeracke#include #ifdef FTPWHO # include "ftpd.h" # include "ftpwho-update_p.h" # include "ftpwho-update.h" # include "globals.h" # ifndef WITHOUT_PRIVSEP # include "privsep.h" # endif # ifdef WITH_DMALLOC # include # endif void ftpwho_exit(void) { disablesignals(); if (shm_data_cur != NULL) { shm_data_cur->state = FTPWHO_STATE_FREE; if ( # ifndef NO_INETD standalone == 0 && # endif chrooted != 0) { (void) msync((void *) shm_data_cur, sizeof (FTPWhoEntry), MS_ASYNC); } (void) munmap((void *) shm_data_cur, sizeof (FTPWhoEntry)); } if (mmap_fd != -1) { (void) close(mmap_fd); } # ifndef WITHOUT_PRIVSEP if ( # ifndef NO_INETD standalone == 0 && # endif scoreboardfile != NULL) { (void) privsep_removeftpwhoentry(); } # else if ( # ifndef NO_INETD standalone == 0 && # endif chrooted == 0 && scoreboardfile != NULL) { # ifndef NON_ROOT_FTP (void) seteuid((uid_t) 0); # endif (void) unlink(scoreboardfile); } #endif } void ftpwho_unlock(void) { #if defined(__OpenBSD__) (void) msync(shm_data_cur, (size_t) 0U, MS_ASYNC); #endif lock.l_type = F_UNLCK; while (fcntl(mmap_fd, F_SETLK, &lock) < 0) { if (errno != EINTR) { return; } } } void ftpwho_lock(void) { lock.l_type = F_WRLCK; while (fcntl(mmap_fd, F_SETLKW, &lock) < 0) { if (errno != EINTR) { return; } } } #ifndef NO_STANDALONE void ftpwho_unlinksbfile(const pid_t pid) { size_t sbfile_size; char *sbfile; sbfile_size = sizeof SCOREBOARD_PATH - 1U + 1U + sizeof SCOREBOARD_PREFIX - 1U + 8U + 1U; if ((sbfile = ALLOCA(sbfile_size)) == NULL) { return; } if (SNCHECK(snprintf(sbfile, sbfile_size, SCOREBOARD_PATH "/" SCOREBOARD_PREFIX "%08lu", (unsigned long) pid), sbfile_size)) { ALLOCA_FREE(sbfile); return; } (void) unlink(sbfile); ALLOCA_FREE(sbfile); } #endif int ftpwho_initwho(void) { int fd; size_t scoreboardfile_size; struct stat st; shm_data_cur = NULL; if ((fd = open(SCOREBOARD_PATH, O_RDONLY | O_DIRECTORY)) == -1) { if (mkdir(SCOREBOARD_PATH, (mode_t) 0700) != 0) { return -1; } } else { if (fstat(fd, &st) != 0 || !S_ISDIR(st.st_mode) || #ifdef NON_ROOT_FTP st.st_uid != geteuid() #else st.st_uid != (uid_t) 0 #endif ) { close(fd); return -1; } if ((st.st_mode & 0777) != 0700) { if (fchmod(fd, 0700) != 0) { close(fd); return -1; } } } close(fd); scoreboardfile_size = sizeof SCOREBOARD_PATH - 1U + 1U + sizeof SCOREBOARD_PREFIX - 1U + 8U + 1U; if ((scoreboardfile = malloc(scoreboardfile_size)) == NULL) { return -1; } if (SNCHECK(snprintf(scoreboardfile, scoreboardfile_size, SCOREBOARD_PATH "/" SCOREBOARD_PREFIX "%08lu", (unsigned long) getpid()), scoreboardfile_size)) { err: free(scoreboardfile); scoreboardfile = NULL; shm_data_cur = NULL; return -1; } /* * Don't truncate: it's faster to reuse. * Don't check for any lock: we could get a deadlock. */ if ((mmap_fd = open(scoreboardfile, O_RDWR | O_CREAT | O_NOFOLLOW, 0600)) == -1) { goto err; } if (fstat(mmap_fd, &st) != 0 || !S_ISREG(st.st_mode) || (st.st_mode & 0600) != 0600 || #ifdef NON_ROOT_FTP st.st_uid != geteuid() #else st.st_uid != (uid_t) 0 #endif ) { err2: close(mmap_fd); goto err; } if (lseek(mmap_fd, (off_t) (sizeof (FTPWhoEntry) - 1U), SEEK_SET) == (off_t) -1) { goto err2; } while (write(mmap_fd, "", (size_t) 1U) < 0 && (errno == EAGAIN || errno == EINTR)); lock.l_whence = SEEK_SET; lock.l_start = (off_t) 0; lock.l_len = (off_t) 0; lock.l_pid = getpid(); if ((shm_data_cur = (FTPWhoEntry *) mmap(NULL, sizeof (FTPWhoEntry), PROT_WRITE | PROT_READ, MAP_SHARED | MAP_FILE, mmap_fd, (off_t) 0)) == (void *) MAP_FAILED) { goto err2; } return 0; } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/parser_p.h0000644000175000017500000000020413350542502016154 0ustar rackeracke#ifndef __PARSER_P_H__ #define __PARSER_P_H__ 1 #define CONFIG_COMMENT '#' #ifndef LINE_MAX # define LINE_MAX 4096 #endif #endif pure-ftpd-1.0.49.orig/src/fakechroot.h0000644000175000017500000000754713446174132016515 0ustar rackeracke#ifndef HAVE_FAKECHROOT_H # define HAVE_FAKECHROOT_H 1 # if defined(WITH_VIRTUAL_CHROOT) && defined(INCLUDE_IO_WRAPPERS) # if !defined(FAKECHROOT_FUNCS_DEFINITION) && !defined(FAKECHROOT_EXCEPTION) int fakechroot(const char *path); # ifdef chroot # undef chroot # endif # define chroot(A) fakechroot(A) char *fakegetcwd(char *dir, size_t size); # ifdef getcwd # undef getcwd # endif # define getcwd(A, B) fakegetcwd(A, B) int fakechdir(const char *dir); # ifdef chdir # undef chdir # endif # define chdir(A) fakechdir(A) int fakestat(const char *file, struct stat *st); # ifdef stat # undef stat # endif # define stat(A, B) fakestat(A, B) int fakelstat(const char *file, struct stat *st); # ifdef lstat # undef lstat # endif # define lstat(A, B) fakelstat(A, B) FILE *fakefopen(const char *file, const char *mode); # ifdef fopen # undef fopen # endif # define fopen(A, B) fakefopen(A, B) int fakeaccess(const char *file, int mode); # ifdef access # undef access # endif # define access(A, B) fakeaccess(A, B) int fakeunlink(const char *file); # ifdef unlink # undef unlink # endif # define unlink(A) fakeunlink(A) DIR *fakeopendir(const char *file); # ifdef opendir # undef opendir # endif # define opendir(A) fakeopendir(A) int fakechmod(const char *file, mode_t mode); # ifdef chmod # undef chmod # endif # define chmod(A, B) fakechmod(A, B) int fakemkdir(const char *file, mode_t mode); # ifdef mkdir # undef mkdir # endif # define mkdir(A, B) fakemkdir(A, B) int fakermdir(const char *file); # ifdef rmdir # undef rmdir # endif # define rmdir(A) fakermdir(A) # ifdef HAVE_UTIME int fakeutime(const char *file, struct utimbuf *buf); # ifdef utime # undef utime # endif # define utime(A, B) fakeutime(A, B) # endif # ifdef HAVE_UTIMES int fakeutimes(const char *file, struct timeval *buf); # ifdef utimes # undef utimes # endif # define utimes(A, B) fakeutimes(A, B) # endif int fakechown(const char *file, uid_t uid, gid_t gid); # ifdef chown # undef chown # endif # define chown(A, B, C) fakechown(A, B, C) # ifdef HAVE_MKFIFO int fakemkfifo(const char *file, mode_t mode); # ifdef mkfifo # undef mkfifo # endif # define mkfifo(A, B) fakemkfifo(A, B) # endif # ifdef HAVE_MKNOD int fakemknod(const char *file, mode_t mode, dev_t dev); # ifdef mknod # undef mknod # endif # define mknod(A, B, C) fakemknod(A, B, C) # endif int fakelink(const char *oldpath, const char *newpath); # ifdef link # undef link # endif # define link(A, B) fakelink(A, B) int fakesymlink(const char *oldpath, const char *newpath); # ifdef symlink # undef symlink # endif # define symlink(A, B) fakesymlink(A, B) int fakereadlink(const char *file, char *buf, size_t bufsiz); # ifdef readlink # undef readlink # endif # define readlink(A, B, C) fakereadlink(A, B, C) int fakerename(const char *oldpath, const char *newpath); # ifdef rename # undef rename # endif # define rename(A, B) fakerename(A, B) int fakeopen(const char *file, int flags, ...); # ifdef open # undef open # endif # define open fakeopen char *fakerealpath(const char *file, char *resolved_path); # ifdef realpath # undef realpath # endif # define realpath fakerealpath # if STATFS_TYPE == 1 int fakestatvfs64(const char *path, STATFS_STRUCT *str); # ifdef statvfs64 # undef statvfs64 # endif # define statvfs64(A, B) fakestatvfs64(A, B) # elif STATFS_TYPE == 2 int fakestatvfs(const char *path, STATFS_STRUCT *str); # ifdef statvfs # undef statvfs # endif # define statvfs(A, B) fakestatvfs(A, B) # elif STATFS_TYPE == 3 int fakestatfs(const char *path, STATFS_STRUCT *str); # ifdef statfs # undef statfs # endif # define statfs(A, B) fakestatfs(A, B) # endif # endif # endif #endif pure-ftpd-1.0.49.orig/src/messages_it.h0000644000175000017500000003550313446174132016664 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Timeout" #define MSG_CAPABILITIES "Impossibile modificare i permessi" #define MSG_CLIENT_CLOSED_CNX "Il client ha chiuso la connessione" #define MSG_CLIENT_READ_ERR "Errore di lettura dal client" #define MSG_CANT_OPEN_CNX "Impossibile aprire la connessione" #define MSG_CANT_CREATE_DATA_SOCKET "Impossibile creare il socket dati" #define MSG_DEBUG_CLIENT_IS "L'indirizzo del client č" #define MSG_SYNTAX_ERROR_IP "Errore di sintassi nell'indirizzo IP" #define MSG_PORT_SUCCESSFUL "Comando PORT eseguito con successo" #define MSG_ONLY_IPV4V6 "Sono supportati solo IPv4 e IPv6 (1,2)" #define MSG_ONLY_IPV4 "Č supportato solo IPv4 (1)" #define MSG_TIMEOUT_PARSER "Timeout - prova a digitare piů velocemente la prossima volta" #define MSG_LINE_TOO_LONG "Linea troppo lunga" #define MSG_LOG_OVERFLOW "Il client ha cercato di mandare in overflow il buffer della linea di comando" #define MSG_GOODBYE "Arrivederci. Hai uploadato %llu e downloadato %llu kbytes." #define MSG_DEBUG_COMMAND "Comando" #define MSG_IS_YOUR_CURRENT_LOCATION "č la tua locazione corrente" #define MSG_NOT_LOGGED_IN "Non ti sei loggato" #define MSG_AUTH_UNIMPLEMENTED "Estensioni di sicurezza non implementate" #define MSG_NO_FILE_NAME "Nessun nome di file" #define MSG_NO_DIRECTORY_NAME "Nessun nome di directory" #define MSG_NO_RESTART_POINT "Nessun punto di ripresa" #define MSG_ABOR_SUCCESS "Visto che vedi questo, ABOR deve essere riuscito" #define MSG_MISSING_ARG "Argomento mancante" #define MSG_GARBAGE_FOUND "Trovata spazzatura dopo il valore" #define MSG_VALUE_TOO_LARGE "Valore troppo grande" #define MSG_IDLE_TIME "Tempo di inattivitŕ impostato a %lu secondi" #define MSG_SITE_HELP "I seguenti comandi SITE sono riconosciuti" #define MSG_BAD_CHMOD "Permessi non validi" #define MSG_UNKNOWN_EXTENSION "č una estensione sconosciuta" #define MSG_XDBG_OK "Comando XDBG riuscito, il livello di debug č ora %d" #define MSG_UNKNOWN_COMMAND "Comando sconosciuto" #define MSG_TIMEOUT_NOOP "Timeout (nessuna operazione per %lu secondi)" #define MSG_TIMEOUT_DATA "Timeout (nessun nuovo dato per %lu secondi)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "Sei gia' loggato" #define MSG_ANY_PASSWORD "Qualunque password funzionerŕ" #define MSG_ANONYMOUS_LOGGED "Utente anonimo loggato" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Utente anonimo loggato nell'FTP virtuale" #define MSG_USER_OK "Utente %s OK. Richiesta password" #define MSG_CANT_DO_TWICE "Non possiamo farlo nella sessione corrente" #define MSG_UNABLE_SECURE_ANON "Impossibile attivare un FTP anonimo sicuro" #define MSG_BANDWIDTH_RESTRICTED "Il tuo uso della larghezza di banda č ristetto" #define MSG_NO_PASSWORD_NEEDED "Qualunque password funzionerŕ" #define MSG_NOTRUST "Mi dispiace, ma non posso fidarmi di te" #define MSG_WHOAREYOU "Per favore dimmi chi sei" #define MSG_AUTH_FAILED "Autenticazione fallita, spiacente" #define MSG_AUTH_TOOMANY "Troppe autenticazioni fallite" #define MSG_NO_HOMEDIR "Home directory non disponibile - annullo" #define MSG_NO_HOMEDIR2 "%s non esiste o č irraggiungibile" #define MSG_START_SLASH "Partenza in /" #define MSG_USER_GROUP_ACCESS "L'utente %s ha accesso di gruppo" #define MSG_FXP_SUPPORT "Questo server supporta trasferimenti FXP" #define MSG_RATIO "Devi rispettare una ratio di %u:%u (UL/DL)" #define MSG_CHROOT_FAILED "Impossibile impostare un jail chroot() sicuro" #define MSG_CURRENT_DIR_IS "OK. La directory corrente č %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. La directory limitata corrente č %s" #define MSG_IS_NOW_LOGGED_IN "%s č ora loggato" #define MSG_CANT_CHANGE_DIR "Impossibile cambiare la directory in %s" #define MSG_PATH_TOO_LONG "Percorso troppo lungo" #define MSG_CANT_PASV "Non puoi usare PASV nelle connessioni IPv6. Usa EPSV invece." #define MSG_CANT_PASSIVE "Impossibile aprire una connessione passiva" #define MSG_PORTS_BUSY "Tutte le porte TCP riservate sono occupate" #define MSG_GETSOCKNAME_DATA "Impossibile identificare il socket dati locale" #define MSG_GETPEERNAME "Impossibile identificare il socket locale" #define MSG_INVALID_IP "Spiacente, indirizzo fornito non valido" #define MSG_NO_EPSV "Prego, usare un client comforme a IPv6 con supportp per EPSV" #define MSG_BAD_PORT "Spiacente, ma non mi connetto a porte < 1024" #define MSG_NO_FXP "Non aprirň una connessione verso %s (solo verso %s)" #define MSG_FXP "Trasferimento FXP: da %s a %s" #define MSG_NO_DATA_CONN "Nessuna connessione dati" #define MSG_ACCEPT_FAILED "La connessione non puň essere accettata" #define MSG_ACCEPT_SUCCESS "Connessione dati accettata" #define MSG_CNX_PORT_FAILED "Impossibile aprire una connessione dati sulla porta %d" #define MSG_CNX_PORT "Mi sto collegando alla porta %d" #define MSG_ANON_CANT_MKD "Spiacente, gli utenti anonimi non hanno il permesso di creare directories" #define MSG_ANON_CANT_RMD "Spiacente, gli utenti anonimi non hanno il permesso di cancellare directories" #define MSG_ANON_CANT_RENAME "Gli utenti anonimi non hanno il permesso di spostare/rinominare files" #define MSG_ANON_CANT_CHANGE_PERMS "Gli utnti anonimi non possono cambiare i permessi" #define MSG_GLOB_NO_MEMORY "Memoria esaurita durante il globbing di %s" #define MSG_PROBABLY_DENIED "(Questo probabilmente significa \"Permesso negato\")" #define MSG_GLOB_READ_ERROR "Errore di lettura durante il globbing di %s" #define MSG_GLOB_NO_MATCH "Nessuna corrispondenza di %s in %s" #define MSG_CHMOD_FAILED "Impossibile cambiare i permessi su %s" #define MSG_CHMOD_SUCCESS "Permessi cambiati su %s" #define MSG_CHMOD_TOTAL_FAILURE "Spiacente, ma non posso cambiare nessun permesso" #define MSG_ANON_CANT_DELETE "Gli utenti anonimi non possono cancellare files" #define MSG_ANON_CANT_OVERWRITE "Gli utenti anonimi non possono sovrascrivere files esistenti" #define MSG_DELE_FAILED "Impossibile cancellare %s" #define MSG_DELE_SUCCESS "Cancellato %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "Nessun file cancellato" #define MSG_LOAD_TOO_HIGH \ "Il carico era %3.2f quando ti sei connesso. Non permettiamo downloads\n" \ "da parte di utenti anonimi quando il carico č cosě alto. Gli uploads sono sempre\n" \ "permessi." #define MSG_OPEN_FAILURE "Impossibile aprire %s" #define MSG_OPEN_FAILURE2 "Impossibile aprire quel file" #define MSG_STAT_FAILURE "Impossibile trovare la dimensione del file" #define MSG_STAT_FAILURE2 "Impossibile controllare l'esistenza del file" #define MSG_REST_TOO_LARGE_FOR_FILE "L'offset di ripartenza %lld č troppo grande per la dimensione del file %lld." #define MSG_REST_RESET "Offset di ripartenza resettato a 0" #define MSG_NOT_REGULAR_FILE "Posso servire solo normali files" #define MSG_NOT_MODERATED \ "Questo file č stato uploadato da un utente anonimo. Non č\n" \ "stato ancora approvato per il downloading dagli amministratore del sito." #define MSG_RATIO_DENIAL \ "Spiacente, ma la ratio di upload/download č %u:%u .\n" \ "Hai uploadato %llu Kb e downloadato %llu Kb.\n" \ "Per favore uploada un po' di roba e prova a scaricare piů tardi." #define MSG_NO_MORE_TO_DOWNLOAD "Niente altro da downloadare" #define MSG_WINNER "Il computer č tuo amico. Fidati del computer" #define MSG_KBYTES_LEFT "%.1f kbytes da downloadare" #define MSG_ABORTED "Trasferimento annullato" #define MSG_DATA_WRITE_FAILED "Errore durante la scrittura sulla connessione dati" #define MSG_DATA_READ_FAILED "Errore durante la lettura dalla connessione dati" #define MSG_MMAP_FAILED "Impossibile mappare il file in memoria" #define MSG_WRITE_FAILED "Errore durante la scrittura sul file" #define MSG_TRANSFER_RATE_M "%.3f secondi (misurati qui), %.2f Mbytes al secondo" #define MSG_TRANSFER_RATE_K "%.3f secondi (misurati qui), %.2f Kbytes al secondo" #define MSG_TRANSFER_RATE_B "%.3f secondi (misurati qui), %.2f bytes al secondo" #define MSG_SPACE_FREE_M "%.1f Mbytes di spazio libero su disco" #define MSG_SPACE_FREE_K "%f Kbytes di spazio libero su disco" #define MSG_DOWNLOADED "downloadato" #define MSG_REST_NOT_NUMERIC "REST ha bisogno di un parametro numerico" #define MSG_REST_ASCII_STRICT "Il marcatore di reply deve essere 0 in modalitŕ ASCII" #define MSG_REST_ASCII_WORKAROUND "Ripartenza a %lld. Ma siamo in modalitŕ ASCII" #define MSG_REST_SUCCESS "Ripartenza a %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Nome directory proibito" #define MSG_SANITY_FILE_FAILURE "Nome file proibito: %s" #define MSG_MKD_FAILURE "Impossibile creare la directory" #define MSG_MKD_SUCCESS "La directory č stata creata con successo" #define MSG_RMD_FAILURE "Impossibile cancellare la directory" #define MSG_RMD_SUCCESS "La directory č stata cancellata con successo" #define MSG_TIMESTAMP_FAILURE "Impossibile ottenere un timestamp" #define MSG_MODE_ERROR "Sono supportati solo le modalitŕ ASCII e binary" #define MSG_CREATE_FAILURE "Impossibile creare il file" #define MSG_ABRT_ONLY "ABRT č l'unico comando consentito durante l'upload" #define MSG_UPLOAD_PARTIAL "parzialmente uploadato" #define MSG_REMOVED "cancellato" #define MSG_UPLOADED "uploadato" #define MSG_GMTIME_FAILURE "Impossibile ottenere l'ora locale" #define MSG_TYPE_8BIT_FAILURE "Sono supportati solo bytes di 8-bit, non siamo rimasti a 10 anni fŕ" #define MSG_TYPE_UNKNOWN "TYPE sconosciuto" #define MSG_TYPE_SUCCESS "TYPE č ora" #define MSG_STRU_FAILURE "Č supportato solo F(ile)" #define MSG_MODE_FAILURE "Per favore usa la modalitŕ S(tream)" #define MSG_RENAME_ABORT "Annullo la precedente operazione di rinomina" #define MSG_RENAME_RNFR_SUCCESS "RNFR accettato - il file esiste, pronto per destinazione" #define MSG_FILE_DOESNT_EXIST "Spiacente, ma quel file non esiste" #define MSG_RENAME_ALREADY_THERE "RENAME Fallito - il file di destinazione esiste giŕ" #define MSG_RENAME_NORNFR "Č necessario RNFR prima di RNTO" #define MSG_RENAME_FAILURE "Errore in rinomina/sposta" #define MSG_RENAME_SUCCESS "File rinominato o spostato con successo" #define MSG_NO_SUPERSERVER "Lancia pure-ftpd da un super-server (come tcpserver)" #define MSG_NO_FTP_ACCOUNT "Impossibile trovare l'account 'ftp'" #define MSG_CONF_ERR "Errore di configurazione" #define MSG_NO_VIRTUAL_FILE "Nome file degli utenti virtuali mancante" #define MSG_ILLEGAL_THROTTLING "Valore per throttling non valido" #define MSG_ILLEGAL_TRUSTED_GID "Gid trusted per chroot non valido" #define MSG_ILLEGAL_USER_LIMIT "Limite utenti non valido" #define MSG_ILLEGAL_FACILITY "Nome facility sconosciuto" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "File di configurazione LDAP non valido" #define MSG_ILLEGAL_LOAD_LIMIT "Limite di carico non valido" #define MSG_ILLEGAL_PORTS_RANGE "Range di porte non valido" #define MSG_ILLEGAL_LS_LIMITS "Limiti 'ls' non validi" #define MSG_ILLEGAL_FORCE_PASSIVE "Indirizzo IP forzato per connessioni passive non valido" #define MSG_ILLEGAL_RATIO "Ratio di upload/download non valida" #define MSG_ILLEGAL_UID_LIMIT "Limite uid non valido" #define MSG_ILLEGAL_OPTION "Opzione run-time sconosciuta" #define MSG_LDAP_MISSING_BASE "LDAPBaseDN mancante nel file di configurazione LDAP" #define MSG_LDAP_WRONG_PARMS "Parametri LDAP errati" #define MSG_NEW_CONNECTION "Nuova connessione da %s" #define MSG_WELCOME_TO "Benvenuto in" #define MSG_MAX_USERS "%lu utenti (il massimo) sono giŕ colleggati, spiacente" #define MSG_NB_USERS "Sei l'utente numero %u di %u consentiti" #define MSG_WELCOME_TIME "L'ora locale č %02d:%02d. Porta del server: %u." #define MSG_ANONYMOUS_FTP_ONLY "Qui č permesso solo FTP anonimo" #define MSG_RATIOS_EVERYONE "LE RATIOS SONO ABILITATE PER TUTTI:" #define MSG_RATIOS_ANONYMOUS "GLI UTENTI ANONIMI SONO SOGGETTI A UNA RATIO DI UL/DL :" #define MSG_RATIOS_RULE "per downloadare %u Mb, č obbligatorio uploadare %u Mb di roba." #define MSG_INFO_IDLE_M "Sarai disconnesso dopo %lu minuti di inattivitŕ." #define MSG_INFO_IDLE_S "Sarai disconnesso dopo %lu secondi di inattivitŕ." #define MSG_CANT_READ_FILE "Spiacente, impossibile leggere [%s]" #define MSG_LS_TRUNCATED "Output troncato a %u corrispondenze" #define MSG_LS_SUCCESS "%u corrispondenze totali" #define MSG_LOGOUT "Logout." #define MSG_AUTH_FAILED_LOG "Autenticazione falita per l'utente [%s]" #define MSG_ILLEGAL_UMASK "Umask non valida" #define MSG_STANDALONE_FAILED "Impossibile avviare il server in modalitŕ standalone" #define MSG_NO_ANONYMOUS_LOGIN "Questo č un sistema privato - Nessun login anonimo" #define MSG_ANONYMOUS_ANY_PASSWORD "Qualunque password funzionerŕ" #define MSG_MAX_USERS_IP "Troppe connessioni (%lu) da questo IP" #define MSG_ACTIVE_DISABLED "La modalitŕ attiva č disabilitata" #define MSG_TRANSFER_SUCCESSFUL "File trasferito con successo" #define MSG_NO_DISK_SPACE "Disco pieno - uploada piů tardi" #define MSG_OUT_OF_MEMORY "Memoria esaurita" #define MSG_ILLEGAL_TRUSTED_IP "Indirizzo IP trusted non valido" #define MSG_NO_ASCII_RESUME "Il resume ASCII non č sicuro, cancella prima il file" #define MSG_UNKNOWN_ALTLOG "Formato di logging sconosciuto" #define MSG_ACCOUNT_DISABLED "Impossibile loggarsi come [%s] : account disabilitato" #define MSG_SQL_WRONG_PARMS "Parametri SQL errati" #define MSG_ILLEGAL_CONFIG_FILE_SQL "File di configurazione SQL non valido " #define MSG_SQL_MISSING_SERVER "Server mancante nel file di configurazione SQL" #define MSG_SQL_DOWN "Il server SQL sembra essere down" #define MSG_ILLEGAL_QUOTA "Quota non valida" #define MSG_QUOTA_FILES "%llu files usati (%d%%) - autorizzati: %llu files" #define MSG_QUOTA_SIZE "%llu Kbytes usati (%d%%) - autorizzati: %llu Kb" #define MSG_QUOTA_EXCEEDED "Quota superata : [%s] non verrŕ salvato" #define MSG_AUTH_UNKNOWN "Metodo di autenticazione sconosciuto" #define MSG_PDB_BROKEN "Impossibile leggere il file puredb indicizzato (o č stato trovato un vecchio formato) - Prova con pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s č un alias per %s." #define MSG_ALIASES_UNKNOWN "Alias %s sconosciuto." #define MSG_ALIASES_BROKEN_FILE "File degli aliases danneggiato" #define MSG_ALIASES_LIST "Sono disponibili i seguenti aliases :" #define MSG_PERUSER_MAX "Non posso accettare piů di %lu connessioni dallo stesso utente" #define MSG_IPV6_OK "Anche le connessioni IPv6 sono benvenute su questo server" #define MSG_TLS_INFO "TLS: Abilitato %s con cifratura %s a %d bit" #define MSG_TLS_WEAK "TLS: Cifratura troppo debole" #define MSG_TLS_NEEDED "Spiacente, su questo server non sono ammesse sessioni in chiaro.\n" \ "Ricollegati usando i sistemi di sicurezza TLS." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/pure-uploadscript_p.h0000644000175000017500000000152613350542502020352 0ustar rackeracke#ifndef __PURE_UPLOADSCRIPT_P_H__ # define __PURE_UPLOADSCRIPT_P_H__ 1 # ifndef HAVE_GETOPT_LONG # include "bsd-getopt_long.h" # else # include # endif # ifdef HAVE_SYS_WAIT_H # include # endif static const char *GETOPT_OPTIONS = "Bg:" # ifndef NO_GETOPT_LONG "h" # endif "p:r:u:"; #ifndef NO_GETOPT_LONG static struct option long_options[] = { { "daemonize", 0, NULL, 'B' }, { "gid", 1, NULL, 'g' }, # ifndef NO_GETOPT_LONG { "help", 0, NULL, 'h' }, # endif { "pidfile", 1, NULL, 'p' }, { "run", 1, NULL, 'r' }, { "uid", 1, NULL, 'u' }, { NULL, 0, NULL, 0 } }; #endif static signed char daemonize; static const char *uploadscript_pid_file = UPLOADSCRIPT_PID_FILE; static uid_t uid; static gid_t gid; static const char *script; #define OPEN_TRIES 30U #define OPEN_DELAY 1U #endif pure-ftpd-1.0.49.orig/src/log_pgsql.h0000644000175000017500000000151213350542502016333 0ustar rackeracke#ifndef __LOG_PGSQL_H__ #define __LOG_PGSQL_H__ 1 #define PASSWD_SQL_ARGON2 "argon2" #define PASSWD_SQL_SCRYPT "scrypt" #define PASSWD_SQL_CRYPT "crypt" #define PASSWD_SQL_CLEARTEXT "cleartext" #define PASSWD_SQL_PGSQL "password" #define PASSWD_SQL_MD5 "md5" #define PASSWD_SQL_SHA1 "sha1" #define PASSWD_SQL_ANY "any" #define PGSQL_DEFAULT_SERVER "localhost" #define PGSQL_DEFAULT_PORT 5432 #define PGSQL_MAX_REQUEST_LENGTH ((size_t) 8192U) #define PGSQL_TRANSACTION_START "BEGIN" #define PGSQL_TRANSACTION_END "COMMIT" void pw_pgsql_parse(const char * const file); void pw_pgsql_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer); void pw_pgsql_exit(void); #endif pure-ftpd-1.0.49.orig/src/bsd-realpath.h0000644000175000017500000000115513350542501016714 0ustar rackeracke#ifndef __FAKEREALPATH_H__ #define __FAKEREALPATH_H__ 1 #if defined(__svr4__) && defined(__sun__) /* Solaris 2 aka SunOS 5 */ # undef USE_BUILTIN_REALPATH # define USE_BUILTIN_REALPATH 1 #endif #if defined(__atheos__) # undef USE_BUILTIN_REALPATH # define USE_BUILTIN_REALPATH 1 #endif #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # undef USE_BUILTIN_REALPATH # define USE_BUILTIN_REALPATH 1 #endif #if !defined(HAVE_REALPATH) || defined(USE_BUILTIN_REALPATH) char *bsd_realpath(const char *path, char resolved[PATH_MAX]); # define realpath(A, B) bsd_realpath(A, B) #endif #endif pure-ftpd-1.0.49.orig/src/pure-authd_p.h0000644000175000017500000000514313446206237016755 0ustar rackeracke#ifndef __PURE_AUTHD_P_H__ #define __PURE_AUTHD_P_H__ 1 #ifdef WITH_EXTAUTH #ifndef HAVE_GETOPT_LONG # include "bsd-getopt_long.h" #else # include #endif #ifdef HAVE_SYS_WAIT_H # include #endif #include #ifndef SUN_LEN # define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) NULL)->sun_path) \ + strlen((ptr)->sun_path)) #endif #ifndef AUTHD_BACKLOG # define AUTHD_BACKLOG 42 #endif static const char *GETOPT_OPTIONS = "Bg:" #ifndef NO_GETOPT_LONG "h" #endif "p:r:s:u:"; #ifndef NO_GETOPT_LONG static struct option long_options[] = { { "daemonize", 0, NULL, 'B' }, { "gid", 1, NULL, 'g' }, # ifndef NO_GETOPT_LONG { "help", 0, NULL, 'h' }, # endif { "pidfile", 1, NULL, 'p' }, { "run", 1, NULL, 'r' }, { "socket", 1, NULL, 's' }, { "uid", 1, NULL, 'u' }, { NULL, 0, NULL, 0 } }; #endif static signed char daemonize; static uid_t uid; static gid_t gid; static const char *socketpath; static const char *authd_pid_file = AUTHD_PID_FILE; static const char *script; static volatile signed char exit_authd; static volatile int kindy = -1; static volatile signed char ended; static void callback_client_account(const char *str); static void callback_client_password(const char *str); static void callback_client_sa_host(const char *str); static void callback_client_sa_port(const char *str); static void callback_client_peer_host(const char *str); static void callback_client_encrypted(const char *str); static void callback_client_sni_name(const char *str); static void callback_client_end(const char *str); typedef struct ExtauthdCallBack_ { const char *keyword; void (*func)(const char *str); } ExtauthdCallBack; static ExtauthdCallBack extauthd_callbacks[] = { { EXTAUTH_CLIENT_ACCOUNT, callback_client_account } , { EXTAUTH_CLIENT_PASSWORD, callback_client_password }, { EXTAUTH_CLIENT_SA_HOST, callback_client_sa_host }, { EXTAUTH_CLIENT_SA_PORT, callback_client_sa_port }, { EXTAUTH_CLIENT_PEER_HOST, callback_client_peer_host }, { EXTAUTH_CLIENT_ENCRYPTED, callback_client_encrypted }, { EXTAUTH_CLIENT_SNI_NAME, callback_client_sni_name }, { EXTAUTH_CLIENT_END, callback_client_end }, { NULL, callback_client_end } }; #define ENV_AUTHD_ACCOUNT "AUTHD_ACCOUNT" #define ENV_AUTHD_PASSWORD "AUTHD_PASSWORD" #define ENV_AUTHD_SA_HOST "AUTHD_LOCAL_IP" #define ENV_AUTHD_SA_PORT "AUTHD_LOCAL_PORT" #define ENV_AUTHD_PEER_HOST "AUTHD_REMOTE_IP" #define ENV_AUTHD_ENCRYPTED "AUTHD_ENCRYPTED" #define ENV_AUTHD_CLIENT_SNI_NAME "AUTHD_CLIENT_SNI_NAME" #define AUTHD_SCRIPT_TIMEOUT 60U #endif #endif pure-ftpd-1.0.49.orig/src/messages_zh_cn.h0000644000175000017500000002621513446174132017351 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "łŹĘą" #define MSG_CAPABILITIES "Îޡ¨ÇĐťťĐÔÄÜ" #define MSG_CLIENT_CLOSED_CNX "ÓĂť§śËšŘąŐÁŹ˝Ó" #define MSG_CLIENT_READ_ERR "´ÓÓĂť§śËśÁČĄˇ˘Éú´íÎó" #define MSG_CANT_OPEN_CNX "Îޡ¨żŞĆôÁŹ˝Ó" #define MSG_CANT_CREATE_DATA_SOCKET "Îޡ¨˝¨Á˘ĘýžÝ˝ÓżÚ" #define MSG_DEBUG_CLIENT_IS "ÓĂť§śËľŘÖˇĘÇ" #define MSG_SYNTAX_ERROR_IP "Ó´íÎóÓÚIPľŘÖˇ" #define MSG_PORT_SUCCESSFUL "PORTĂüÁîOK" #define MSG_ONLY_IPV4V6 "˝öÖ§łÖIPv4ÓëIPv6 (1,2)" #define MSG_ONLY_IPV4 "˝öÖ§łÖIPv4 (1)" #define MSG_TIMEOUT_PARSER "łŹĘą - ĎÂťŘĘÔĘÔÇĂźüĘąËٜȿěŇťľă" #define MSG_LINE_TOO_LONG "ĂüÁîĐĐšýł¤" #define MSG_LOG_OVERFLOW "ÓĂť§ł˘ĘÔŇŞŇçÂúĂüÁîĐĐťşłĺÇř" #define MSG_GOODBYE "ÔŮźűĄŁÄúÉĎ´Ť%llu˛˘ĎÂÔŘ%llu kbytes." #define MSG_DEBUG_COMMAND "ĂüÁî" #define MSG_IS_YOUR_CURRENT_LOCATION "ĘÇÄúĿǰľÄÎťÖĂ" #define MSG_NOT_LOGGED_IN "Äú˛˘Î´ľÇÂź" #define MSG_AUTH_UNIMPLEMENTED "°˛ČŤŔŠłäĎîδʾʊ" #define MSG_NO_FILE_NAME "ÎŢÎÄźţĂűłĆ" #define MSG_NO_DIRECTORY_NAME "ÎŢĿŸĂűłĆ" #define MSG_NO_RESTART_POINT "ÎŢÖŘĐÂżŞĘźľă" #define MSG_ABOR_SUCCESS "ABOR OK" #define MSG_MISSING_ARG "ČąÉٲÎĘý" #define MSG_GARBAGE_FOUND "˛ÎĘýÖľşóÓĐÎŢÓĂľÄ×Ö´Ž" #define MSG_VALUE_TOO_LARGE "˛ÎĘýÖľšý´ó" #define MSG_IDLE_TIME "ˇ˘´ôĘąźäÉčÎŞ %lu Ăë" #define MSG_SITE_HELP "ĎÂÁĐľÄSITEĂüÁîąťČĎżÉ" #define MSG_BAD_CHMOD "ÎŢЧľÄȨĎŢ" #define MSG_UNKNOWN_EXTENSION "ĘÇδ֪ľÄŔŠłäĎî" #define MSG_XDBG_OK "XDBGĂüÁîOKŁŹľ÷ĘÔźśąđĎÖÔÚĘÇ %d" #define MSG_UNKNOWN_COMMAND "δ֪ľÄĂüÁî" #define MSG_TIMEOUT_NOOP "łŹĘą (ŇŃ %lu ĂëÎ޲Ů×÷)" #define MSG_TIMEOUT_DATA "łŹĘą (ŇŃ %lu ĂëÎŢĐÂĘýžÝ)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "ÄúŇŃž­ľÇÂź" #define MSG_ANY_PASSWORD "ČÎşÎĂÜÂëśźżÉÓĂ" #define MSG_ANONYMOUS_LOGGED "ÄäĂűĘšÓĂŐßľÇÂź" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "ÄäĂűĘšÓĂŐßľÇÂźľ˝ĐéÄâFTP" #define MSG_USER_OK "ĘšÓĂŐß %s OK. ĐčŇŞĂÜÂë." #define MSG_CANT_DO_TWICE "ÔÚĿǰÁŹ˝ÓĆڟ䲝ÄÜŐâŃů×ö" #define MSG_UNABLE_SECURE_ANON "Îޡ¨˝¨Á˘°˛ČŤÄäĂűFTP" #define MSG_BANDWIDTH_RESTRICTED "ÄúľÄ´řżíĘšÓĂĘÜĎŢÖĆ" #define MSG_NO_PASSWORD_NEEDED "ČÎşÎĂÜÂëśźżÉÓĂ" #define MSG_NOTRUST "ą§Ç¸ŁŹÎŇÎޡ¨ĐĹČÎÄú" #define MSG_WHOAREYOU "Çë¸ćËßÎŇÄăĘÇË­" #define MSG_AUTH_FAILED "Ńé֤ʧ°ÜŁŹą§Ç¸" #define MSG_AUTH_TOOMANY "Ńé֤ʧ°ÜĚŤśŕ´Î" #define MSG_NO_HOMEDIR "ĂťÓĐźŇĿŸ - ČĄĎű" #define MSG_NO_HOMEDIR2 "%s ˛ť´ćÔÚťňÎޡ¨ľ˝´ď" #define MSG_START_SLASH "żŞĘźÓÚ /" #define MSG_USER_GROUP_ACCESS "ĘšÓĂŐß %s ÓĐŇÔĎÂ×éľÄȨĎŢŁş" #define MSG_FXP_SUPPORT "Őâ¸öˇţÎńĆ÷Ö§łÖFXP´ŤĘä" #define MSG_RATIO "ÄúąŘĐë×ńĘŘ %u:%u (UL/DL) ąČÂĘ" #define MSG_CHROOT_FAILED "Îޡ¨É蜨°˛ČŤľÄchroot() jail" #define MSG_CURRENT_DIR_IS "OK. ĿǰľÄĿŸĘÇ %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. ĿǰĎŢÖĆľÄĿŸĘÇ %s" #define MSG_IS_NOW_LOGGED_IN "%s ĎÖÔÚľÇÂź" #define MSG_CANT_CHANGE_DIR "Îޡ¨ąä¸üĿŸľ˝ %s" #define MSG_PATH_TOO_LONG "¡žśĚŤł¤" #define MSG_CANT_PASV "Äú˛ťÄÜÔÚIPv6ÁŹ˝ÓĘšÓĂPASVĄŁÇë¸ÄÓĂEPSVĄŁ" #define MSG_CANT_PASSIVE "Îޡ¨żŞĆôąťśŻĘ˝ÁŹ˝Ó" #define MSG_PORTS_BUSY "ËůÓĐąŁÁôľÄTCP portsśźŐýĂŚÂľÖĐ" #define MSG_GETSOCKNAME_DATA "Îޡ¨ĘśąđąžťúĘýžÝ˝ÓżÚ" #define MSG_GETPEERNAME "Îޡ¨Ęśąđąžťú˝ÓżÚ" #define MSG_INVALID_IP "ą§Ç¸ŁŹ¸řľÄĘÇÎŢЧľÄľŘÖˇ" #define MSG_NO_EPSV "ÇëĘšÓáűşĎIPv6˛˘Ö§łÖEPSVľÄÓĂť§śË" #define MSG_BAD_PORT "ą§Ç¸ŁŹÎޡ¨ÁŹ˝Óľ˝ ports < 1024" #define MSG_NO_FXP "ÎҲťÄÜżŞĆôÁŹ˝Óľ˝ %s (˝ö %s)" #define MSG_FXP "FXP´ŤĘä: ´Ó %s ľ˝ %s" #define MSG_NO_DATA_CONN "ÎŢĘýžÝÁŹ˝Ó" #define MSG_ACCEPT_FAILED "ÁŹ˝ÓÎޡ¨ąť˝ÓĘÜ" #define MSG_ACCEPT_SUCCESS "˝ÓĘÜĘýžÝÁŹ˝Ó" #define MSG_CNX_PORT_FAILED "Îޡ¨żŞĆôĘýžÝÁŹ˝Óľ˝port %d" #define MSG_CNX_PORT "ÁŹ˝Óľ˝port %d" #define MSG_ANON_CANT_MKD "ą§Ç¸ŁŹ˛ť×źÄäĂűĘšÓĂŐß˝¨Á˘ÄżÂź" #define MSG_ANON_CANT_RMD "ą§Ç¸ŁŹ˛ť×źÄäĂűĘšÓĂŐßÉžłýĿŸ" #define MSG_ANON_CANT_RENAME "˛ť×źÄäĂűĘšÓĂŐßŇĆśŻ/¸üĂűÎÄźţ" #define MSG_ANON_CANT_CHANGE_PERMS "ÄäĂűĘšÓĂŐ߲ťÄÜąä¸üȨĎŢ" #define MSG_GLOB_NO_MEMORY "ĐÎłÉ %s ĘąŁŹÄڴ沝×ă" #define MSG_PROBABLY_DENIED "(ŐâżÉÄÜŇâÎś \"žÜžřˇĂÎĘ\")" #define MSG_GLOB_READ_ERROR "ĐÎłÉ %s Ęąˇ˘ÉúśÁČĄ´íÎó" #define MSG_GLOB_NO_MATCH "ĂťÓСűşĎľÄ %s ŁŹÓÚ %s ÖĐ" #define MSG_CHMOD_FAILED "˛ťÄÜąä¸ü %s ȨĎŢ" #define MSG_CHMOD_SUCCESS " %s ȨĎŢŇŃąä¸ü" #define MSG_CHMOD_TOTAL_FAILURE "ą§Ç¸ŁŹÎŇÎޡ¨ąä¸üČÎşÎȨĎŢ" #define MSG_ANON_CANT_DELETE "ÄäĂűĘšÓĂŐ߲ťÄÜÉžłýÎÄźţ" #define MSG_ANON_CANT_OVERWRITE "ÄäĂűĘšÓĂŐ߲ťÄܸ˛Đ´ĎÖ´ćľÄÎÄźţ" #define MSG_DELE_FAILED "Îޡ¨Éžłý %s" #define MSG_DELE_SUCCESS "Éžłý %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "ĂťÓĐÉžłýÎÄźţ" #define MSG_LOAD_TOO_HIGH "ľąÄúÁŹ˝ÓĘą¸şÔŘĘÇ %3.2f ĄŁ¸şÔŘČç´Ë¸ßĘąŁŹÎŇĂDzť×źÄäĂűĘšÓĂŐßĎÂÔŘĄŁ\nÉĎ´ŤÔňśźĘÇżÉŇÔľÄ" #define MSG_OPEN_FAILURE "Îޡ¨żŞĆô %s" #define MSG_OPEN_FAILURE2 "Îޡ¨żŞĆôÄǸöÎÄźţ" #define MSG_STAT_FAILURE "Îޡ¨ŐŇľ˝ÎÄźţ´óĐĄ" #define MSG_STAT_FAILURE2 "Îޡ¨źě˛éÎÄźţĘǡń´ćÔÚ" #define MSG_REST_TOO_LARGE_FOR_FILE "ŐëśÔÎÄźţ´óĐĄ %lldĘąŁŹÖŘĐÂżŞĘźoffset %lld ťášý´óĄŁ" #define MSG_REST_RESET "offsetÖŘÉčÎŞ 0 ÖŘĐÂżŞĘź" #define MSG_NOT_REGULAR_FILE "ÎŇÖťÄÜĎÂÔŘŇť°ăÎÄźţ" #define MSG_NOT_MODERATED "´ËÎÄźţÓÉÄäĂűĘšÓĂŐßÉĎ´ŤĄŁ\nťšĂťÓĐąťŐžľăšÜŔíÔąşËןšŠĎÂÔŘĄŁ" #define MSG_RATIO_DENIAL "ą§Ç¸ŁŹÉĎ´Ť/ĎÂÔŘÂĘĘÇ %u:%u ĄŁ\nÄúĿǰÉĎ´Ť %llu Kb ĎÂÔŘ %llu KbĄŁ\nÇëÉĎ´ŤŇťĐŠşĂśŤÎ÷ČťşóÍíľăÔŮł˘ĘÔĎÂÔŘĄŁ" #define MSG_NO_MORE_TO_DOWNLOAD "ŇŃĂťśŤÎ÷żÉĎÂÔŘ" #define MSG_WINNER "ľçÄÔĘÇÄúľÄĹóÓŃĄŁĐĹČÎľçÄÔ" #define MSG_KBYTES_LEFT "ťšĘŁĎ %.1f kbytesŇŞĎÂÔŘ" #define MSG_ABORTED "´ŤĘäÖĐÖš" #define MSG_DATA_WRITE_FAILED "ĘýžÝÁŹ˝ÓĐ´ČëĘąˇ˘Éú´íÎó" #define MSG_DATA_READ_FAILED "ĘýžÝÁŹ˝ÓśÁČĄĘąˇ˘Éú´íÎó" #define MSG_MMAP_FAILED "Îޡ¨˝ŤÎÄźţmap˝řÄÚ´ć" #define MSG_WRITE_FAILED "Đ´ČëÎÄźţĘąˇ˘Éú´íÎó" #define MSG_TRANSFER_RATE_M "%.3f Ăë (ľ˝ÄżÇ°),ĂżĂë %.2f Mbytes" #define MSG_TRANSFER_RATE_K "%.3f Ăë (ľ˝ÄżÇ°),ĂżĂë %.2f Kbytes" #define MSG_TRANSFER_RATE_B "%.3f Ăë (ľ˝ÄżÇ°),ĂżĂë %.2f bytes" #define MSG_SPACE_FREE_M "%.1f Mbytes ĘŁÓŕÓ˛ĹĚżŐźä" #define MSG_SPACE_FREE_K "%f Kbytes ĘŁÓŕÓ˛ĹĚżŐźä" #define MSG_DOWNLOADED "ŇŃĎÂÔŘ" #define MSG_REST_NOT_NUMERIC "RESTĐčŇŞĘý×Ö˛ÎĘý" #define MSG_REST_ASCII_STRICT "ÔÚASCIIÄŁĘ˝ťŘÓŚąęźÇąŘĐëĘÇ 0" #define MSG_REST_ASCII_WORKAROUND "ÖŘĐÂżŞĘźÓÚ %lldĄŁľŤĘÇÎŇĂÇÔÚASCIIÄŁĘ˝" #define MSG_REST_SUCCESS "ÖŘĐÂżŞĘźÓÚ %lld" #define MSG_SANITY_DIRECTORY_FAILURE "˝űÓĂľÄĿŸĂűłĆ" #define MSG_SANITY_FILE_FAILURE "˝űÓĂľÄÎÄźţĂű: %s" #define MSG_MKD_FAILURE "Îޡ¨˝¨Á˘ÄżÂź" #define MSG_MKD_SUCCESS "˝¨Á˘ÄżÂźOK" #define MSG_RMD_FAILURE "Îޡ¨ÉžłýĿŸ" #define MSG_RMD_SUCCESS "ÉžłýĿŸOK" #define MSG_TIMESTAMP_FAILURE "Îޡ¨ČĄľĂĘąźä´ÁźÇ" #define MSG_MODE_ERROR "ÖťÖ§łÖASCIIź°binaryÄŁĘ˝" #define MSG_CREATE_FAILURE "Îޡ¨˝¨Á˘ÎÄźţ" #define MSG_ABRT_ONLY "ľąÉĎ´ŤĘąABRTĘÇΨҝÄÜÓĂľÄĂüÁî" #define MSG_UPLOAD_PARTIAL "˛żˇÝÉĎ´Ť" #define MSG_REMOVED "ÉžłýÁË" #define MSG_UPLOADED "ÉĎ´ŤÁË" #define MSG_GMTIME_FAILURE "Îޡ¨ČĄľĂľąľŘĘąźä" #define MSG_TYPE_8BIT_FAILURE "ÖťÖ§łÖ8-bit bytesŁŹĎÖÔÚ˛ťąČĘŽÄęǰÁË" #define MSG_TYPE_UNKNOWN "δ֪ľÄTYPE" #define MSG_TYPE_SUCCESS "TYPEĿǰĘÇ" #define MSG_STRU_FAILURE "ÖťÖ§łÖF(ile)" #define MSG_MODE_FAILURE "ÇëĘšÓĂS(tream)ÄŁĘ˝" #define MSG_RENAME_ABORT "ÖĐ֚֎ǰľÄ¸üĂű˛Ů×÷" #define MSG_RENAME_RNFR_SUCCESS "RNFR˝ÓĘÜ - ÎÄźţ´ćÔÚŁŹ×źą¸ľ˝ÄżľÄľŘ" #define MSG_FILE_DOESNT_EXIST "ą§Ç¸ŁŹÎÄźţ˛ť´ćÔÚ" #define MSG_RENAME_ALREADY_THERE "RENAMEʧ°Ü - ÄżľÄÎÄźţŇŃž­´ćÔÚ" #define MSG_RENAME_NORNFR "RNTOǰĐčŇŞRNFR" #define MSG_RENAME_FAILURE "¸üĂű/ŇĆśŻĘ§°Ü" #define MSG_RENAME_SUCCESS "ÎÄźţ¸üĂű/ŇĆśŻOK" #define MSG_NO_SUPERSERVER "ÇëÔÚsuper-server (like tcpserver)ÖĐÖ´ĐĐpure-ftpd" #define MSG_NO_FTP_ACCOUNT "Îޡ¨ŐŇľ˝'ftp'ŐĘşĹ" #define MSG_CONF_ERR "ĹäÖĂ´íÎó" #define MSG_NO_VIRTUAL_FILE "ČąÉŮĐéÄâĘšÓĂŐßÎÄźţĂű" #define MSG_ILLEGAL_THROTTLING "˛ťşĎˇ¨ľÄ˝ÚÁ÷Öľ" #define MSG_ILLEGAL_TRUSTED_GID "˛ťşĎˇ¨ľÄchrootĐĹČÎgid" #define MSG_ILLEGAL_USER_LIMIT "˛ťşĎˇ¨ľÄĘšÓĂŐßĎŢÖĆ" #define MSG_ILLEGAL_FACILITY "δ֪ľÄźÇÂźÉčĘŠĂűłĆ" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "ÎŢЧľÄLDAPĹäÖĂÎÄźţ" #define MSG_ILLEGAL_LOAD_LIMIT "˛ťşĎˇ¨ľÄ¸şÔŘĎŢÖĆ" #define MSG_ILLEGAL_PORTS_RANGE "˛ťşĎˇ¨ľÄśËżÚˇśÎ§" #define MSG_ILLEGAL_LS_LIMITS "˛ťşĎˇ¨ľÄ'ls'ĎŢÖĆ" #define MSG_ILLEGAL_FORCE_PASSIVE "ąťśŻĘ˝ÁŹ˝ÓĘąŁŹ˛ťşĎˇ¨ľÄÇżÖĆIP" #define MSG_ILLEGAL_RATIO "˛ťşĎˇ¨ľÄÉĎ´Ť/ĎÂÔŘÂĘ" #define MSG_ILLEGAL_UID_LIMIT "˛ťşĎˇ¨ľÄuidĎŢÖĆ" #define MSG_ILLEGAL_OPTION "δ֪ľÄrun-timeŃĄĎî" #define MSG_LDAP_MISSING_BASE "LDAPĹäÖĂÎÄźţÖĐČąÉŮLDAPBaseDN" #define MSG_LDAP_WRONG_PARMS "´íÎóľÄLDAP˛ÎĘý" #define MSG_NEW_CONNECTION "×Ô %s ľÄĐÂÁŹ˝Ó" #define MSG_WELCOME_TO "ťśÓ­Ŕ´ľ˝" #define MSG_MAX_USERS "%lu ĘšÓĂŐß(×î´óÖľ)ŇŃž­ľÇÂźŁŹą§Ç¸" #define MSG_NB_USERS "ÄúĘÇľÚ %u ¸öĘšÓĂŐߣŹ×îśŕżÉ´ď %u ¸öÁŹ˝Ó" #define MSG_WELCOME_TIME "ĎÖÔÚąžľŘĘąźäĘÇ %02d:%02dĄŁˇţÎńĆ÷śËżÚŁş %uĄŁ" #define MSG_ANONYMOUS_FTP_ONLY "ŐâŔďÖťÓĂÄäĂűFTP" #define MSG_RATIOS_EVERYONE "ŐëśÔEVERYONEĆôÓĂąČÂĘ:" #define MSG_RATIOS_ANONYMOUS "ÄäĂűĘšÓĂŐߚ木ÓĂUL/DLÂĘ:" #define MSG_RATIOS_RULE "ŇŞĎÂÔŘ %u Mb, ĎČŇĺÎńÉĎ´Ť %u Mb ľÄşĂśŤÎ÷ĄŁ" #define MSG_INFO_IDLE_M "ÔÚ %lu ˇÖÖÓÄÚĂťÓĐťîśŻŁŹÄúąťťáśĎĎߥŁ" #define MSG_INFO_IDLE_S "ÔÚ %lu ĂëÄÚĂťÓĐťîśŻŁŹÄúąťťáśĎĎߥŁ" #define MSG_CANT_READ_FILE "ą§Ç¸ŁŹÎŇĂÇÎޡ¨śÁČĄ[%s]" #define MSG_LS_TRUNCATED "Ęäłö˝ŘśĚľ˝ %u ˇűşĎ" #define MSG_LS_SUCCESS "×Üš˛ %u ˇűşĎ" #define MSG_LOGOUT "ľÇłö." #define MSG_AUTH_FAILED_LOG "ĘšÓĂŐß[%s]Ńé֤ʧ°Ü" #define MSG_ILLEGAL_UMASK "ÎŢЧľÄumask" #define MSG_STANDALONE_FAILED "Îޡ¨ĆôśŻstandalone server" #define MSG_NO_ANONYMOUS_LOGIN "ŐâĘÇË˝ČËϾͳ - ˛ťżŞˇĹÄäĂűľÇÂź" #define MSG_ANONYMOUS_ANY_PASSWORD "ČÎşÎĂÜÂëśźżÉÓĂ" #define MSG_MAX_USERS_IP "ĚŤśŕÁŹ˝Ó (%lu) Ŕ´×ÔŐâ¸ö IP" #define MSG_ACTIVE_DISABLED "Ö÷śŻÄŁĘ˝šŘąŐ" #define MSG_TRANSFER_SUCCESSFUL "ÎÄźţ´ŤËÍOK" #define MSG_NO_DISK_SPACE "Ó˛ĹĚąŹÂú - ÇëÉÔşóÔŮÉĎ´Ť" #define MSG_OUT_OF_MEMORY "Äڴ沝×ă" #define MSG_ILLEGAL_TRUSTED_IP "˛ťşĎˇ¨ľÄĐĹČÎIPľŘÖˇ" #define MSG_NO_ASCII_RESUME "ASCIIÖŘ´Ť˛˘˛ť°˛ČŤŁŹÇëĎČÉžłýÎÄźţ" #define MSG_UNKNOWN_ALTLOG "δ֪ľÄźÇÂź¸ńĘ˝" #define MSG_ACCOUNT_DISABLED "Îޡ¨ľÇŸΪ[%s]: ŐʺŚعŐ" #define MSG_SQL_WRONG_PARMS "´íÎóľÄSQL˛ÎĘý" #define MSG_ILLEGAL_CONFIG_FILE_SQL "ÎŢЧľÄSQLĹäÖĂÎÄźţ" #define MSG_SQL_MISSING_SERVER "SQLĹäÖĂÎÄźţÖĐČąÉ١ţÎńĆ÷É蜨" #define MSG_SQL_DOWN "SQL serverşĂĎńľąľôÁË" #define MSG_ILLEGAL_QUOTA "ÎŢЧľÄśîśČ" #define MSG_QUOTA_FILES "%llu ÎÄźţĘýĘšÓĂ (%d%%) - ĘÚȨżÉÓĂ: %llu ¸öľľ°¸" #define MSG_QUOTA_SIZE "%llu KbytesĘšÓĂ (%d%%) - ĘÚȨżÉÓĂ: %llu Kb" #define MSG_QUOTA_EXCEEDED "łŹšýśîśČ: [%s] ˛ťťáąť´˘´ć" #define MSG_AUTH_UNKNOWN "δ֪ľÄŃéÖ¤ˇ˝ˇ¨" #define MSG_PDB_BROKEN "Îޡ¨śÁČĄindexed puredbÎÄźţ(ťňźě˛âľ˝žÉ¸ńĘ˝) - ĘÔĘÔ pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s ĘÇąđĂűŁŹ¸ř %s ľÄ" #define MSG_ALIASES_UNKNOWN "δ֪ľÄąđĂű %sĄŁ" #define MSG_ALIASES_BROKEN_FILE "Ë𝾾ĹđĂűÎÄźţ" #define MSG_ALIASES_LIST "ŇÔĎ¾ĹđĂűżÉÓĂŁş" #define MSG_PERUSER_MAX "Îޡ¨˝ÓĘÜŔ´×Ô͏ҝʚÓĂŐßłŹšý %lu ľÄÁŹ˝ÓĘý" #define MSG_IPV6_OK "ŐⲿÖ÷ťúҲťśÓ­IPv6ľÄÁŹ˝Ó" #define MSG_TLS_INFO "TLS: ĆôÓĂ %s with %s, %d ÎťÔŞźÓĂÜ" #define MSG_TLS_WEAK "TLS: ĂÜÂ벝×ă" #define MSG_TLS_NEEDED "ą§Ç¸ŁŹ´ËˇţÎńĆ÷˛ť˝ÓĘÜĂ÷ÎÄĘ˝ÁŹ˝ÓĄŁ\n" \ "ÇëĘšÓĂTLSľÄ°˛ČŤťúÖĆÖŘĐÂÁŹ˝ÓĄŁ" #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/log_ldap_p.h0000644000175000017500000000314713442711340016452 0ustar rackeracke /* LDAP posixAccount handler for Pure-FTPd */ /* (C)opyleft 2001-2019 by Frank DENIS */ #ifndef __LOG_LDAP_P_H__ #define __LOG_LDAP_P_H__ 1 #define LDAP_DEPRECATED 1 #include #include static char *ldap_uri; static char *ldap_scheme; static char *ldap_host; static char *port_s; static int port; static char *binddn; static char *pwd; static char *base; static char *ldap_filter; static char *ldap_homedirectory; static char *ldap_version_s; static int ldap_version; static char *default_uid_s; static char *force_default_uid_s; static int force_default_uid = 0; static uid_t default_uid = 0; static char *default_gid_s; static char *force_default_gid_s; static int force_default_gid = 0; static gid_t default_gid = 0; static char *use_tls_s; static int use_tls; static char *ldap_auth_method_s; static int use_ldap_bind_method; static char *ldap_default_home_directory; static ConfigKeywords ldap_config_keywords[] = { { "LDAPScheme", &ldap_scheme }, { "LDAPServer", &ldap_host }, { "LDAPPort", &port_s }, { "LDAPBindDN", &binddn }, { "LDAPBindPW", &pwd }, { "LDAPBaseDN", &base }, { "LDAPFilter", &ldap_filter}, { "LDAPHomeDir", &ldap_homedirectory }, { "LDAPVersion", &ldap_version_s }, { "LDAPDefaultUID", &default_uid_s }, { "LDAPForceDefaultUID", &force_default_uid_s }, { "LDAPDefaultGID", &default_gid_s }, { "LDAPForceDefaultGID", &force_default_gid_s }, { "LDAPUseTLS", &use_tls_s }, { "LDAPAuthMethod", &ldap_auth_method_s }, { "LDAPDefaultHomeDirectory", &ldap_default_home_directory }, { NULL, NULL } }; #endif pure-ftpd-1.0.49.orig/src/alt_arc4random.h0000644000175000017500000000123613446174132017247 0ustar rackeracke #ifndef __ALT_ARC4RANDOM_H__ #define __ALT_ARC4RANDOM_H__ 1 #include #include #if defined(__OpenBSD__) || defined(__CloudABI__) || defined(__wasi__) #define alt_arc4random() arc4random() #ifdef HAVE_ARC4RANDOM_STIR # define alt_arc4random_stir() arc4random_stir() #else # define alt_arc4random_stir() (void) 0 #endif #define alt_arc4random_uniform(A) arc4random_uniform(A) #define alt_arc4random_buf(A, B) arc4random_buf(A, B) #else void alt_arc4random_stir(void); void alt_arc4random_buf(void *, size_t); uint32_t alt_arc4random(void); uint32_t alt_arc4random_uniform(uint32_t); #endif int alt_arc4random_close(void); #endif pure-ftpd-1.0.49.orig/src/tls_extcert.c0000644000175000017500000001000313450665410016677 0ustar rackeracke#include #ifdef WITH_TLS #include "ftpd.h" #include "ftpwho-update.h" #include "globals.h" #include "tls_extcert.h" #include "tls_extcert_p.h" #include "safe_rw.h" #ifdef WITH_DMALLOC # include #endif static struct sockaddr_un *saddr; static signed char cert_finalized; void tls_extcert_parse(const char * const file) { size_t file_len; if (file == NULL || (file_len = strlen(file)) <= (size_t) 0U) { return; } if ((saddr = malloc(sizeof(*saddr) + file_len + (size_t) 1U)) == NULL) { die_mem(); } memcpy(saddr->sun_path, file, file_len + (size_t) 1U); saddr->sun_family = AF_UNIX; } void tls_extcert_exit(void) { free(saddr); saddr = NULL; } static void callback_reply_action(const char *str, CertResult * const result) { if (strcasecmp(str, "deny") == 0) { result->action = CERT_ACTION_DENY; } else if (strcasecmp(str, "default") == 0) { result->action = CERT_ACTION_DEFAULT; } else if (strcasecmp(str, "fallback") == 0) { result->action = CERT_ACTION_FALLBACK; } else if (strcasecmp(str, "strict") == 0) { result->action = CERT_ACTION_STRICT; } else { die(421, LOG_ERR, "Cert action"); } } static void callback_reply_cert_file(const char *str, CertResult * const result) { if (*str != '/') { return; } if (access(str, R_OK) != 0) { return; } free((void *) (result->cert_file)); result->cert_file = strdup(str); } static void callback_reply_key_file(const char *str, CertResult * const result) { if (*str != '/') { return; } if (access(str, R_OK) != 0) { return; } free((void *) (result->key_file)); result->key_file = strdup(str); } static void callback_reply_end(const char *str, CertResult * const result) { (void) str; (void) result; cert_finalized |= 1; } void tls_extcert_get(CertResult * const result, const char *sni_name) { int kindy = -1; int err; int tries = EXTCERT_MAX_CONNECT_TRIES; ssize_t readnb; char *linepnt; char *crpoint; char line[4096]; size_t line_len; result->cert_ok = 0; tryagain: if ((kindy = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { goto bye; } while ((err = connect(kindy, (struct sockaddr *) saddr, SUN_LEN(saddr))) != 0 && errno == EINTR); if (err != 0) { close(kindy); kindy = -1; if (tries > 0) { sleep(EXTCERT_MAX_CONNECT_DELAY); tries--; goto tryagain; } goto bye; } if (SNCHECK(snprintf(line, sizeof line, EXTCERT_CLIENT_SNI_NAME "%s\n" EXTCERT_CLIENT_END "\n", sni_name), sizeof line)) { goto bye; } line_len = strlen(line); if (safe_write(kindy, line, line_len, -1) != (ssize_t) line_len) { goto bye; } result->cert_file = NULL; result->key_file = NULL; result->action = CERT_ACTION_DENY; cert_finalized = 0; if ((readnb = safe_read(kindy, line, sizeof line - 1U)) <= (ssize_t) 0) { goto bye; } line[readnb] = 0; linepnt = line; while ((crpoint = strchr(linepnt, '\n')) != NULL) { const ExtcertCallBack *scanned; size_t keyword_len; *crpoint = 0; scanned = extcert_callbacks; while (scanned->keyword != NULL) { keyword_len = strlen(scanned->keyword); if (strncmp(scanned->keyword, linepnt, keyword_len) == 0) { scanned->func(linepnt + keyword_len, result); break; } scanned++; } linepnt = crpoint + 1; } if (cert_finalized == 0 || (result->cert_file == NULL && result->action != CERT_ACTION_DENY && result->action != CERT_ACTION_DEFAULT)) { result->cert_ok = -1; } else { result->cert_ok = 1; } bye: if (kindy != -1) { close(kindy); } } #endif pure-ftpd-1.0.49.orig/src/main.c0000644000175000017500000000017113450665410015270 0ustar rackeracke#include #include "ftpd.h" int main(int argc, char *argv[]) { return pureftpd_start(argc, argv, NULL); } pure-ftpd-1.0.49.orig/src/log_puredb.h0000644000175000017500000000057213350542502016473 0ustar rackeracke#ifndef __LOG_PUREDB_H__ #define __LOG_PUREDB_H__ 1 void pw_puredb_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer); void pw_puredb_parse(const char * const file); void pw_puredb_exit(void); #endif pure-ftpd-1.0.49.orig/src/messages_sk.h0000644000175000017500000003433213446174132016664 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Cas vyprsal" #define MSG_CAPABILITIES "Nemozem zmenit privilegia" #define MSG_CLIENT_CLOSED_CNX "Klient zavrel spojenie" #define MSG_CLIENT_READ_ERR "Chyba pri citani od klienta" #define MSG_CANT_OPEN_CNX "Nemozem vytvorit spojenie" #define MSG_CANT_CREATE_DATA_SOCKET "Nemozem vytvorit datovy socket" #define MSG_DEBUG_CLIENT_IS "Klientova adresa je" #define MSG_SYNTAX_ERROR_IP "Syntakticka chyba v IP adrese" #define MSG_PORT_SUCCESSFUL "Prikaz PORT uspesne vykonany" #define MSG_ONLY_IPV4V6 "Iba IPv4 a IPv6 su podporovane (1,2)" #define MSG_ONLY_IPV4 "Iba IPv4 je podporovany (1)" #define MSG_TIMEOUT_PARSER "Cas vyprsal, nabuduce skuste pisat trosku rychlejsie" #define MSG_LINE_TOO_LONG "Riadok je privelmi dlhy" #define MSG_LOG_OVERFLOW "Klient sa pokusil preplnit buffer na prikazovy riadok" #define MSG_GOODBYE "Dovidenia. Uploadli ste %llu a downloadli %llu kilobajtov." #define MSG_DEBUG_COMMAND "Prikaz" #define MSG_IS_YOUR_CURRENT_LOCATION "je vasa terajsia location" #define MSG_NOT_LOGGED_IN "Nieste prihlaseny" #define MSG_AUTH_UNIMPLEMENTED "Bezpecnostne rozsirenia niesu implementovane" #define MSG_NO_FILE_NAME "Ziadne meno suboru" #define MSG_NO_DIRECTORY_NAME "Ziadne meno adresara" #define MSG_NO_RESTART_POINT "Ziaden zaciatok restartu" #define MSG_ABOR_SUCCESS "Prikaz ABOR bol uspesny" #define MSG_MISSING_ARG "Chybajuci argument" #define MSG_GARBAGE_FOUND "Smetie najdene po hodnote" #define MSG_VALUE_TOO_LARGE "Hodnota prilis vysoka" #define MSG_IDLE_TIME "Cas necinnosti nastaveny na %lu sekund" #define MSG_SITE_HELP "Nasledovne prikazy SITE su rozoznane" #define MSG_BAD_CHMOD "Chybne pristupove prava" #define MSG_UNKNOWN_EXTENSION "je nezname rozsirenie" #define MSG_XDBG_OK "Prikaz XDBG bol uspesny, debug uroven je teraz %d" #define MSG_UNKNOWN_COMMAND "Neznamy prikaz" #define MSG_TIMEOUT_NOOP "Cas vyprsal (ziadna operacia za %lu sekund)" #define MSG_TIMEOUT_DATA "Cas vyprsal (ziadne nove data za %lu sekund)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "Uz ste prihlaseny" #define MSG_ANY_PASSWORD "Lubovolne heslo bude fungovat" #define MSG_ANONYMOUS_LOGGED "Prihlasny ako anonymny pouzivatel" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Anonymny pouzivatel sa prihlasil vo virtualnom FTP" #define MSG_USER_OK "Pouzivatel %s je OK. Heslo je potrebne" #define MSG_CANT_DO_TWICE "Nemozme to spravit pocas tohto sedenia" #define MSG_UNABLE_SECURE_ANON "Nemozem nastavit bezpecne anonymne FTP" #define MSG_BANDWIDTH_RESTRICTED "Vasa prenosova rychlost je obmedzena" #define MSG_NO_PASSWORD_NEEDED MSG_ANY_PASSWORD #define MSG_NOTRUST "Lutujem, ale nemozem vam doverovat" #define MSG_WHOAREYOU "Prosim povedzte mi, kto ste" #define MSG_AUTH_FAILED "Lutujem, ale autentifikacia zlyhala" #define MSG_AUTH_TOOMANY "Privela zlyhani autentifikacie" #define MSG_NO_HOMEDIR "Domovsky adresar nieje pristupny - rusim" #define MSG_NO_HOMEDIR2 "%s neexistuje alebo je nedosiahnutelny" #define MSG_START_SLASH "Zacinam v /" #define MSG_USER_GROUP_ACCESS "Pouzivatel %s ma skupinovy pristup do" #define MSG_FXP_SUPPORT "Tento server podporuje FXP prenosy" #define MSG_RATIO "Musite dodriavat %u:%u (UL/DL) pomer" #define MSG_CHROOT_FAILED "Nemozem vytvorit bezpecny chroot()" #define MSG_CURRENT_DIR_IS "OK. Aktualny adresar je %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Aktualny obmedzeny adresar je %s" #define MSG_IS_NOW_LOGGED_IN "%s je prave prihlaseny" #define MSG_CANT_CHANGE_DIR "Nemozem prejst do adresara %s" #define MSG_PATH_TOO_LONG "Cesta je prilis dlha" #define MSG_CANT_PASV "Nemozte pouzivat PASV na IPv4 presosoch. Pouzite EPSV." #define MSG_CANT_PASSIVE "Nemozem vytvorit pasivne spojenie" #define MSG_PORTS_BUSY "Vsetky rezervovane TCP porty su pouzivane" #define MSG_GETSOCKNAME_DATA "Nemozem identifikovat lokalny datovy socket" #define MSG_GETPEERNAME "Nemozzem identifikovat lokalny socket" #define MSG_INVALID_IP "Lutujem, zadali ste chybnu adresu" #define MSG_NO_EPSV "Prosi pouzivajte klient kompatiblny s IPv6 s podporou EPSV" #define MSG_BAD_PORT "Lutujem, ale nepripojim sa na port nizsi ako 1024" #define MSG_NO_FXP "Neotvorim spojenie na %s (len po %s)" #define MSG_FXP "FXP prenos : z %s na %s" #define MSG_NO_DATA_CONN "Ziadne datove spojenie" #define MSG_ACCEPT_FAILED "Spojenie nemohlo byt akceptovane" #define MSG_ACCEPT_SUCCESS "Datove spojenie prijate" #define MSG_CNX_PORT_FAILED "Nemozem vytvorit datove spojenie na port %d" #define MSG_CNX_PORT "Pripajam sa na port %d" #define MSG_ANON_CANT_MKD "Lutujem, ale anonymni pouzivatelia nemozu vytvarat adresare" #define MSG_ANON_CANT_RMD "Lutujem, ale anonymni pouzivatelia nemozu mazat adresare" #define MSG_ANON_CANT_RENAME "Anonymni pouzivatelia nemozu presuvat/premenuvavat subory" #define MSG_ANON_CANT_CHANGE_PERMS "Anonymni pouzivatelia nemozu menit pristupove prava" #define MSG_GLOB_NO_MEMORY "Pocas globbingu %s dosla pamat" #define MSG_PROBABLY_DENIED "(Toto pravdepodobne znamena \"Odmietnuty pristup\")" #define MSG_GLOB_READ_ERROR "Chyba citania pri globbovani %s" #define MSG_GLOB_NO_MATCH "Zaidna zhoda medzi %s v %s" #define MSG_CHMOD_FAILED "Nemozem zmenit pristupove prava na %s" #define MSG_CHMOD_SUCCESS "Pristupove prava zmene na %s" #define MSG_CHMOD_TOTAL_FAILURE "Lutujem, ale nemohol som zmenit ziadne pristupove prava" #define MSG_ANON_CANT_DELETE "Anonymni pouzivatelia nemozu mazat subory" #define MSG_ANON_CANT_OVERWRITE "Anonymni pouzivatelia nemozu prepisovat existujuce subory" #define MSG_DELE_FAILED "Nemozem zmazat %s" #define MSG_DELE_SUCCESS "Subor %s%s%s%s zmazany" #define MSG_DELE_TOTAL_FAILURE "Ziadny subor nebol zmazany" #define MSG_LOAD_TOO_HIGH \ "Zataz systemu bola%3.2f ked ste sa prihlasili. Nedovolujeme dowloady\n" \ "anonymnym pouzivatelom pri tak vysokej zatazi. Uploady su vzdy povolene\n" #define MSG_OPEN_FAILURE "Nemozem otvorit %s" #define MSG_OPEN_FAILURE2 "Nemozem otvorit ten subor" #define MSG_STAT_FAILURE "Nemozem zistit velkost suboru" #define MSG_STAT_FAILURE2 "Nemozem overit existenciu suboru" #define MSG_REST_TOO_LARGE_FOR_FILE "Zaciatok restartu %lld je prilis velky pre subor dlhy len %lld." #define MSG_REST_RESET "Zaciatok restartu nastaveny na 0" #define MSG_NOT_REGULAR_FILE "Mozem poskytovat len normalne subory" #define MSG_NOT_MODERATED \ "Tento subor bol uploadnuty anonymnym pouzivatelo. Este nebol" \ "schvaleny na download admistratormi servera." #define MSG_RATIO_DENIAL \ "Lutujen, ale pomer upload/download je %u:%u .\n" \ "Zatial ste uploadli %llu kilobajtov downloadli %llu kilobajtov.\n" \ "Nieco pekne nam sem uploadnite a potom si nieco skvele mozete stiahnut." #define MSG_NO_MORE_TO_DOWNLOAD "Na download tu uz nic nieje" #define MSG_WINNER "Pocitac je tvoj priatel. Doveruj pocitacu" #define MSG_KBYTES_LEFT "%.1f kilobajtov na download" #define MSG_ABORTED "Prenos preruseny" #define MSG_DATA_WRITE_FAILED "Chyba pocas zapisu do datoveho spojenia" #define MSG_DATA_READ_FAILED "Chyba pocas citania z datove spojenia" #define MSG_MMAP_FAILED "Nemozem namapovat subor do pamate" #define MSG_WRITE_FAILED "Chyba pocas zapisu do suboru" #define MSG_TRANSFER_RATE_M "%.3f sekund (merane tu), %.2f megabajtov za sekundu" #define MSG_TRANSFER_RATE_K "%.3f sekund (merane tu), %.2f kilobajtov za sekundu" #define MSG_TRANSFER_RATE_B "%.3f sekund (merane tu), %.2f bajtov za sekundu" #define MSG_SPACE_FREE_M "%.1f megabajtov volneho diskoveho priestoru" #define MSG_SPACE_FREE_K "%f kilobjatov volneho diskoveho priestoru" #define MSG_DOWNLOADED "downloadnuty" #define MSG_REST_NOT_NUMERIC "REST vyzaduje ciselny parameter" #define MSG_REST_ASCII_STRICT "Oznacenie odpovede musi byt 0 v ASCII mode" #define MSG_REST_ASCII_WORKAROUND "Pokracujem od %lld. Ale sme ASCII mode" #define MSG_REST_SUCCESS "Pokracujem od %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Zakazany nazov adresaru" #define MSG_SANITY_FILE_FAILURE "Zakazany nazov suboru: %s" #define MSG_MKD_FAILURE "Nemozem vytvorit adresar" #define MSG_MKD_SUCCESS "Adresar bol uspesne vytvoreny" #define MSG_RMD_FAILURE "Nemozem zmazat adresar" #define MSG_RMD_SUCCESS "Adresar bol uspesne vytvoreny" #define MSG_TIMESTAMP_FAILURE "Nemozem ziskat casovu znacku" #define MSG_MODE_ERROR "Len ASCII a binarny mod su podporovane" #define MSG_CREATE_FAILURE "Nemozem vytvorit subor" #define MSG_ABRT_ONLY "Prikaz ABRT je mozne pouzit len pocas uploadu." #define MSG_UPLOAD_PARTIAL "ciastocne uploadnuty" #define MSG_REMOVED "odstraneny" #define MSG_UPLOADED "uploadnuty" #define MSG_GMTIME_FAILURE "Nemozem zistit lokalny cas" #define MSG_TYPE_8BIT_FAILURE "Podporujem len 8 bitove bajty, niesme spred desiatich rokov" #define MSG_TYPE_UNKNOWN "Neznamy TYPE" #define MSG_TYPE_SUCCESS "TYPE je teraz" #define MSG_STRU_FAILURE "Iba F(ile) je podporovany" #define MSG_MODE_FAILURE "Prosim pouzite S(tream) mod" #define MSG_RENAME_ABORT "Prerusujem predchadzajuce premenovanie" #define MSG_RENAME_RNFR_SUCCESS "Prikaz RNFR akceptovany, subor existuje, ocakavam ciel" #define MSG_FILE_DOESNT_EXIST "Lutujem, ale zadany subor neexistuje" #define MSG_RENAME_ALREADY_THERE "Prikaz RENAME zlyhal - cielovy subor uz existuje" #define MSG_RENAME_NORNFR "Potrebujem RNFR pred RNTO" #define MSG_RENAME_FAILURE "Chyba premenovania/presunu" #define MSG_RENAME_SUCCESS "Subor uspnesne presunuty/premenovany" #define MSG_NO_SUPERSERVER "Prosim spustajte pure-ftpd zo super-servera (napriklad tcpserver)" #define MSG_NO_FTP_ACCOUNT "Nemozem najst konto 'ftp'" #define MSG_CONF_ERR "Chyba konfiguracie" #define MSG_NO_VIRTUAL_FILE "Chybajuci subor virtualnych pouzivatelov" #define MSG_ILLEGAL_THROTTLING "Chybna hodnota obmedzovania rychlosti prenosu" #define MSG_ILLEGAL_TRUSTED_GID "Chybna doverovana gid pre chroot" #define MSG_ILLEGAL_USER_LIMIT "Chybny limit pouzivatelov" #define MSG_ILLEGAL_FACILITY "Nezname meno sluzby" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Chybny konfiguracny subor LDAPu" #define MSG_ILLEGAL_LOAD_LIMIT "Chyny limit na systemu zataz" #define MSG_ILLEGAL_PORTS_RANGE "Chybny rozsah portov" #define MSG_ILLEGAL_LS_LIMITS "Chybny limit na 'ls'" #define MSG_ILLEGAL_FORCE_PASSIVE "Chybna vnutena IP pre pasivne prenosy" #define MSG_ILLEGAL_RATIO "Chybny pomer upload/download " #define MSG_ILLEGAL_UID_LIMIT "Chybny limit na uid" #define MSG_ILLEGAL_OPTION "Neznama run-time volba" #define MSG_LDAP_MISSING_BASE "Chybajuci LDAPBaseDN v konfiguracnom subore LDAPu" #define MSG_LDAP_WRONG_PARMS "Chybne LDAP parametre" #define MSG_NEW_CONNECTION "Nove spojenie z %s" #define MSG_WELCOME_TO "Vitajte na" #define MSG_MAX_USERS "Lutujem, ale %lu (maximum) pouzivatelov je uz prihlasenych" #define MSG_NB_USERS "Ste pouzivatel cislo %u z %u povolenych" #define MSG_WELCOME_TIME "Lokalny cas je teraz %02d:%02d. Serverovy port: %u." #define MSG_ANONYMOUS_FTP_ONLY "Tu je povoleny len anonymny pristup" #define MSG_RATIOS_EVERYONE "VSETCI POUZIVATELIA MUSIA DODRZAT POMER UL/DL :" #define MSG_RATIOS_ANONYMOUS "ANONYMNI POUZIVATELIA MUSIA DODRZAT POMER UL/DL :" #define MSG_RATIOS_RULE "na download %u megabajtov musite uploadnut %u Mb." #define MSG_INFO_IDLE_M "Budete odpojeny po %lu minutach neaktivity." #define MSG_INFO_IDLE_S "Budete odpojeny po %lu sekundach neaktivity." #define MSG_CANT_READ_FILE "Lutujem, nebol som schopny precitat [%s]" #define MSG_LS_TRUNCATED "Vystup skrateny na %u zhod" #define MSG_LS_SUCCESS "Spolu %u zhod" #define MSG_LOGOUT "Logout." #define MSG_AUTH_FAILED_LOG "Autentifikacia uzivatela zlyhala [%s]" #define MSG_ILLEGAL_UMASK "Neplatna maska" #define MSG_STANDALONE_FAILED "Nemozem spustit samostatny server" #define MSG_NO_ANONYMOUS_LOGIN "Toto je privatny system - Anonymni uzivatelia su zakazani" #define MSG_ANONYMOUS_ANY_PASSWORD "Mozte zadat lubovolne heslo" #define MSG_MAX_USERS_IP "Privela aktivnych spojeni (%lu) z vasej IP" #define MSG_ACTIVE_DISABLED "Aktivny mod je vypnuty" #define MSG_TRANSFER_SUCCESSFUL "Subor bol uspesne preneseny" #define MSG_NO_DISK_SPACE "Disk je plny, skuste neskor" #define MSG_OUT_OF_MEMORY "Nedostatok pamate" #define MSG_ILLEGAL_TRUSTED_IP "Neplatna doverovana IP adresa" #define MSG_NO_ASCII_RESUME "Pokracovanie prenosu v ASCII mode nieje bezpecne, subor najskor zmate, prosim" #define MSG_UNKNOWN_ALTLOG "Neznamy logovaci format" #define MSG_ACCOUNT_DISABLED "Nemozte sa prihlasit ako [%s] : konto je deaktivovane" #define MSG_SQL_WRONG_PARMS "Chybne SQL parametre" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Chybny konfiguracny subor SQL" #define MSG_SQL_MISSING_SERVER "V konfiguracnom subore chyba SQL server" #define MSG_SQL_DOWN "SQL server vyzera byt spadnuty" #define MSG_ILLEGAL_QUOTA "Chybna kvota" #define MSG_QUOTA_FILES "%llu suborov pouzitych (%d%%) - autorizovanych: %llu suborov" #define MSG_QUOTA_SIZE "%llu kilobajtov pouzitych (%d%%) - autorizovanych: %llu kilobajtov" #define MSG_QUOTA_EXCEEDED "Kvota prekrocena : [%s] nebude ulozeny" #define MSG_AUTH_UNKNOWN "Neznama autentifikacna metoda" #define MSG_PDB_BROKEN "Nebolo mozne precitat indexovany subor puredb (alebo bola detekovana stara verzia) - Vyskusajte spustit pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s je aliasom pre %s." #define MSG_ALIASES_UNKNOWN "Neznamy alias %s." #define MSG_ALIASES_BROKEN_FILE "Poskodeny subor aliasov" #define MSG_ALIASES_LIST "Nasledovne aliasy su dostupne :" #define MSG_PERUSER_MAX "Nemozem akceptovat viac ako %lu pripojeni od toho isteho pouzivatela" #define MSG_IPV6_OK "Pripojenia pomocou IPv6 su tiez vitane na tomto serveri" #define MSG_TLS_INFO "TLS: Zapnute %s pouziva sifru %s, %d tajnych bitov" #define MSG_TLS_WEAK "TLS: Sifra je prilis slaba" #define MSG_TLS_NEEDED "Prepacte, ale nesifrovane spojenia nie su povolene na tomto serveri.\n" \ "Pri najblizsom spojeni pouzite zabezpecovacie mechanizmy TLS." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/bsd-glob.c0000644000175000017500000006712513450665407016057 0ustar rackeracke /* * Copyright (c) 1989, 1993 * The Regents of the University of California. All rights reserved. * * This code is derived from software contributed to Berkeley by * Guido van Rossum. * * 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. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``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 REGENTS 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. */ /* * glob(3) -- a superset of the one defined in POSIX 1003.2. * * The [!...] convention to negate a range is supported (SysV, Posix, ksh). * * Optional extra services, controlled by flags not defined by POSIX: * * GLOB_QUOTE: * Escaping convention: \ inhibits any special meaning the following * character might have (except \ at end of string is retained). * GLOB_MAGCHAR: * Set in gl_flags if pattern contained a globbing character. * GLOB_NOMAGIC: * Same as GLOB_NOCHECK, but it will only append pattern if it did * not contain any magic characters. [Used in csh style globbing] * GLOB_ALTDIRFUNC: * Use alternately specified directory access functions. * GLOB_BRACE: * expand {1,2}{a,b} to 1a 1b 2a 2b * gl_matchc: * Number of matches in the current invocation of glob. */ #include #ifndef DISABLE_GLOBBING #include "ftpd.h" #ifdef HAVE_DIRENT_H # include #endif #ifdef HAVE_SYS_NDIR_H # include #endif #ifdef HAVE_NDIR_H # include #endif #include "bsd-glob.h" #ifdef WITH_DMALLOC # include #endif #define DOLLAR '$' #define DOT '.' #define EOS '\0' #define LBRACKET '[' #define NOT '!' #define QUESTION '?' #define QUOTE '\\' #define RANGE '-' #define RBRACKET ']' #define SEP '/' #define STAR '*' #define UNDERSCORE '_' #define LBRACE '{' #define RBRACE '}' #define SLASH '/' #define COMMA ',' #define M_QUOTE 0x8000 #define M_PROTECT 0x4000 #define M_MASK 0xffff #define M_ASCII 0x00ff typedef unsigned short Char; #define CHAR(c) ((Char)((c)&M_ASCII)) #define META(c) ((Char)((c)|M_QUOTE)) #define M_ALL META('*') #define M_END META(']') #define M_NOT META('!') #define M_ONE META('?') #define M_RNG META('-') #define M_SET META('[') #define ismeta(c) (((c)&M_QUOTE) != 0) #ifndef GLOB_LIMIT_MALLOC # define GLOB_LIMIT_MALLOC 65536 #endif #ifndef GLOB_MAX_STARS # define GLOB_MAX_STARS 3 #endif struct glob_lim { size_t glim_malloc; size_t glim_stat; size_t glim_readdir; }; struct glob_path_stat { char *gps_path; struct stat *gps_stat; }; static int compare(const void *, const void *); static int compare_gps(const void *, const void *); static int g_Ctoc(const Char *, char *, unsigned int); static int g_lstat(Char *, struct stat *, glob_t *); static DIR *g_opendir(Char *, glob_t *); static Char *g_strchr(const Char *, int); static int g_stat(Char *, struct stat *, glob_t *); static int glob0(const Char *, glob_t *, struct glob_lim *); static int glob1(Char *, Char *, glob_t *, struct glob_lim *, int); static int glob2(Char *, Char *, Char *, Char *, Char *, Char *, glob_t *, struct glob_lim *, int); static int glob3(Char *, Char *, Char *, Char *, Char *, Char *, Char *, glob_t *, struct glob_lim *, int); static int globextend(const Char *, glob_t *, struct glob_lim *, struct stat *); static int globexp1(const Char *, glob_t *, struct glob_lim *, int); static int globexp2(const Char *, const Char *, glob_t *, struct glob_lim *, int); static int match(Char *, Char *, Char *, int); static int check_stars(const char *pattern) { size_t stars = 0U; int c; while ((c = *pattern++) != 0) { if (c == '*' && ++stars > GLOB_MAX_STARS) { return -1; } } return 0; } static int glob_(const char *pattern, int flags, int (*errfunc)(const char *, int), glob_t *pglob, unsigned long maxfiles, int maxdepth) { const unsigned char *patnext; int c; Char *bufnext, *bufend, patbuf[PATH_MAX]; struct glob_lim limit = { 0, 0, 0 }; if ((flags & GLOB_LIMIT) == GLOB_LIMIT && check_stars(pattern) == -1) { return GLOB_NOSPACE; } pglob->gl_maxdepth = maxdepth; pglob->gl_maxfiles = maxfiles; patnext = (unsigned char *) pattern; if (!(flags & GLOB_APPEND)) { pglob->gl_pathc = 0; pglob->gl_pathv = NULL; pglob->gl_statv = NULL; if (!(flags & GLOB_DOOFFS)) { pglob->gl_offs = 0; } } pglob->gl_flags = flags & ~GLOB_MAGCHAR; pglob->gl_errfunc = errfunc; pglob->gl_matchc = 0; if (pglob->gl_offs < 0 || pglob->gl_pathc < 0 || pglob->gl_offs >= INT_MAX || pglob->gl_pathc >= INT_MAX || pglob->gl_pathc >= INT_MAX - pglob->gl_offs - 1) { return GLOB_NOSPACE; } if (strlen(pattern) >= PATH_MAX) { return GLOB_NOMATCH; } bufnext = patbuf; bufend = bufnext + PATH_MAX - 1; if (flags & GLOB_NOESCAPE) { while (bufnext < bufend && (c = *patnext++) != EOS) { *bufnext++ = c; } } else { /* Protect the quoted characters. */ while (bufnext < bufend && (c = *patnext++) != EOS) { if (c == QUOTE) { if ((c = *patnext++) == EOS) { c = QUOTE; --patnext; } *bufnext++ = c | M_PROTECT; } else { *bufnext++ = c; } } } *bufnext = EOS; if (flags & GLOB_BRACE) { return globexp1(patbuf, pglob, &limit, 0); } else { return glob0(patbuf, pglob, &limit); } } int glob(const char *pattern, int flags, int (*errfunc) (const char *, int), glob_t * pglob) { return glob_(pattern, flags, errfunc, pglob, (unsigned long) -1, 0); } int sglob(char *pattern, int flags, int (*errfunc) (const char *, int), glob_t * pglob, unsigned long maxfiles, int maxdepth) { simplify(pattern); return glob_(pattern, flags, errfunc, pglob, maxfiles, maxdepth); } /* * Expand recursively a glob {} pattern. When there is no more expansion * invoke the standard globbing routine to glob the rest of the magic * characters */ static int globexp1(const Char *pattern, glob_t *pglob, struct glob_lim *limitp, int recursion) { const Char* ptr = pattern; if (pglob->gl_maxdepth > 0 && recursion > pglob->gl_maxdepth) { errno = 0; return 0; } /* Protect a single {}, for find(1), like csh */ if (pattern[0] == LBRACE && pattern[1] == RBRACE && pattern[2] == EOS) { return glob0(pattern, pglob, limitp); } if ((ptr = (const Char *) g_strchr(ptr, LBRACE)) != NULL) { return globexp2(ptr, pattern, pglob, limitp, recursion + 1); } return glob0(pattern, pglob, limitp); } /* * Recursive brace globbing helper. Tries to expand a single brace. * If it succeeds then it invokes globexp1 with the new pattern. * If it fails then it tries to glob the rest of the pattern and returns. */ static int globexp2(const Char *ptr, const Char *pattern, glob_t *pglob, struct glob_lim *limitp, int recursion) { int i, rv; Char *lm, *ls; const Char *pe, *pm, *pl; Char patbuf[PATH_MAX]; /* copy part up to the brace */ for (lm = patbuf, pm = pattern; pm != ptr; *lm++ = *pm++) ; *lm = EOS; ls = lm; /* Find the balanced brace */ for (i = 0, pe = ++ptr; *pe; pe++) { if (*pe == LBRACKET) { /* Ignore everything between [] */ for (pm = pe++; *pe != RBRACKET && *pe != EOS; pe++) ; if (*pe == EOS) { /* * We could not find a matching RBRACKET. * Ignore and just look for RBRACE */ pe = pm; } } else if (*pe == LBRACE) { i++; } else if (*pe == RBRACE) { if (i == 0) { break; } i--; } } /* Non matching braces; just glob the pattern */ if (i != 0 || *pe == EOS) { return glob0(patbuf, pglob, limitp); } for (i = 0, pl = pm = ptr; pm <= pe; pm++) { switch (*pm) { case LBRACKET: /* Ignore everything between [] */ for (pl = pm++; *pm != RBRACKET && *pm != EOS; pm++) ; if (*pm == EOS) { /* * We could not find a matching RBRACKET. * Ignore and just look for RBRACE */ pm = pl; } break; case LBRACE: i++; break; case RBRACE: if (i) { i--; break; } /* FALLTHROUGH */ case COMMA: if (i && *pm == COMMA) { break; } else { /* Append the current string */ for (lm = ls; (pl < pm); *lm++ = *pl++) ; /* * Append the rest of the pattern after the * closing brace */ for (pl = pe + 1; (*lm++ = *pl++) != EOS; ) ; /* Expand the current pattern */ rv = globexp1(patbuf, pglob, limitp, recursion + 1); if (rv && rv != GLOB_NOMATCH) { return rv; } /* move after the comma, to the next string */ pl = pm + 1; } break; default: break; } } return 0; } /* * The main glob() routine: compiles the pattern (optionally processing * quotes), calls glob1() to do the real pattern matching, and finally * sorts the list (unless unsorted operation is requested). Returns 0 * if things went well, nonzero if errors occurred. It is not an error * to find no matches. */ static int glob0(const Char *pattern, glob_t *pglob, struct glob_lim *limitp) { const Char *qpatnext; int c, err, oldpathc; Char *bufnext, patbuf[PATH_MAX]; qpatnext = pattern; oldpathc = pglob->gl_pathc; bufnext = patbuf; /* We don't need to check for buffer overflow any more. */ while ((c = *qpatnext++) != EOS) { switch (c) { case LBRACKET: c = *qpatnext; if (c == NOT) { ++qpatnext; } if (*qpatnext == EOS || g_strchr(qpatnext + 1, RBRACKET) == NULL) { *bufnext++ = LBRACKET; if (c == NOT) { --qpatnext; } break; } *bufnext++ = M_SET; if (c == NOT) { *bufnext++ = M_NOT; } c = *qpatnext++; do { *bufnext++ = CHAR(c); if (*qpatnext == RANGE && (c = qpatnext[1]) != RBRACKET) { *bufnext++ = M_RNG; *bufnext++ = CHAR(c); qpatnext += 2; } } while ((c = *qpatnext++) != RBRACKET); pglob->gl_flags |= GLOB_MAGCHAR; *bufnext++ = M_END; break; case QUESTION: pglob->gl_flags |= GLOB_MAGCHAR; *bufnext++ = M_ONE; break; case STAR: pglob->gl_flags |= GLOB_MAGCHAR; /* collapse adjacent stars to one, * to avoid exponential behavior */ if (bufnext == patbuf || bufnext[-1] != M_ALL) { *bufnext++ = M_ALL; } break; default: *bufnext++ = CHAR(c); break; } } *bufnext = EOS; if ((err = glob1(patbuf, patbuf+PATH_MAX - 1, pglob, limitp, 1)) != 0) { return err; } /* * If there was no match we are going to append the pattern * if GLOB_NOCHECK was specified or if GLOB_NOMAGIC was specified * and the pattern did not contain any magic characters * GLOB_NOMAGIC is there just for compatibility with csh. */ if (pglob->gl_pathc == oldpathc) { if ((pglob->gl_flags & GLOB_NOCHECK) || ((pglob->gl_flags & GLOB_NOMAGIC) && !(pglob->gl_flags & GLOB_MAGCHAR))) { return globextend(pattern, pglob, limitp, NULL); } else { return GLOB_NOMATCH; } } if (!(pglob->gl_flags & GLOB_NOSORT)) { if ((pglob->gl_flags & GLOB_KEEPSTAT)) { /* Keep the paths and stat info synced during sort */ struct glob_path_stat *path_stat; int i; int n = pglob->gl_pathc - oldpathc; int o = pglob->gl_offs + oldpathc; if ((path_stat = calloc(n, sizeof(*path_stat))) == NULL) { return GLOB_NOSPACE; } for (i = 0; i < n; i++) { path_stat[i].gps_path = pglob->gl_pathv[o + i]; path_stat[i].gps_stat = pglob->gl_statv[o + i]; } qsort(path_stat, n, sizeof(*path_stat), compare_gps); for (i = 0; i < n; i++) { pglob->gl_pathv[o + i] = path_stat[i].gps_path; pglob->gl_statv[o + i] = path_stat[i].gps_stat; } free(path_stat); } else { qsort(pglob->gl_pathv + pglob->gl_offs + oldpathc, pglob->gl_pathc - oldpathc, sizeof(char *), compare); } } return 0; } static int compare(const void *p, const void *q) { return strcmp(*(char **)p, *(char **)q); } static int compare_gps(const void *_p, const void *_q) { const struct glob_path_stat *p = (const struct glob_path_stat *)_p; const struct glob_path_stat *q = (const struct glob_path_stat *)_q; return strcmp(p->gps_path, q->gps_path); } static int glob1(Char *pattern, Char *pattern_last, glob_t *pglob, struct glob_lim *limitp, int recursion) { Char pathbuf[PATH_MAX]; /* A null pathname is invalid -- POSIX 1003.1 sect. 2.4. */ if (*pattern == EOS) { return 0; } return glob2(pathbuf, pathbuf + PATH_MAX - 1, pathbuf, pathbuf + PATH_MAX - 1, pattern, pattern_last, pglob, limitp, recursion); } /* * The functions glob2 and glob3 are mutually recursive; there is one level * of recursion for each segment in the pattern that contains one or more * meta characters. */ static int glob2(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last, Char *pattern, Char *pattern_last, glob_t *pglob, struct glob_lim *limitp, int recursion) { struct stat sb; Char *p, *q; int anymeta; /* * Loop over pattern segments until end of pattern or until * segment with meta character found. */ for (anymeta = 0;;) { if (*pattern == EOS) { /* End of pattern? */ *pathend = EOS; if (limitp->glim_stat++ >= pglob->gl_maxfiles) { errno = 0; *pathend++ = SEP; *pathend = EOS; return GLOB_NOSPACE; } if (g_lstat(pathbuf, &sb, pglob)) { return 0; } if (((pglob->gl_flags & GLOB_MARK) && pathend[-1] != SEP) && (S_ISDIR(sb.st_mode) || (S_ISLNK(sb.st_mode) && (g_stat(pathbuf, &sb, pglob) == 0) && S_ISDIR(sb.st_mode)))) { if (pathend + 1 > pathend_last) { return 1; } *pathend++ = SEP; *pathend = EOS; } ++pglob->gl_matchc; return globextend(pathbuf, pglob, limitp, &sb); } /* Find end of next segment, copy tentatively to pathend. */ q = pathend; p = pattern; while (*p != EOS && *p != SEP) { if (ismeta(*p)) { anymeta = 1; } if (q + 1 > pathend_last) { return 1; } *q++ = *p++; } if (!anymeta) { /* No expansion, do next segment. */ pathend = q; pattern = p; while (*pattern == SEP) { if (pathend + 1 > pathend_last) { return 1; } *pathend++ = *pattern++; } } else { /* Need expansion, recurse. */ return glob3(pathbuf, pathbuf_last, pathend, pathend_last, pattern, p, pattern_last, pglob, limitp, recursion + 1); } } /* NOTREACHED */ } static int glob3(Char *pathbuf, Char *pathbuf_last, Char *pathend, Char *pathend_last, Char *pattern, Char *restpattern, Char *restpattern_last, glob_t *pglob, struct glob_lim *limitp, int recursion) { struct dirent *dp; DIR *dirp; int err; char buf[PATH_MAX]; /* * The readdirfunc declaration can't be prototyped, because it is * assigned, below, to two functions which are prototyped in glob.h * and dirent.h as taking pointers to differently typed opaque * structures. */ struct dirent *(*readdirfunc)(void *); if (pathend > pathend_last) { return 1; } *pathend = EOS; errno = 0; if (recursion >= pglob->gl_maxdepth) { return GLOB_NOSPACE; } if ((dirp = g_opendir(pathbuf, pglob)) == NULL) { /* TODO: don't call for ENOENT or ENOTDIR? */ if (pglob->gl_errfunc) { if (g_Ctoc(pathbuf, buf, sizeof(buf))) { return GLOB_ABORTED; } if (pglob->gl_errfunc(buf, errno) || pglob->gl_flags & GLOB_ERR) { return GLOB_ABORTED; } } return 0; } err = 0; /* Search directory for matching names. */ if (pglob->gl_flags & GLOB_ALTDIRFUNC) { readdirfunc = pglob->gl_readdir; } else { readdirfunc = (struct dirent *(*)(void *))readdir; } while ((dp = (*readdirfunc)(dirp))) { unsigned char *sc; Char *dc; if (limitp->glim_readdir++ >= pglob->gl_maxfiles) { errno = 0; *pathend++ = SEP; *pathend = EOS; err = GLOB_NOSPACE; break; } /* Initial DOT must be matched literally. */ if (dp->d_name[0] == DOT && *pattern != DOT) { continue; } dc = pathend; sc = (unsigned char *) dp->d_name; while (dc < pathend_last && (*dc++ = *sc++) != EOS) ; if (dc >= pathend_last) { *dc = EOS; err = 1; break; } if (!match(pathend, pattern, restpattern, pglob->gl_maxdepth)) { *pathend = EOS; continue; } err = glob2(pathbuf, pathbuf_last, --dc, pathend_last, restpattern, restpattern_last, pglob, limitp, recursion); if (err) { break; } } if (pglob->gl_flags & GLOB_ALTDIRFUNC) { (*pglob->gl_closedir)(dirp); } else { closedir(dirp); } return err; } /* * Extend the gl_pathv member of a glob_t structure to accommodate a new item, * add the new item, and update gl_pathc. * * This assumes the BSD realloc, which only copies the block when its size * crosses a power-of-two boundary; for v7 realloc, this would cause quadratic * behavior. * * Return 0 if new item added, error code if memory couldn't be allocated. * * Invariant of the glob_t structure: * Either gl_pathc is zero and gl_pathv is NULL; or gl_pathc > 0 and * gl_pathv points to (gl_offs + gl_pathc + 1) items. */ static int globextend(const Char *path, glob_t *pglob, struct glob_lim *limitp, struct stat *sb) { char **pathv; ssize_t i; size_t newn, len; char *copy = NULL; const Char *p; struct stat **statv; newn = 2 + pglob->gl_pathc + pglob->gl_offs; if (pglob->gl_offs >= INT_MAX || pglob->gl_pathc >= INT_MAX || newn >= INT_MAX || SIZE_MAX / sizeof(*pathv) <= newn || SIZE_MAX / sizeof(*statv) <= newn) { nospace: for (i = pglob->gl_offs; i < (ssize_t)(newn - 2); i++) { if (pglob->gl_pathv && pglob->gl_pathv[i]) { free(pglob->gl_pathv[i]); } if ((pglob->gl_flags & GLOB_KEEPSTAT) != 0 && pglob->gl_pathv && pglob->gl_pathv[i]) { free(pglob->gl_statv[i]); } } free(pglob->gl_pathv); pglob->gl_pathv = NULL; free(pglob->gl_statv); pglob->gl_statv = NULL; return GLOB_NOSPACE; } pathv = realloc(pglob->gl_pathv, newn * sizeof(*pathv)); if (pathv == NULL) { goto nospace; } if (pglob->gl_pathv == NULL && pglob->gl_offs > 0) { /* first time around -- clear initial gl_offs items */ pathv += pglob->gl_offs; for (i = pglob->gl_offs; --i >= 0; ) { *--pathv = NULL; } } pglob->gl_pathv = pathv; if ((pglob->gl_flags & GLOB_KEEPSTAT) != 0) { statv = realloc(pglob->gl_statv, newn * sizeof(*statv)); if (statv == NULL) { goto nospace; } if (pglob->gl_statv == NULL && pglob->gl_offs > 0) { /* first time around -- clear initial gl_offs items */ statv += pglob->gl_offs; for (i = pglob->gl_offs; --i >= 0; ) { *--statv = NULL; } } pglob->gl_statv = statv; if (sb == NULL) { statv[pglob->gl_offs + pglob->gl_pathc] = NULL; } else { limitp->glim_malloc += sizeof(**statv); if (limitp->glim_malloc >= GLOB_LIMIT_MALLOC) { errno = 0; return GLOB_NOSPACE; } if ((statv[pglob->gl_offs + pglob->gl_pathc] = malloc(sizeof(**statv))) == NULL) { goto copy_error; } memcpy(statv[pglob->gl_offs + pglob->gl_pathc], sb, sizeof(*sb)); } statv[pglob->gl_offs + pglob->gl_pathc + 1] = NULL; } for (p = path; *p++;) ; len = (size_t)(p - path); limitp->glim_malloc += len; if ((copy = malloc(len)) != NULL) { if (g_Ctoc(path, copy, len)) { free(copy); return GLOB_NOSPACE; } pathv[pglob->gl_offs + pglob->gl_pathc++] = copy; } pathv[pglob->gl_offs + pglob->gl_pathc] = NULL; if ((newn * sizeof(*pathv)) + limitp->glim_malloc > GLOB_LIMIT_MALLOC) { errno = 0; return GLOB_NOSPACE; } copy_error: return copy == NULL ? GLOB_NOSPACE : 0; } /* * pattern matching function for filenames. Each occurrence of the * * pattern causes a recursion level. */ static int match(Char *name, Char *pat, Char *patend, int recur) { int ok, negate_range; Char c, k; if (recur-- == 0) { return GLOB_NOSPACE; } while (pat < patend) { c = *pat++; switch (c & M_MASK) { case M_ALL: while (pat < patend && (*pat & M_MASK) == M_ALL) { pat++; /* eat consecutive '*' */ } if (pat == patend) { return 1; } do { if (match(name, pat, patend, recur)) { return 1; } } while (*name++ != EOS); return 0; case M_ONE: if (*name++ == EOS) { return 0; } break; case M_SET: ok = 0; if ((k = *name++) == EOS) { return 0; } if ((negate_range = ((*pat & M_MASK) == M_NOT)) != EOS) { ++pat; } while (((c = *pat++) & M_MASK) != M_END) { if ((*pat & M_MASK) == M_RNG) { if (c <= k && k <= pat[1]) { ok = 1; } pat += 2; } else if (c == k) { ok = 1; } } if (ok == negate_range) { return 0; } break; default: if (*name++ != c) { return 0; } break; } } return *name == EOS; } /* Free allocated data belonging to a glob_t structure. */ void globfree(glob_t *pglob) { int i; char **pp; if (pglob->gl_pathv != NULL) { pp = pglob->gl_pathv + pglob->gl_offs; for (i = pglob->gl_pathc; i--; ++pp) { free(*pp); } free(pglob->gl_pathv); pglob->gl_pathv = NULL; } if (pglob->gl_statv != NULL) { for (i = 0; i < pglob->gl_pathc; i++) { free(pglob->gl_statv[i]); } free(pglob->gl_statv); pglob->gl_statv = NULL; } } static DIR * g_opendir(Char *str, glob_t *pglob) { char buf[PATH_MAX]; if (!*str) { buf[0] = '.'; buf[1] = 0; } else { if (g_Ctoc(str, buf, sizeof(buf))) { return NULL; } } if (pglob->gl_flags & GLOB_ALTDIRFUNC) { return (*pglob->gl_opendir)(buf); } return opendir(buf); } static int g_lstat(Char *fn, struct stat *sb, glob_t *pglob) { char buf[PATH_MAX]; if (g_Ctoc(fn, buf, sizeof(buf))) { return -1; } if (pglob->gl_flags & GLOB_ALTDIRFUNC) { return (*pglob->gl_lstat)(buf, sb); } return lstat(buf, sb); } static int g_stat(Char *fn, struct stat *sb, glob_t *pglob) { char buf[PATH_MAX]; if (g_Ctoc(fn, buf, sizeof(buf))) { return -1; } if (pglob->gl_flags & GLOB_ALTDIRFUNC) { return (*pglob->gl_stat)(buf, sb); } return stat(buf, sb); } static Char * g_strchr(const Char *str, int ch) { do { if (*str == ch) { return (Char *)str; } } while (*str++); return NULL; } static int g_Ctoc(const Char *str, char *buf, unsigned int len) { while (len--) { if ((*buf++ = *str++) == EOS) { return 0; } } return 1; } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/messages_pl.h0000644000175000017500000003546013446174132016665 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Przekroczony czas oczekiwania" #define MSG_CAPABILITIES "Nie można przełączać capabilities" #define MSG_CLIENT_CLOSED_CNX "Klient zamknął połączenie" #define MSG_CLIENT_READ_ERR "Błąd odczytu danych od klienta" #define MSG_CANT_OPEN_CNX "Nie można utworzyć połączenia" #define MSG_CANT_CREATE_DATA_SOCKET "Nie można utworzyć gniazda dla danych" #define MSG_DEBUG_CLIENT_IS "Adres klienta to" #define MSG_SYNTAX_ERROR_IP "Błąd składni w adresie IP" #define MSG_PORT_SUCCESSFUL "komenda PORT powiodła się" #define MSG_ONLY_IPV4V6 "Tylko IPv4 oraz IPv6 są wspierane (1,2)" #define MSG_ONLY_IPV4 "Tylko IPv4 jest wspierane (1)" #define MSG_TIMEOUT_PARSER "Przekroczono czas oczekiwaniat - wpisuj szybciej następnym razem" #define MSG_LINE_TOO_LONG "Linia zbyt długa" #define MSG_LOG_OVERFLOW "Klient próbował przepełnić bufor lini poleceń" #define MSG_GOODBYE "Żegnaj. Wgrałeś %llu oraz ściągnąłeś %llu kbajtów." #define MSG_DEBUG_COMMAND "Komenda" #define MSG_IS_YOUR_CURRENT_LOCATION "to Twoja aktualna lokalizacja" #define MSG_NOT_LOGGED_IN "Nie jesteś aktualnie zalogowany" #define MSG_AUTH_UNIMPLEMENTED "Rozszerzenia bezpieczeństwa nie zaimplementowane" #define MSG_NO_FILE_NAME "Brak nazwy pliku" #define MSG_NO_DIRECTORY_NAME "Brak nazwy katalogu" #define MSG_NO_RESTART_POINT "Brak punktu z którego ponawiać" #define MSG_ABOR_SUCCESS "Ponieważ to widzisz komenda ABOR zakończyła się sukcesem" #define MSG_MISSING_ARG "Brakuje argumentu" #define MSG_GARBAGE_FOUND "Znaleziono śmieci po informacji o wartości" #define MSG_VALUE_TOO_LARGE "Wartośc zbyt duża" #define MSG_IDLE_TIME "Czas oczekiwania ustawiony na %lu sekund" #define MSG_SITE_HELP "Następujące komendy SITE są obsługiwane" #define MSG_BAD_CHMOD "Nieprawidłowe prawa" #define MSG_UNKNOWN_EXTENSION "jest nieznanym rozszerzeniem" #define MSG_XDBG_OK "komenda XDBG powiodła się, aktualny poziom debugowania to %d" #define MSG_UNKNOWN_COMMAND "Nieznana komenda" #define MSG_TIMEOUT_NOOP "Przekroczony czas oczekiwania (brak operacji w ciągu %lu sekund)" #define MSG_TIMEOUT_DATA "Przekroczony czas oczekiwania (brak nowych danych w ciągu %lu sekund)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "Jesteś już zalogowany" #define MSG_ANY_PASSWORD "Dowolne hasło zadziała" #define MSG_ANONYMOUS_LOGGED "Anonimowy użytkownik zalogowany" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Anonimowy użytkownik zalogowany w wirtualnym FTP" #define MSG_USER_OK "Użytkownik %s OK. Wymagane hasło" #define MSG_CANT_DO_TWICE "Nie można tego zrobić w aktualnej sesji" #define MSG_UNABLE_SECURE_ANON "Nie można uaktywnić bezpiecznego anonimowego FTP" #define MSG_BANDWIDTH_RESTRICTED "Twoje zużycie pasma jest ograniczone" #define MSG_NO_PASSWORD_NEEDED "Nie potrzebuję żadnego hasła, mój drogi, tchóżliwy anonimie" #define MSG_NOTRUST "Wybacz ale nie można Ci ufać" #define MSG_WHOAREYOU "Proszę powiedz mi kim jesteś" #define MSG_AUTH_FAILED "Uwierzytelnienie nie powiodło się, wybacz" #define MSG_AUTH_TOOMANY "Zbyt wiele niepowodzeń podczas uwierzytelniania" #define MSG_NO_HOMEDIR "Katalog domowy jest niedostępny - przerywam" #define MSG_NO_HOMEDIR2 "%s nie istnieje lub nie można go odczytać" #define MSG_START_SLASH "Startuje w /" #define MSG_USER_GROUP_ACCESS "Użytkownik %s ma grupowy dostęp do" #define MSG_FXP_SUPPORT "Ten serwer wspiera transfer FXP" #define MSG_RATIO "Musisz respektować współczynnik %u:%u (wgrane/pobrane)" #define MSG_CHROOT_FAILED "Nie można uaktywnić bezpiecznego więzienia chroot()" #define MSG_CURRENT_DIR_IS "OK. Aktualny katalog to %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Aktualny, ograniczony katalog to %s" #define MSG_IS_NOW_LOGGED_IN "%s jest teraz zalogowany" #define MSG_CANT_CHANGE_DIR "Nie można zmienić katalogu na %s" #define MSG_PATH_TOO_LONG "Ścieżka zbyt długa" #define MSG_CANT_PASV "Nie można utworzyć pasywnego połączenia za pomocą tej starej komendy" #define MSG_CANT_PASSIVE "Nie można utworzyć pasywnego połączenia" #define MSG_PORTS_BUSY "Wszystkie zarezerwowane porty TCP są zajęte" #define MSG_GETSOCKNAME_DATA "Nie można zidentyfikować lokalnego gniazda danych" #define MSG_GETPEERNAME "Nie można zidentyfikować lokalnego gniazda danych" #define MSG_INVALID_IP "Wybacz, podano zły adres" #define MSG_NO_EPSV "Proszę użyj klienta IPv6 zgodnego ze standardem obsługi EPSV" #define MSG_BAD_PORT "Wybacz ale nie połączę się z portami < 1024" #define MSG_NO_FXP "Otwieranie połączenia do %s zamiast do %s" #define MSG_FXP "transfer FXP : z %s do %s" #define MSG_NO_DATA_CONN "Połączenie danych nie istnieje" #define MSG_ACCEPT_FAILED "Połączenie nie mogło zostać zaakceptowane" #define MSG_ACCEPT_SUCCESS "Zaakceptowano połączenie danych" #define MSG_CNX_PORT_FAILED "Nie można otworzyć połączenia danych do portu %d" #define MSG_CNX_PORT "Łączenie z portem %d" #define MSG_ANON_CANT_MKD "Wybacz, anonimowi użytkownicy nie mogą tworzyć katalogów" #define MSG_ANON_CANT_RMD "Wybacz, anonimowi użytkownicy nie mogą usuwać katalogów" #define MSG_ANON_CANT_RENAME "Anonimowi użytkownicy nie mogą przenosić/zmieniać nazw plików" #define MSG_ANON_CANT_CHANGE_PERMS "Anonimowi użytkownicy nie mogą zmieniać praw" #define MSG_GLOB_NO_MEMORY "Zabrakło pamięci podczas rozwijania %s" #define MSG_PROBABLY_DENIED "(To prawdopodobnie oznacza \"Brak dostępu\")" #define MSG_GLOB_READ_ERROR "Błąd odczytu podczas rozwijania %s" #define MSG_GLOB_NO_MATCH "Brak pasujących do %s w %s" #define MSG_CHMOD_FAILED "Nie można zmienić praw na %s" #define MSG_CHMOD_SUCCESS "Prawa na %s zostały zmienione" #define MSG_CHMOD_TOTAL_FAILURE "Wybacz ale nie można było zmienić żadnego prawa" #define MSG_ANON_CANT_DELETE "Anonimowi użytkownicy nie mogą kasować plików" #define MSG_ANON_CANT_OVERWRITE "Anonimowi użytkownicy nie mogą nadpisywać istniejących plików" #define MSG_DELE_FAILED "Nie można skasować %s" #define MSG_DELE_SUCCESS "Skasowano %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "Nie skasowano żadnego pliku" #define MSG_LOAD_TOO_HIGH \ "Obciążenie systemu wynnosiło %3.2f w momencie Twojego zalogowania. Nie pozwalamy\n" \ "anonimowym użytkownikom na pobieranie plików przy tak dużym obciążeniu systemu.\n" \ "Wgrywanie jest zawsze dozwolone." #define MSG_OPEN_FAILURE "Nie można otworzyć %s" #define MSG_OPEN_FAILURE2 "Nie można otworzyć tego pliku" #define MSG_STAT_FAILURE "Nie można uzyskać wielkości pliku" #define MSG_STAT_FAILURE2 "Nie można sprawdzić czy plik istnieje" #define MSG_REST_TOO_LARGE_FOR_FILE "Przesunięcie podczas wznawiania %lld jest zbyt duże dla pliku o wielkości %lld." #define MSG_REST_RESET "Przesunięcie podczas wznawiania ustawione na 0" #define MSG_NOT_REGULAR_FILE "Można przesyłać wyłącznie regularne pliki" #define MSG_NOT_MODERATED \ "Ten plik został wgrany przez anonimowego użytkownika i nie został zatwierdzony\n" \ "przez administratora do ściągania." #define MSG_RATIO_DENIAL \ "Wybacz ale współczynnik wgrywania/ściągania to %u:%u .\n" \ "Aktualnie wgrałeś %llu Kb i ściągnąłeś %llu Kb.\n" \ "Proszę wgraj jakieś dane i spróbuj ściągnąć później." #define MSG_NO_MORE_TO_DOWNLOAD "Nie pozostało nic do ściągania" #define MSG_WINNER "Komputer jest Twoim przyjacielem. Zaufaj mu" #define MSG_KBYTES_LEFT "%.1f kbajtów do ściągnięcia" #define MSG_ABORTED "Transfer przerwano" #define MSG_DATA_WRITE_FAILED "Błąd podczas pisania danych do połączenia dla danych" #define MSG_DATA_READ_FAILED "Błąd podczas odczytu danych z połączenia dla danych" #define MSG_MMAP_FAILED "Nie można zmapować pliku do pamięci" #define MSG_WRITE_FAILED "Błąd podczas zapisu do pliku" #define MSG_TRANSFER_RATE_M "%.3f sekund (zmierzonych tutaj), %.2f Mbajtów na sekundę" #define MSG_TRANSFER_RATE_K "%.3f sekund (zmierzonych tutaj), %.2f Kbajtów na sekundę" #define MSG_TRANSFER_RATE_B "%.3f sekund (zmierzonych tutaj), %.2f bajtów na sekundę" #define MSG_SPACE_FREE_M "%.1f Mbajtów wolnej przestrzeni dyskowej" #define MSG_SPACE_FREE_K "%f Kbajtów wolnej przestrzeni dyskowej" #define MSG_DOWNLOADED "ściągnięto" #define MSG_REST_NOT_NUMERIC "REST wymaga numerycznego parametru" #define MSG_REST_ASCII_STRICT "Znacznik odpowiedzi musi być ustawiony na 0 w trybie ASCII" #define MSG_REST_ASCII_WORKAROUND "Wznawiam od %lld ale jesteśmy w trybie ASCII" #define MSG_REST_SUCCESS "Wznawiam od %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Niedozwolona nazwa katalogu" #define MSG_SANITY_FILE_FAILURE "Niedozwolona nazwa pliku: %s" #define MSG_MKD_FAILURE "Nie można utworzyć katalogu" #define MSG_MKD_SUCCESS "Utworzono katalog" #define MSG_RMD_FAILURE "Nie można usunąć katalogu" #define MSG_RMD_SUCCESS "Katalog został usunięty" #define MSG_TIMESTAMP_FAILURE "Nie można uzyskać znacznika czasu" #define MSG_MODE_ERROR "Tylko tryby ASCII i binarny są wspierane" #define MSG_CREATE_FAILURE "Nie można utworzyć pliku" #define MSG_ABRT_ONLY "ABRT jest prawidłową komendą tylko podczas wgrywania" #define MSG_UPLOAD_PARTIAL "częściowo wgrano" #define MSG_REMOVED "zmieniono nazwę" #define MSG_UPLOADED "wgrano" #define MSG_GMTIME_FAILURE "Nie można uzyskać lokalnego czasu" #define MSG_TYPE_8BIT_FAILURE "Tylko 8-bitowe bajty są wspierane, nie żyjemy 10 lat temu" #define MSG_TYPE_UNKNOWN "Nieznany TYP" #define MSG_TYPE_SUCCESS "TYP to aktualnie" #define MSG_STRU_FAILURE "Tylko Pliki (\"F\"iles) są wspierane" #define MSG_MODE_FAILURE "Proszę użyj trybu S(trumieniowego)" #define MSG_RENAME_ABORT "Anulowanie poprzedniej operacji zmiany nazwy" #define MSG_RENAME_RNFR_SUCCESS "RNFR zaakceptowane - plik istnieje, gotów do przeznaczenia" #define MSG_FILE_DOESNT_EXIST "Wybacz ale taki plik nie istnieje" #define MSG_RENAME_ALREADY_THERE "RENAME Niepowiodło się - plik docelowy już istnieje" #define MSG_RENAME_NORNFR "Potrzeba RNFR przed RNTO" #define MSG_RENAME_FAILURE "Usuwanie/zmiana nazwy nie powiodła się" #define MSG_RENAME_SUCCESS "Zmieniono lub przeniesiono plik" #define MSG_NO_SUPERSERVER "Proszę uruchom pure-ftpd z serwerem nadrzędnym (takim jak tcpserver)" #define MSG_NO_FTP_ACCOUNT "Nie można znaleść konta 'ftp'" #define MSG_CONF_ERR "Błąd konfiguracji" #define MSG_NO_VIRTUAL_FILE "Brakuje nazwy pliku wirtualnych użytkowników" #define MSG_ILLEGAL_THROTTLING "Nieprawidłowa wartość dla limitu pasma" #define MSG_ILLEGAL_TRUSTED_GID "Nieprawidłowy zaufany gid dla chroota" #define MSG_ILLEGAL_USER_LIMIT "Nieprawidłowy limit użytkowników" #define MSG_ILLEGAL_FACILITY "Nieznana nazwa facility" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Nieprawidłowy plik konfiguracyjny LDAP" #define MSG_ILLEGAL_LOAD_LIMIT "Nieprawidłowy limit load" #define MSG_ILLEGAL_PORTS_RANGE "Nieprawidłowy przedział portów" #define MSG_ILLEGAL_LS_LIMITS "Nieprawidłowy limit 'ls'" #define MSG_ILLEGAL_FORCE_PASSIVE "Niepdawidłowe IP wymuszone dla pasywnych połączeń" #define MSG_ILLEGAL_RATIO "Nieprawidłowy współczynnik dotyczący ściągania/wgrywania" #define MSG_ILLEGAL_UID_LIMIT "Nieprawidłowy limit uid" #define MSG_ILLEGAL_OPTION "Nieznana opcja" #define MSG_LDAP_MISSING_BASE "Brakuje LDAPBaseDN w pliku konfiguracyjnym LDAP" #define MSG_LDAP_WRONG_PARMS "Błędne parametry LDAP" #define MSG_NEW_CONNECTION "Nowe połączenie z %s" #define MSG_WELCOME_TO "Witaj na" #define MSG_MAX_USERS "%lu użytkowników (maksimum) już zalogowanych, wybacz" #define MSG_NB_USERS "Jesteś %u użytkownikiem z %u możliwych" #define MSG_WELCOME_TIME "Lokalny czas: %02d:%02d. Port serwera: %u." #define MSG_ANONYMOUS_FTP_ONLY "Wyłącznie anonimowe FTP jest dozwolone" #define MSG_RATIOS_EVERYONE "WSPÓŁCZYNNIK OBEJMUJE WSZYSTKICH UŻYTKOWNIKÓW :" #define MSG_RATIOS_ANONYMOUS "ANONIMOWYCH UŻYTKOWNIKÓW OBEJMUJE WSPÓŁCZYNNIK UL/DL :" #define MSG_RATIOS_RULE "by ściągnąć %u Mb, musisz wgrać %u Mb danych." #define MSG_INFO_IDLE_M "Zostaniesz rozłączony po %lu minutach nieaktywności." #define MSG_INFO_IDLE_S "Zostaniesz rozłączony po %lu sekundach nieaktywności." #define MSG_CANT_READ_FILE "Niestety, nie można było przeczytać [%s]" #define MSG_LS_TRUNCATED "Wyjście obcięte do %u pasujących" #define MSG_LS_SUCCESS "%u w sumie pasujących" #define MSG_LOGOUT "Wylogowywanie." #define MSG_AUTH_FAILED_LOG "Autentyfikacja nie powiodła się dla użytkownika [%s]" #define MSG_ILLEGAL_UMASK "Nieprawidłowa umask" #define MSG_STANDALONE_FAILED "Nie można wystartować w trybie standalone" #define MSG_NO_ANONYMOUS_LOGIN "To jest prywatny system - Bez anonimowych logowań" #define MSG_ANONYMOUS_ANY_PASSWORD "Dowolne hasło zadziała" #define MSG_MAX_USERS_IP "Zbyt wiele połączeń (%lu) z tego IP" #define MSG_ACTIVE_DISABLED "Tryb aktywny jest zablokowany" #define MSG_TRANSFER_SUCCESSFUL "Przesył pliku zakończony sukcesem" #define MSG_NO_DISK_SPACE "Dysk pełny - proszę wgraj później" #define MSG_OUT_OF_MEMORY "Zabrakło pamięci" #define MSG_SQL_WRONG_PARMS "Błędne parametry SQL" #define MSG_ILLEGAL_TRUSTED_IP "Nieprawidłowy zaufany adres IP" #define MSG_NO_ASCII_RESUME "Wznawianie transferu ASCII nie jest bezpieczne, proszę najpierw usuń plik" #define MSG_UNKNOWN_ALTLOG "Nieznany format logów" #define MSG_ACCOUNT_DISABLED "Nie można zalogować się jako [%s] : konto zablokowane" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Nieprawidłowy plik konfiguracji SQL" #define MSG_SQL_MISSING_SERVER "W konfiguracji SQL brakuje serwera" #define MSG_SQL_DOWN "Serwer SQL jest prawdopodobnie niedostępny" #define MSG_ILLEGAL_QUOTA "Nieprawidłowa quota" #define MSG_QUOTA_FILES "%llu plików użytych (%d%%) - autoryzowano: %llu plików" #define MSG_QUOTA_SIZE "%llu Kbajtów użytych (%d%%) - autoryzowano: %llu Kb" #define MSG_QUOTA_EXCEEDED "Przekroczona quota: [%s] nie zostanie zapisany" #define MSG_AUTH_UNKNOWN "Nieznana metoda autentyfikacji" #define MSG_PDB_BROKEN "Nie udało się odczytać indeksowanego pliku puredb (lub wykryto stary format) - Spróbuj uruchomić pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s is an alias for %s." #define MSG_ALIASES_UNKNOWN "Unknown alias %s." #define MSG_ALIASES_BROKEN_FILE "Damaged aliases file" #define MSG_ALIASES_LIST "The following aliases are available :" #define MSG_PERUSER_MAX "I can't accept more than %lu connections from the same user" #define MSG_IPV6_OK "IPv6 connections are also welcome on this server" #define MSG_TLS_INFO "TLS: Enabled %s with %s, %d secret bits cipher" #define MSG_TLS_WEAK "TLS: Cipher too weak" #define MSG_TLS_NEEDED "Sorry, cleartext sessions are not accepted on this server.\n" \ "Please reconnect using TLS security mechanisms." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/messages_ro.h0000644000175000017500000003544713446174132016677 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Temporizare expirata" #define MSG_CAPABILITIES "Nu pot comuta capabilitatile" #define MSG_CLIENT_CLOSED_CNX "Clientul a inchis conexiunea" #define MSG_CLIENT_READ_ERR "Eroare de citire de la client" #define MSG_CANT_OPEN_CNX "Nu pot deschide conexiunea" #define MSG_CANT_CREATE_DATA_SOCKET "Nu pot crea soclu de date" #define MSG_DEBUG_CLIENT_IS "Adresa clientului este" #define MSG_SYNTAX_ERROR_IP "Eroare de sintaxa in adresa IP" #define MSG_PORT_SUCCESSFUL "Comanda PORT terminata cu succes" #define MSG_ONLY_IPV4V6 "Este suportat numai IPv4 si IPv6 (1,2)" #define MSG_ONLY_IPV4 "Este suportat numai IPv4 (1)" #define MSG_TIMEOUT_PARSER "Temporizare expirata - incercati sa scrieti putin mai repede data viitoare" #define MSG_LINE_TOO_LONG "Linie prea lunga" #define MSG_LOG_OVERFLOW "Clientul a incercat sa depaseasca buffer-ul liniei de comanda" #define MSG_GOODBYE "La revedere. Ati upload-at %llu si download-at %llu kocteti." #define MSG_DEBUG_COMMAND "Comanda" #define MSG_IS_YOUR_CURRENT_LOCATION "este locatia dumneavoastra" #define MSG_NOT_LOGGED_IN "Nu sinteti inca logat" #define MSG_AUTH_UNIMPLEMENTED "Extensiile de securitate nu sint implementate" #define MSG_NO_FILE_NAME "Nu ati dat un nume de fisier" #define MSG_NO_DIRECTORY_NAME "Nu ati dat un nume de director" #define MSG_NO_RESTART_POINT "Nu exista un punct de repornire" #define MSG_ABOR_SUCCESS "Deoarece ati vazut aceasta comanda ABOR inseamna ca ati reusit" #define MSG_MISSING_ARG "Argumentul lipseste" #define MSG_GARBAGE_FOUND "Am gasit date defecte dupa valoare" #define MSG_VALUE_TOO_LARGE "Valoare prea mare" #define MSG_IDLE_TIME "Timpul de pauza a fost setat la %lu secunde" #define MSG_SITE_HELP "Sint recunoscute urmatoarele comenzi SITE" #define MSG_BAD_CHMOD "Permisiuni eronate" #define MSG_UNKNOWN_EXTENSION "este o extensie necunoscuta" #define MSG_XDBG_OK "Comanda XDBG a reusit. Nivelul de depanare este acum %d" #define MSG_UNKNOWN_COMMAND "Comanda necunoscuta" #define MSG_TIMEOUT_NOOP "Temporizare expirata (nici o operatie de %lu secunde)" #define MSG_TIMEOUT_DATA "Temporizare expirata (nici un fel de date noi de %lu secunde)" #define MSG_SLEEPING "zzZ zzZZ ..." #define MSG_ALREADY_LOGGED "Sinteti deja logat" #define MSG_ANY_PASSWORD "Orice parola va merge" #define MSG_ANONYMOUS_LOGGED "Utilizatorul anonim s-a logat" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Utilizatorul anonim s-a logat in server-ul FTP virtual" #define MSG_USER_OK "Utilizatorul %s este acceptat. Este necesara parola" #define MSG_CANT_DO_TWICE "Nu se poate face acest lucru in sesiunea curenta" #define MSG_UNABLE_SECURE_ANON "Nu pot seta un server FTP anonim securizat" #define MSG_BANDWIDTH_RESTRICTED "Banda de trafic alocata este restrictionata" #define MSG_NO_PASSWORD_NEEDED "Draga utilizator anonim, nu ai nevoie de nici o parola" #define MSG_NOTRUST "Imi pare rau, dar nu am incredere in tine" #define MSG_WHOAREYOU "Te rog frumos sa-mi spui cine esti" #define MSG_AUTH_FAILED "Autentificarea a esuat" #define MSG_AUTH_TOOMANY "Prea multe autentificari esuate" #define MSG_NO_HOMEDIR "Directorul personal nu este disponibil. Renunt." #define MSG_NO_HOMEDIR2 "%s nu exista sau nu poate fi accesat" #define MSG_START_SLASH "Pornesc in /" #define MSG_USER_GROUP_ACCESS "Utilizatorul %s are acces de grup la" #define MSG_FXP_SUPPORT "Acest server suporta transferuri FXP" #define MSG_RATIO "Ar trebui sa va asteptati la o rata %u:%u (UL/DL)" #define MSG_CHROOT_FAILED "Nu am putut seta un chroot() securizat" #define MSG_CURRENT_DIR_IS "OK. Directorul curent este %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Directorul curent restrictionat este %s" #define MSG_IS_NOW_LOGGED_IN "%s este acum logat" #define MSG_CANT_CHANGE_DIR "Nu pot intra in directorul %s" #define MSG_PATH_TOO_LONG "Cale prea lunga" #define MSG_CANT_PASV "Nu pot deschide o conexiune pasiva cu aceasta comanda invechita" #define MSG_CANT_PASSIVE "Nu pot deschide o conexiune pasiva" #define MSG_PORTS_BUSY "Toate porturile TCP rezervate sint ocupate" #define MSG_GETSOCKNAME_DATA "Nu pot identifica soclul de date local" #define MSG_GETPEERNAME "Nu pot identifica soclul local" #define MSG_INVALID_IP "Adresa eronata" #define MSG_NO_EPSV "Utilizati un client compatibil IPv6 cu suport EPSV" #define MSG_BAD_PORT "Nu ma conectez la porturi < 1024" #define MSG_NO_FXP "Nu voi deschide o conexiune catre %s (numai catre %s)" #define MSG_FXP "Transfer FXP : de la %s la %s" #define MSG_NO_DATA_CONN "Nu exista conexiune de date" #define MSG_ACCEPT_FAILED "Nu pot accepta conexiunea" #define MSG_ACCEPT_SUCCESS "Conexiune de date acceptata" #define MSG_CNX_PORT_FAILED "Nu pot deschide conexiune de date pe portul %d" #define MSG_CNX_PORT "Conectez la portul %d" #define MSG_ANON_CANT_MKD "Utilizatorii anonimi nu au voie sa creeze directoare" #define MSG_ANON_CANT_RMD "Utilizatorii anonimi nu au voie sa stearga directoare" #define MSG_ANON_CANT_RENAME "Utilizatorii anonimi nu au voie sa mute/redenumeasca fisiere" #define MSG_ANON_CANT_CHANGE_PERMS "Utilizatorii anonimi nu au voie sa modifice permisiunile" #define MSG_GLOB_NO_MEMORY "Nu mai exista memorie (datorita operatiei de globalizare a %s)" #define MSG_PROBABLY_DENIED "(Acest lucru inseamna probabil \"permisiune respinsa\")" #define MSG_GLOB_READ_ERROR "Eroare de citire la operatia de globalizare a %s" #define MSG_GLOB_NO_MATCH "Nici o potrivire pentru %s in %s" #define MSG_CHMOD_FAILED "Nu pot modifica permisiunile pentru %s" #define MSG_CHMOD_SUCCESS "Permisiuni modificate pentru %s" #define MSG_CHMOD_TOTAL_FAILURE "Nu pot modifica nici un fel de permisiuni" #define MSG_ANON_CANT_DELETE "Utilizatorii anonimi nu pot sterge fisiere" #define MSG_ANON_CANT_OVERWRITE "Utilizatorii anonimi nu pot suprascrie fisiere existente" #define MSG_DELE_FAILED "Nu pot sterge %s" #define MSG_DELE_SUCCESS "Am sters %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "Nici un fisier selectat" #define MSG_LOAD_TOO_HIGH \ "Incarcarea server-ului era %3.2f cind v-ati conectat. Nu sint permise download-uri\n" \ "pentru utilizatorii anonimi cind incarcarea este atit de mare. Upload-uri sint\n" \ "intotdeauna permise." #define MSG_OPEN_FAILURE "Nu pot deschide %s" #define MSG_OPEN_FAILURE2 "Nu pot deschide acel fisier" #define MSG_STAT_FAILURE "Nu pot determina marimea fisierului" #define MSG_STAT_FAILURE2 "Nu pot verifica existenta fisierului" #define MSG_REST_TOO_LARGE_FOR_FILE "Adresa de reluare %lld este prea mare fata de marimea fisierului %lld." #define MSG_REST_RESET "Adresa de reluare a fost resetata la 0" #define MSG_NOT_REGULAR_FILE "Pot transfera numai fisiere obisnuite" #define MSG_NOT_MODERATED \ "Acest fisier a fost upload-at de catre un utilizator anonim. El nu a fost\n" \ "inca aprobat pentru download de catre administratorul site-ului." #define MSG_RATIO_DENIAL \ "Rata upload/download este %u:%u .\n" \ "Deocamdata ati upload-at %llu Kb si download-at %llu Kb.\n" \ "Mai upload-ati fisiere si apoi incercati mai tirziu sa download-ati ceva." #define MSG_NO_MORE_TO_DOWNLOAD "Nu mai este nimic de download-at" #define MSG_WINNER "Calculatorul este prietenul tau. Ai incredere in el" #define MSG_KBYTES_LEFT "%.1f kocteti de download-at" #define MSG_ABORTED "Transfer anulat" #define MSG_DATA_WRITE_FAILED "Eroare la scriere pe conexiunea de date" #define MSG_DATA_READ_FAILED "Eroare la citirea din conexiunea de date" #define MSG_MMAP_FAILED "Nu pot mapa fisierul in memorie" #define MSG_WRITE_FAILED "Eroare la scrierea fisierului" #define MSG_TRANSFER_RATE_M "%.3f secunde (masurate aici), %.2f Mocteti pe secunda" #define MSG_TRANSFER_RATE_K "%.3f secunde (masurate aici), %.2f Kocteti pe secunda" #define MSG_TRANSFER_RATE_B "%.3f secunde (masurate aici), %.2f octeti pe secunda" #define MSG_SPACE_FREE_M "%.1f Mocteti spatiu liber pe disc" #define MSG_SPACE_FREE_K "%f Kocteti spatiu liber pe disc" #define MSG_DOWNLOADED "download-at" #define MSG_REST_NOT_NUMERIC "REST are nevoie de un parametru numeric" #define MSG_REST_ASCII_STRICT "Markerul de rapuns trebuie sa fie 0 in modul ASCII" #define MSG_REST_ASCII_WORKAROUND "Restartez de la %lld. Dar sint in modul ASCII" #define MSG_REST_SUCCESS "Restartez de la %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Nume de director interzis" #define MSG_SANITY_FILE_FAILURE "Nume de fisier interzis: %s" #define MSG_MKD_FAILURE "Nu pot crea directorul" #define MSG_MKD_SUCCESS "Am creat cu succes directorul" #define MSG_RMD_FAILURE "Nu pot sterge directorul" #define MSG_RMD_SUCCESS "Am sters cu succes directorul" #define MSG_TIMESTAMP_FAILURE "Nu pot obtine un marker de timp" #define MSG_MODE_ERROR "Sint suportate numai modurile ASCII si binar" #define MSG_CREATE_FAILURE "Nu pot crea fisierul" #define MSG_ABRT_ONLY "Comanda ABRT este normala numai la upload" #define MSG_UPLOAD_PARTIAL "upload-at partial" #define MSG_REMOVED "sters" #define MSG_UPLOADED "upload-at" #define MSG_GMTIME_FAILURE "Nu pot obtine timpul local" #define MSG_TYPE_8BIT_FAILURE "Sint suportati numai octeti de 8 biti; nu sintem acum 10 ani" #define MSG_TYPE_UNKNOWN "TYPE necunoscut" #define MSG_TYPE_SUCCESS "TYPE este acum" #define MSG_STRU_FAILURE "Numai File (fisier) este suportat" #define MSG_MODE_FAILURE "Utilizati modul Stream (flux)" #define MSG_RENAME_ABORT "Anulez comanda precedenta de redenumire" #define MSG_RENAME_RNFR_SUCCESS "RNFR acceptat - fisierul exista si este gata pentru destinatie" #define MSG_FILE_DOESNT_EXIST "Acest fisier nu exista" #define MSG_RENAME_ALREADY_THERE "Operatie RENAME esuata - fisierul destinatie exista deja" #define MSG_RENAME_NORNFR "Este nevoie de RNFR inainte de RNTO" #define MSG_RENAME_FAILURE "Eroare de redenumire/mutare" #define MSG_RENAME_SUCCESS "Fisier redenumit sau mutat cu succes" #define MSG_NO_SUPERSERVER "Va rog sa rulati pure-ftpd cu un program super-server (precum tcpserver)" #define MSG_NO_FTP_ACCOUNT "Nu am gasit contul 'ftp'" #define MSG_CONF_ERR "Eroare de configurare" #define MSG_NO_VIRTUAL_FILE "Lipseste numele fisierului de utilizatori virtuali" #define MSG_ILLEGAL_THROTTLING "Valoare eronată pentru limita ratei de transfer" #define MSG_ILLEGAL_TRUSTED_GID "GID-ul de incredere pentru chroot() nu este corespunzator" #define MSG_ILLEGAL_USER_LIMIT "Limita utilizator eronata" #define MSG_ILLEGAL_FACILITY "Nume necunoscut de facilitate" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Fisier de configuare LDAP eronat" #define MSG_ILLEGAL_LOAD_LIMIT "Limita de incarcare eronata" #define MSG_ILLEGAL_PORTS_RANGE "Domeniu de porturi eronat" #define MSG_ILLEGAL_LS_LIMITS "Limita 'ls' eronata" #define MSG_ILLEGAL_FORCE_PASSIVE "IP eronat pentru conexiuni pasive fortate" #define MSG_ILLEGAL_RATIO "Cota upload/download eronata" #define MSG_ILLEGAL_UID_LIMIT "Limita de UID necorespunzatoare" #define MSG_ILLEGAL_OPTION "Optiune de executie necunoscuta" #define MSG_LDAP_MISSING_BASE "Lipseste LDAPBaseDN in fisierul de configurare LDAP" #define MSG_LDAP_WRONG_PARMS "Parametrii LDAP eronati" #define MSG_NEW_CONNECTION "Conexiune noua de la %s" #define MSG_WELCOME_TO "Bine ati venit pe" #define MSG_MAX_USERS "%lu utilizatori (maximul) sint deja logati" #define MSG_NB_USERS "Sineti utilizatorul cu numarul %u din %u permisi" #define MSG_WELCOME_TIME "Timpul local este acum %02d:%02d. Port server: %u." #define MSG_ANONYMOUS_FTP_ONLY "Aici este permis numai acces FTP anonim" #define MSG_RATIOS_EVERYONE "COTELE SINT ACTIVATE PENTRU ORICINE :" #define MSG_RATIOS_ANONYMOUS "UTILIZATORII ANONIMI SINT SUPUSI UNEI COTE UL/DL :" #define MSG_RATIOS_RULE "pentru a download-a %u Mb, este obligatoriu sa upload-ati %u Mb de alte fisiere." #define MSG_INFO_IDLE_M "Veti fi deconectat dupa %lu minute de inactivitate." #define MSG_INFO_IDLE_S "Veti fi deconectat dupa %lu secunde de inactivitate." #define MSG_CANT_READ_FILE "Nu am putut citi [%s]" #define MSG_LS_TRUNCATED "Rezultat trunchiat la %u potriviri" #define MSG_LS_SUCCESS "%u potriviri in total" #define MSG_LOGOUT "Iesire." #define MSG_AUTH_FAILED_LOG "Autentificare esuata pentru utilizatorul [%s]" #define MSG_ILLEGAL_UMASK "Valoare umask eronata" #define MSG_STANDALONE_FAILED "Nu am putut starta un server de sine statator" #define MSG_NO_ANONYMOUS_LOGIN "Acesta este un sistem privat - Nu este permisa logarea anonima" #define MSG_ANONYMOUS_ANY_PASSWORD "Va fi valabila orice parola" #define MSG_MAX_USERS_IP "Prea multe conexiuni (%lu) de la acest IP" #define MSG_ACTIVE_DISABLED "Modul activ este dezactivat" #define MSG_TRANSFER_SUCCESSFUL "Fisier transferat cu succes" #define MSG_NO_DISK_SPACE "Disc plin - incercati sa upload-ati mai tirziu" #define MSG_OUT_OF_MEMORY "Nu mai exista memorie" #define MSG_ILLEGAL_TRUSTED_IP "Adresa IP neacceptata" #define MSG_SQL_WRONG_PARMS "Parametrii SQL eronati" #define MSG_NO_ASCII_RESUME "Reluarea fisierelor ASCII este nesigura. Stergeti mai intii fisierul" #define MSG_UNKNOWN_ALTLOG "Format de logare necunoscut" #define MSG_ACCOUNT_DISABLED "Nu pot loga ca [%s] : cont dezactivat" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Fisier de configurarea SQL eronat" #define MSG_SQL_MISSING_SERVER "In fisierul de configurare SQL lipseste server-ul" #define MSG_SQL_DOWN "Se pare ca server-ul SQL este oprit" #define MSG_ILLEGAL_QUOTA "Cota eronata" #define MSG_QUOTA_FILES "%llu fisiere utilizate (%d%%) - autorizat: %llu fisiere" #define MSG_QUOTA_SIZE "%llu Kocteti utilizati (%d%%) - autorizat: %llu Kocteti" #define MSG_QUOTA_EXCEEDED "Cota depasita: [%s] nu va fi salvat" #define MSG_AUTH_UNKNOWN "Metoda de autentificare necunoscuta" #define MSG_PDB_BROKEN "Nu pot citi fisierul puredb indexat (probabil e in format vechi) - Incercati pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s este un alias pentru %s." #define MSG_ALIASES_UNKNOWN "Aliasul %s este necunoscut." #define MSG_ALIASES_BROKEN_FILE "Fisier de aliasuri defect" #define MSG_ALIASES_LIST "Sint disponibile urmatoarele aliasuri: " #define MSG_PERUSER_MAX "Nu pot accepta mai mult de %lu conexiuni de la acelasi utilizator" #define MSG_IPV6_OK "Conexiunile IPv6 sint acceptate de catre acest server" #define MSG_TLS_INFO "TLS: Am activat %s cu %s, criptare cu %d biti" #define MSG_TLS_WEAK "TLS: Sistem de criptare prea slab" #define MSG_TLS_NEEDED "Sesiunile in text clar nu sint acceptate pe acest server.\n" \ "Reconectati-va utilizind mecanismele de securitate TLS." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/messages_pt_br.h0000644000175000017500000003576713446174132017372 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Tempo expirado" #define MSG_CAPABILITIES "Năo foi possível trocar capacidades" #define MSG_CLIENT_CLOSED_CNX "Cliente encerrou a conexăo" #define MSG_CLIENT_READ_ERR "Erro de leitura do cliente" #define MSG_CANT_OPEN_CNX "Năo foi possível abrir conexăo" #define MSG_CANT_CREATE_DATA_SOCKET "Năo foi possível criar socket de dados" #define MSG_DEBUG_CLIENT_IS "Endereço do cliente é" #define MSG_SYNTAX_ERROR_IP "Erro de sintaxe no endereço IP" #define MSG_PORT_SUCCESSFUL "Comando PORT bem sucedido" #define MSG_ONLY_IPV4V6 "Somente IPv4 e IPv6 săo suportados (1,2)" #define MSG_ONLY_IPV4 "Somente IPv4 é suportado (1)" #define MSG_TIMEOUT_PARSER "Tempo expirado - experimente digitar um pouco mais rápido na próxima vez" #define MSG_LINE_TOO_LONG "Linha muito comprida" #define MSG_LOG_OVERFLOW "O cliente tentou estourar o buffer da linha de comando" #define MSG_GOODBYE "Adeus. Vocę enviou %llu e recebeu %llu kbytes." #define MSG_DEBUG_COMMAND "Comando" #define MSG_IS_YOUR_CURRENT_LOCATION "é a sua localizaçăo atual" #define MSG_NOT_LOGGED_IN "Vocę năo está logado" #define MSG_AUTH_UNIMPLEMENTED "Extensőes de segurança năo implementadas" #define MSG_NO_FILE_NAME "Nome do arquivo năo informado" #define MSG_NO_DIRECTORY_NAME "Nome do diretório năo informado" #define MSG_NO_RESTART_POINT "Năo existe um ponto de reinício" #define MSG_ABOR_SUCCESS "Comando ABOR bem sucedido" #define MSG_MISSING_ARG "Falta argumento" #define MSG_GARBAGE_FOUND "Sujeira encontrada depois do valor" #define MSG_VALUE_TOO_LARGE "Valor muito grande" #define MSG_IDLE_TIME "Tempo ocioso configurado para %lu segundos" #define MSG_SITE_HELP "Os seguintes comandos SITE săo reconhecidos" #define MSG_BAD_CHMOD "Permissőes inválidas" #define MSG_UNKNOWN_EXTENSION "é uma extensăo desconhecida" #define MSG_XDBG_OK "Comando XDBG foi bem sucedido, nível de depuraçăo agora é %d" #define MSG_UNKNOWN_COMMAND "Comando desconhecido" #define MSG_TIMEOUT_NOOP "Tempo expirado (nenhuma operaçăo durante %lu segundos)" #define MSG_TIMEOUT_DATA "Tempo expirado (nenhum dado novo durante %lu segundos)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "Vocę já está logado" #define MSG_ANY_PASSWORD "Qualquer senha funcionará" #define MSG_ANONYMOUS_LOGGED "Usuário anônimo logado" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Usuário anônimo logado no FTP virtual" #define MSG_USER_OK "Usuário %s OK. Senha requerida" #define MSG_CANT_DO_TWICE "Năo é possível realizar isto na sessăo atual" #define MSG_UNABLE_SECURE_ANON "Năo é possível configurar FTP anônimo seguro" #define MSG_BANDWIDTH_RESTRICTED "Seu uso de largura de banda está restrito" #define MSG_NO_PASSWORD_NEEDED "Senha năo requerida" #define MSG_NOTRUST "Desculpe, năo posso confiar em vocę" #define MSG_WHOAREYOU "Por favor informe quem vocę é" #define MSG_AUTH_FAILED "Autenticaçăo falhou, desculpe" #define MSG_AUTH_TOOMANY "Muitas falhas de autenticaçăo" #define MSG_NO_HOMEDIR "Diretório pessoal năo disponível - cancelando" #define MSG_NO_HOMEDIR2 "%s năo existe ou é inalcançável" #define MSG_START_SLASH "Iniciando em /" #define MSG_USER_GROUP_ACCESS "Usuário %s tem acesso de grupo a" #define MSG_FXP_SUPPORT "Este servidor suporta transferęncia FXP" #define MSG_RATIO "A proporçăo %u:%u (UL/DL) deve ser respeitada" #define MSG_CHROOT_FAILED "Năo foi possível configurar uma jaula chroot() segura" #define MSG_CURRENT_DIR_IS "OK. Diretório atual é %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Diretório restrito atual é %s" #define MSG_IS_NOW_LOGGED_IN "%s agora está logado" #define MSG_CANT_CHANGE_DIR "Năo foi possível entrar no diretório %s" #define MSG_PATH_TOO_LONG "Path muito comprido" #define MSG_CANT_PASV "Năo é possível usar PASV em conexőes IPv6 (comando obsoleto). Use o comando EPSV." #define MSG_CANT_PASSIVE "Năo foi possível abrir uma conexăo passiva" #define MSG_PORTS_BUSY "Todas as portas TCP reservadas estăo ocupadas" #define MSG_GETSOCKNAME_DATA "Năo foi possível identificar o socket de dados local" #define MSG_GETPEERNAME "Năo foi possível identificar o socket local" #define MSG_INVALID_IP "Desculpe, endereço fornecido inválido" #define MSG_NO_EPSV "Favor utilizar um cliente compatível com IPv6, com suporte a EPSV" #define MSG_BAD_PORT "Desculpe, năo me conectarei a portas < 1024" #define MSG_NO_FXP "Năo abrirei uma conexăo para %s (somente para %s)" #define MSG_FXP "Transferęncia FXP : de %s para %s" #define MSG_NO_DATA_CONN "Năo existe conexăo de dados" #define MSG_ACCEPT_FAILED "A conexăo năo pôde ser aceita" #define MSG_ACCEPT_SUCCESS "Conexăo de dados aceita" #define MSG_CNX_PORT_FAILED "Năo foi possível abrir conexăo de dados com a porta %d" #define MSG_CNX_PORT "Conectando com a porta %d" #define MSG_ANON_CANT_MKD "Desculpe, usuários anônimos năo tęm permissăo para criar diretórios" #define MSG_ANON_CANT_RMD "Desculpe, usuários anônimos năo tęm permissăo para remover diretórios" #define MSG_ANON_CANT_RENAME "Usuários anônimos năo tęm permissăo para mover/renomear arquivos" #define MSG_ANON_CANT_CHANGE_PERMS "Usuários anônimos năo podem alterar permissőes" #define MSG_GLOB_NO_MEMORY "Sem memória (devido expansăo de %s)" #define MSG_PROBABLY_DENIED "(Isto provavelmente significa \"Permissăo negada\")" #define MSG_GLOB_READ_ERROR "Erro de leitura durante expansăo de %s" #define MSG_GLOB_NO_MATCH "Nenhuma ocorręncia de %s em %s" #define MSG_CHMOD_FAILED "Năo foi possível alterar permissőes em %s" #define MSG_CHMOD_SUCCESS "Permissőes alteradas em %s" #define MSG_CHMOD_TOTAL_FAILURE "Desculpe, năo foi possível alterar nenhuma permissăo" #define MSG_ANON_CANT_DELETE "Usuários anônimos năo tęm permissăo para remover arquivos" #define MSG_ANON_CANT_OVERWRITE "Usuários anônimos năo tęm permissăo para sobrescrever arquivos existentes" #define MSG_DELE_FAILED "Năo foi possível remover %s" #define MSG_DELE_SUCCESS "%s%s%s%s foi removido" #define MSG_DELE_TOTAL_FAILURE "Nenhum arquivo foi removido" #define MSG_LOAD_TOO_HIGH \ "A carga era %3.2f quando a conexăo foi realizada. Năo é permitido recebimento\n" \ "de arquivos por usuários anônimos quando a carga estiver tăo alta.\n" \ "Envio de arquivos é sempre permitido." #define MSG_OPEN_FAILURE "Năo foi possível abrir %s" #define MSG_OPEN_FAILURE2 "Năo foi possível abrir esse arquivo" #define MSG_STAT_FAILURE "Năo foi possível determinar o tamanho do arquivo" #define MSG_STAT_FAILURE2 "Năo foi possível verificar a existęncia do arquivo" #define MSG_REST_TOO_LARGE_FOR_FILE "Restart offset %lld é muito grande para tamanho de arquivo %lld." #define MSG_REST_RESET "Restart offset reinicializado em 0" #define MSG_NOT_REGULAR_FILE "Somente arquivos comuns podem ser recebidos" #define MSG_NOT_MODERATED \ "Este arquivo foi enviado por um usuário anônimo. Porém ainda năo\n" \ "foi aprovado pelos administradores do site para poder ser recebido." #define MSG_RATIO_DENIAL \ "Desculpe, a proporçăo de envio/recebimento é %u:%u .\n" \ "Até o momento vocę enviou %llu Kb e recebeu %llu Kb.\n" \ "Por favor envie mais arquivos e tente fazer o recebimento posteriormente." #define MSG_NO_MORE_TO_DOWNLOAD "Năo há mais nada para receber" #define MSG_WINNER "O computador é seu amigo. Confie nele" #define MSG_KBYTES_LEFT "%.1f kbytes para receber" #define MSG_ABORTED "Transferęncia cancelada" #define MSG_DATA_WRITE_FAILED "Erro durante escrita ŕ conexăo de dados" #define MSG_DATA_READ_FAILED "Erro durante leitura da conexăo de dados" #define MSG_MMAP_FAILED "Năo foi possível mapear o arquivo na memória" #define MSG_WRITE_FAILED "Erro durante escrita a arquivo" #define MSG_TRANSFER_RATE_M "%.3f segundos (medidos aqui), %.2f Mbytes por segundo" #define MSG_TRANSFER_RATE_K "%.3f segundos (medidos aqui), %.2f Kbytes por segundo" #define MSG_TRANSFER_RATE_B "%.3f segundos (medidos aqui), %.2f bytes por segundo" #define MSG_SPACE_FREE_M "%.1f Mbytes de espaço livre em disco" #define MSG_SPACE_FREE_K "%f Kbytes de espaço livre em disco" #define MSG_DOWNLOADED "recebido" #define MSG_REST_NOT_NUMERIC "REST requer um parâmetro numérico" #define MSG_REST_ASCII_STRICT "Marca de resposta deve ser 0 no modo ASCII" #define MSG_REST_ASCII_WORKAROUND "Reiniciando em %lld. Porém estamos no modo ASCII" #define MSG_REST_SUCCESS "Reiniciando em %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Nome de diretório proibido" #define MSG_SANITY_FILE_FAILURE "Nome de arquivo proibido: %s" #define MSG_MKD_FAILURE "Năo foi possível criar diretório" #define MSG_MKD_SUCCESS "O diretório foi criado com sucesso" #define MSG_RMD_FAILURE "Năo foi possível remover diretório" #define MSG_RMD_SUCCESS "O diretório foi removido com sucesso" #define MSG_TIMESTAMP_FAILURE "Năo foi possível obter uma marca de tempo" #define MSG_MODE_ERROR "Somente modos ASCII e binário săo suportados" #define MSG_CREATE_FAILURE "Năo foi possível criar arquivo" #define MSG_ABRT_ONLY "ABRT é o único comando válido durante transmissăo" #define MSG_UPLOAD_PARTIAL "parcialmente enviado" #define MSG_REMOVED "removido" #define MSG_UPLOADED "enviado" #define MSG_GMTIME_FAILURE "Năo foi possível obter a hora local" #define MSG_TYPE_8BIT_FAILURE "Somente bytes de 8 bits săo suportados. Năo estamos há 10 anos atrás" #define MSG_TYPE_UNKNOWN "TYPE desconhecido" #define MSG_TYPE_SUCCESS "TYPE agora é" #define MSG_STRU_FAILURE "Somente File (arquivo) é suportado" #define MSG_MODE_FAILURE "Utilize modo Stream (fluxo)" #define MSG_RENAME_ABORT "Cancelando comando de renomeaçăo anterior" #define MSG_RENAME_RNFR_SUCCESS "RNFR aceito - arquivo existe, pronto para destino" #define MSG_FILE_DOESNT_EXIST "Desculpe, esse arquivo năo existe" #define MSG_RENAME_ALREADY_THERE "RENAME falhou - arquivo de destino já existe" #define MSG_RENAME_NORNFR "É necessário RNFR antes de RNTO" #define MSG_RENAME_FAILURE "Falha em renomear/mover" #define MSG_RENAME_SUCCESS "Arquivo renomeado ou movido com sucesso" #define MSG_NO_SUPERSERVER "Por favor execute pure-ftpd dentro de um super-servidor (como tcpserver)" #define MSG_NO_FTP_ACCOUNT "Năo foi possível encontrar a conta 'ftp'" #define MSG_CONF_ERR "Erro de configuraçăo" #define MSG_NO_VIRTUAL_FILE "Está faltando arquivo de usuários virtuais" #define MSG_ILLEGAL_THROTTLING "Valor ilegal para limite de transferęncia" #define MSG_ILLEGAL_TRUSTED_GID "GID de confiança para chroot ilegal" #define MSG_ILLEGAL_USER_LIMIT "Limite de usuário ilegal" #define MSG_ILLEGAL_FACILITY "Nome de facilidade desconhecido" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Arquivo de configuraçăo de LDAP inválido" #define MSG_ILLEGAL_LOAD_LIMIT "Limite de carga ilegal" #define MSG_ILLEGAL_PORTS_RANGE "Faixa de portas ilegal" #define MSG_ILLEGAL_LS_LIMITS "Limite de 'ls' ilegal" #define MSG_ILLEGAL_FORCE_PASSIVE "IP forçado para conexőes passivas ilegal" #define MSG_ILLEGAL_RATIO "Proporçăo de envio/recebimento ilegal" #define MSG_ILLEGAL_UID_LIMIT "Limite de uid ilegal" #define MSG_ILLEGAL_OPTION "Opçăo de execuçăo desconhecida" #define MSG_LDAP_MISSING_BASE "Está faltando LDAPBaseDN no arquivo de configuraçăo LDAP" #define MSG_LDAP_WRONG_PARMS "Parâmetros LDAP incorretos" #define MSG_NEW_CONNECTION "Nova conexăo a partir de %s" #define MSG_WELCOME_TO "Bem-vindo a" #define MSG_MAX_USERS "%lu usuários (o máximo) já estăo conectados, desculpe" #define MSG_NB_USERS "Vocę é o usuário número %u de %u permitidos" #define MSG_WELCOME_TIME "Hora local agora é %02d:%02d. Porta do servidor: %u." #define MSG_ANONYMOUS_FTP_ONLY "Somente FTP anônimo é permitido aqui" #define MSG_RATIOS_EVERYONE "PROPORÇŐES ESTĂO HABILITADAS PARA TODOS :" #define MSG_RATIOS_ANONYMOUS "USUÁRIOS ANÔNIMOS ESTĂO SUJEITOS A UMA PROPORÇĂO DE UL/DL :" #define MSG_RATIOS_RULE "para receber %u Mb, é obrigatório enviar %u Mb de arquivos." #define MSG_INFO_IDLE_M "Vocę será desconectado após %lu minutos de inatividade." #define MSG_INFO_IDLE_S "Vocę será desconectado após %lu segundos de inatividade." #define MSG_CANT_READ_FILE "Desculpe, năo foi possível ler [%s]" #define MSG_LS_TRUNCATED "Resultado truncado em %u ocorręncias" #define MSG_LS_SUCCESS "%u ocorręncias no total" #define MSG_LOGOUT "Fim de sessăo." #define MSG_AUTH_FAILED_LOG "Autenticaçăo falhou para usuário [%s]" #define MSG_ILLEGAL_UMASK "Umask inválida" #define MSG_STANDALONE_FAILED "Năo foi possível iniciar um servidor independente" #define MSG_NO_ANONYMOUS_LOGIN "Este é um sistema privado - Năo é permitido usuário anônimo" #define MSG_ANONYMOUS_ANY_PASSWORD "Qualquer senha funcionará" #define MSG_MAX_USERS_IP "Conexőes demais (%lu) a partir deste IP" #define MSG_ACTIVE_DISABLED "Modo ativo está desabilitado" #define MSG_TRANSFER_SUCCESSFUL "Arquivo transferido com sucesso" #define MSG_NO_DISK_SPACE "Disco cheio - por favor envie arquivo mais tarde" #define MSG_OUT_OF_MEMORY "Sem memória" #define MSG_ILLEGAL_TRUSTED_IP "Endereço IP de confiança ilegal" #define MSG_NO_ASCII_RESUME "Reiniciar em modo ASCII é inseguro, por favor remova o arquivo antes" #define MSG_UNKNOWN_ALTLOG "Formato de log desconhecido" #define MSG_ACCOUNT_DISABLED "Năo é possível conectar como [%s] : conta desabilitada" #define MSG_SQL_WRONG_PARMS "Parâmetros SQL incorretos" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Arquivo de configuraçăo SQL inválido" #define MSG_SQL_MISSING_SERVER "Está faltando o servidor no arquivo de configuraçăo SQL" #define MSG_SQL_DOWN "O servidor SQL aparenta estar fora de operaçăo" #define MSG_ILLEGAL_QUOTA "Cota inválida" #define MSG_QUOTA_FILES "%llu arquivos usados (%d%%) - autorizado: %llu arquivos" #define MSG_QUOTA_SIZE "%llu Kbytes usados (%d%%) - autorizado: %llu Kb" #define MSG_QUOTA_EXCEEDED "Cota excedida : [%s] năo será armazenado" #define MSG_AUTH_UNKNOWN "Método de autenticaçăo desconhecido" #define MSG_PDB_BROKEN "Năo foi possível ler o arquivo indexado do puredb (ou um formato antigo foi detectado) - Experimente pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s é um apelido para %s." #define MSG_ALIASES_UNKNOWN "Apelido %s desconhecido." #define MSG_ALIASES_BROKEN_FILE "Arquivo de apelidos danificado" #define MSG_ALIASES_LIST "Os seguintes apelidos estăo disponíveis :" #define MSG_PERUSER_MAX "Năo posso aceitar mais do que %lu conexőes do mesmo usuário" #define MSG_IPV6_OK "Conexőes IPv6 também săo bem-vindas neste servidor" #define MSG_TLS_INFO "TLS: Habilitado %s com %s, criptografia de %d bits" #define MSG_TLS_WEAK "TLS: Criptografia muito fraca" #define MSG_TLS_NEEDED "Desculpe, sessőes sem criptografia năo săo aceitas neste servidor.\n" \ "Por favor reconecte-se usando mecanismos de segurança TLS." #define MSG_ILLEGAL_CHARSET "Conjunto de caracteres ilegal" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/ls.c0000644000175000017500000007377313450665410015004 0ustar rackeracke#include #include "ftpd.h" #include "ls_p.h" #include "bsd-glob.h" #include "messages.h" #include "dynamic.h" #include "ftpwho-update.h" #include "globals.h" #include "safe_rw.h" #ifdef WITH_TLS # include "tls.h" #endif #ifdef WITH_DMALLOC # include #endif static void wrstr(const int f, void * const tls_fd, const char *s) { static char outbuf[CONF_TCP_SO_SNDBUF]; static size_t outcnt; size_t l; if (s == NULL) { if (outcnt > (size_t) 0U) { #ifdef WITH_TLS if (tls_fd != NULL) { if (secure_safe_write(tls_fd, outbuf, outcnt) != (ssize_t) outcnt) { return; } } else #endif { (void) tls_fd; if (safe_write(f, outbuf, outcnt, -1) != (ssize_t) outcnt) { return; } } } outcnt = (size_t) 0U; return; } if ((l = strlen(s)) <= (size_t) 0U) { return; } if (l <= (sizeof outbuf - outcnt)) { memcpy(outbuf + outcnt, s, l); /* secure, see above */ outcnt += l; return; } if (outcnt < sizeof outbuf) { const size_t rest = sizeof outbuf - outcnt; memcpy(outbuf + outcnt, s, rest); /* secure, see above */ s += rest; l -= rest; } #ifdef WITH_TLS if (tls_fd != NULL) { if (secure_safe_write(tls_fd, outbuf, sizeof outbuf) != (ssize_t) sizeof outbuf) { return; } } else #endif { if (safe_write(f, outbuf, sizeof outbuf, -1) != (ssize_t) sizeof outbuf) { return; } } #ifdef WITH_TLS if (tls_fd != NULL) { while (l > sizeof outbuf) { if (secure_safe_write(tls_fd, s, sizeof outbuf) != (ssize_t) sizeof outbuf) { return; } s += sizeof outbuf; l -= sizeof outbuf; } } else #endif { while (l > sizeof outbuf) { if (safe_write(f, s, sizeof outbuf, -1) != (ssize_t) sizeof outbuf) { return; } s += sizeof outbuf; l -= sizeof outbuf; } } if (l > (size_t) 0U) { memcpy(outbuf, s, l); /* safe, l <= sizeof outbuf */ outcnt = l; } } #ifdef NO_FTP_USERS const char *getname(const uid_t uid) { static char number[11]; snprintf(number, sizeof number, "%-10d", uid); return number; } const char *getgroup(const gid_t gid) { static char number[11]; snprintf(number, sizeof number, "%-10d", gid); return number; } #else const char *getname(const uid_t uid) { struct userid *p; struct passwd *pwd = NULL; for (p = user_head; p; p = p->next) { if (p->uid == uid) { return p->name; } } if ( # ifndef ALWAYS_RESOLVE_IDS chrooted == 0 && # endif authresult.slow_tilde_expansion == 0) { pwd = getpwuid(uid); } if ((p = malloc(sizeof *p)) == NULL) { die_mem(); } p->uid = uid; if ((p->name = malloc((size_t) 11U)) == NULL) { die_mem(); } if (pwd != NULL) { if (SNCHECK(snprintf(p->name, (size_t) 11U, "%-10.10s", pwd->pw_name), (size_t) 11U)) { _EXIT(EXIT_FAILURE); } } else { if (SNCHECK(snprintf(p->name, (size_t) 11U, "%-10d", uid), (size_t) 11U)) { _EXIT(EXIT_FAILURE); } } p->next = user_head; user_head = p; return p->name; } /* eeeehm... sorry for names, ya know copy&paste :))) */ const char *getgroup(const gid_t gid) { struct groupid *p; struct group *pwd = NULL; for (p = group_head; p; p = p->next) { if (p->gid == gid) { return p->name; } } # ifndef ALWAYS_RESOLVE_IDS if (chrooted == 0) # endif { pwd = getgrgid(gid); } if ((p = malloc(sizeof *p)) == NULL) { die_mem(); } p->gid = gid; if ((p->name = malloc((size_t) 11U)) == NULL) { die_mem(); } if (pwd != NULL) { if (SNCHECK(snprintf(p->name, (size_t) 11U, "%-10.10s", pwd->gr_name), (size_t) 11U)) { _EXIT(EXIT_FAILURE); } } else { if (SNCHECK(snprintf(p->name, (size_t) 11U, "%-10d", gid), (size_t) 11U)) { _EXIT(EXIT_FAILURE); } } p->next = group_head; group_head = p; return p->name; } #endif static void addfile(const char *name, const char *suffix) { struct filename *p; unsigned int l; if (!name || !suffix) { return; } if (matches >= max_ls_files) { return; } matches++; l = (unsigned int) (strlen(name) + strlen(suffix)); if (l > colwidth) { colwidth = l; } if ((p = malloc(offsetof(struct filename, line) + l + 1U)) == NULL) { return; } if (SNCHECK(snprintf(p->line, l + 1U, "%s%s", name, suffix), l + 1U)) { _EXIT(EXIT_FAILURE); } if (tail != NULL) { tail->down = p; } else { head = p; } tail = p; filenames++; } /* listfile returns non-zero if the file is a directory */ static int listfile(const PureFileInfo * const fi, const char *name) { int rval = 0; struct stat st; struct tm *t; char suffix[2] = { 0, 0 }; char m[PATH_MAX + 1U]; const char *format; if (fi == NULL) { if (lstat(name, &st) < 0) { return 0; } } else { st.st_size = fi->size; st.st_mtime = fi->mtime; st.st_mode = fi->mode; st.st_nlink = fi->nlink; st.st_uid = fi->uid; st.st_gid = fi->gid; name = FI_NAME(fi); } #if defined(WITH_VIRTUAL_CHROOT) && defined(S_IFLNK) && defined(S_IFDIR) if (S_ISLNK(st.st_mode) && name[0] == '.' && name[1] == '.' && name[2] == 0) { st.st_mode &= ~S_IFLNK; st.st_mode |= S_IFDIR; } /* Hack to please some Windows clients that dislike ../ -> ../ */ #endif #if !defined(MINIMAL) && !defined(ALWAYS_SHOW_SYMLINKS_AS_SYMLINKS) if ( # ifndef ALWAYS_SHOW_RESOLVED_SYMLINKS broken_client_compat != 0 && # endif S_ISLNK(st.st_mode)) { struct stat sts; if (stat(name, &sts) == 0 && !S_ISLNK(sts.st_mode)) { st = sts; } } /* Show non-dangling symlinks as files/directories */ #endif #ifdef DISPLAY_FILES_IN_UTC_TIME t = gmtime((time_t *) &st.st_mtime); #else t = localtime((time_t *) &st.st_mtime); #endif if (t == NULL) { logfile(LOG_ERR, "{gm,local}gtime() for [%s]", name); return 0; } if (opt_F) { if (S_ISLNK(st.st_mode)) suffix[0] = '@'; else if (S_ISDIR(st.st_mode)) { suffix[0] = '/'; rval = 1; } else if (st.st_mode & 010101) { suffix[0] = '*'; } } if (opt_l) { strncpy(m, " ---------", (sizeof m) - (size_t) 1U); m[(sizeof m) - (size_t) 1U] = 0; switch (st.st_mode & S_IFMT) { case S_IFREG: m[0] = '-'; break; case S_IFLNK: m[0] = 'l'; break; /* readlink() here? */ case S_IFDIR: m[0] = 'd'; rval = 1; break; } if (m[0] != ' ') { char *alloca_nameline; const size_t sizeof_nameline = PATH_MAX + PATH_MAX + 128U; char timeline[6U]; if (st.st_mode & 0400) { m[1] = 'r'; } if (st.st_mode & 0200) { m[2] = 'w'; } if (st.st_mode & 0100) { m[3] = (char) (st.st_mode & 04000 ? 's' : 'x'); } else if (st.st_mode & 04000) { m[3] = 'S'; } if (st.st_mode & 040) { m[4] = 'r'; } if (st.st_mode & 020) { m[5] = 'w'; } if (st.st_mode & 010) { m[6] = (char) (st.st_mode & 02000 ? 's' : 'x'); } else if (st.st_mode & 02000) { m[6] = 'S'; } if (st.st_mode & 04) { m[7] = 'r'; } if (st.st_mode & 02) { m[8] = 'w'; } if (st.st_mode & 01) { m[9] = (char) (st.st_mode & 01000 ? 't' : 'x'); } else if (st.st_mode & 01000) { m[9] = 'T'; } if (time(NULL) - st.st_mtime > 180 * 24 * 60 * 60) { if (SNCHECK(snprintf(timeline, sizeof timeline, "%5d", t->tm_year + 1900), sizeof timeline)) { _EXIT(EXIT_FAILURE); } } else { if (SNCHECK(snprintf(timeline, sizeof timeline, "%02d:%02d", t->tm_hour, t->tm_min), sizeof timeline)) { _EXIT(EXIT_FAILURE); } } if ((alloca_nameline = ALLOCA(sizeof_nameline)) == NULL) { return 0; } if (st.st_size < 10000000000U) { format = "%s %4u %s %s %10llu %s %2d %s %s"; } else { format = "%s %4u %s %s %18llu %s %2d %s %s"; } if (SNCHECK(snprintf(alloca_nameline, sizeof_nameline, format, m, (unsigned int) st.st_nlink, getname(st.st_uid), getgroup(st.st_gid), (unsigned long long) st.st_size, months[t->tm_mon], t->tm_mday, timeline, name), sizeof_nameline)) { ALLOCA_FREE(alloca_nameline); _EXIT(EXIT_FAILURE); } if (S_ISLNK(st.st_mode)) { char *p = alloca_nameline + strlen(alloca_nameline); { ssize_t sx; if ((sx = readlink(name, m, sizeof m - 1U)) > 0) { m[sx] = 0; } else { m[0] = m[1] = '.'; m[2] = 0; } } suffix[0] = 0; if (opt_F && stat(name, &st) == 0) { if (S_ISLNK(st.st_mode)) { suffix[0] = '@'; } else if (S_ISDIR(st.st_mode)) { suffix[0] = '/'; } else if (st.st_mode & 010101) { suffix[0] = '*'; } } /* 2 * PATH_MAX + gap should be enough, but be paranoid... */ if (SNCHECK (snprintf(p, (sizeof_nameline) - strlen(alloca_nameline), " -> %s", m), (sizeof_nameline) - strlen(alloca_nameline))) { ALLOCA_FREE(alloca_nameline); _EXIT(EXIT_FAILURE); } } addfile(alloca_nameline, suffix); ALLOCA_FREE(alloca_nameline); } /* hide non-downloadable files */ } else { if (S_ISREG(st.st_mode) || S_ISDIR(st.st_mode) || S_ISLNK(st.st_mode)) { addfile(name, suffix); } } return rval; } static void outputfiles(int f, void * const tls_fd) { unsigned int n; struct filename *p; struct filename *q; if (!head) { return; } tail->down = NULL; tail = NULL; colwidth = (colwidth | 7U) + 1U; if (opt_l != 0 || opt_C == 0) { colwidth = 75U; } /* set up first column */ p = head; p->top = 1; if (colwidth > 75U) { n = filenames; } else { n = (filenames + (75U / colwidth) - 1U) / (75U / colwidth); } while (n && p) { p = p->down; if (p != NULL) { p->top = 0; } n--; } /* while there's a neighbour to the right, point at it */ q = head; while (p) { p->top = q->top; q->right = p; q = q->down; p = p->down; } /* some are at the right end */ while (q) { q->right = NULL; q = q->down; } /* don't want wraparound, do we? */ p = head; while (p && p->down && !p->down->top) { p = p->down; } if (p && p->down) { p->down = NULL; } /* print each line, which consists of each column */ p = head; while (p) { q = p; p = p->down; while (q) { char pad[6]; char *tmp = (char *) q; if (q->right) { memset(pad, '\t', sizeof pad - 1U); pad[(sizeof pad) - 1] = 0; pad[(colwidth + 7U - strlen(q->line)) / 8] = 0; } else { pad[0] = '\r'; pad[1] = '\n'; pad[2] = 0; } wrstr(f, tls_fd, q->line); wrstr(f, tls_fd, pad); q = q->right; free(tmp); tmp = NULL; } } /* reset variables for next time */ head = tail = NULL; colwidth = 0U; filenames = 0U; } /* functions to to sort for qsort() */ static int cmp(const void * const a, const void * const b) { return strcmp(FI_NAME((const PureFileInfo *) a), FI_NAME((const PureFileInfo *) b)); } static int cmp_r(const void * const a, const void * const b) { return strcmp(FI_NAME((const PureFileInfo *) b), FI_NAME((const PureFileInfo *) a)); } static int cmp_t(const void * const a, const void * const b) { if (((const PureFileInfo *) a)->mtime < ((const PureFileInfo *) b)->mtime) { return 1; } if (((const PureFileInfo *) a)->mtime > ((const PureFileInfo *) b)->mtime) { return -1; } return 0; } static int cmp_rt(const void * const a, const void * const b) { return cmp_t(b, a); } static int cmp_S(const void * const a, const void * const b) { if (((const PureFileInfo *) a)->size < ((const PureFileInfo *) b)->size) { return 1; } if (((const PureFileInfo *) a)->size > ((const PureFileInfo *) b)->size) { return -1; } return 0; } static int cmp_rS(const void * const a, const void * const b) { return cmp_S(b, a); } static PureFileInfo *sreaddir(char **names_pnt) { struct stat st; DIR *d; struct dirent *de; PureFileInfo *files_info; PureFileInfo *file_info; size_t files_info_size; size_t files_info_counter = (size_t) 0U; char *names; size_t names_size; size_t names_counter = (size_t) 0U; size_t name_len; int (*cmp_func)(const void * const, const void * const); if ((d = opendir(".")) == NULL) { return NULL; } names_size = CHUNK_SIZE; if ((names = malloc(names_size)) == NULL) { closedir(d); return NULL; } files_info_size = CHUNK_SIZE / sizeof *files_info; if ((files_info = malloc(files_info_size * sizeof *files_info)) == NULL) { closedir(d); free(names); return NULL; } while ((de = readdir(d)) != NULL) { if (checkprintable(de->d_name) != 0 || lstat(de->d_name, &st) < 0) { continue; } name_len = strlen(de->d_name) + (size_t) 1U; while (names_counter + name_len >= names_size) { char *new_names; if (name_len >= CHUNK_SIZE) { names_size += name_len + CHUNK_SIZE; } else { names_size += CHUNK_SIZE; } if ((new_names = realloc(names, names_size)) == NULL) { nomem: closedir(d); free(names); free(files_info); return NULL; } names = new_names; } while ((files_info_counter + (size_t) 1U) >= files_info_size) { PureFileInfo *new_files_info; files_info_size += (CHUNK_SIZE / sizeof *files_info); if ((new_files_info = realloc(files_info, files_info_size * sizeof *files_info)) == NULL) { goto nomem; } files_info = new_files_info; } memcpy(&names[names_counter], de->d_name, name_len); /* safe */ names[names_counter + name_len - 1] = 0; file_info = &files_info[files_info_counter]; file_info->names_pnt = names_pnt; file_info->name_offset = names_counter; file_info->size = st.st_size; file_info->mtime = st.st_mtime; file_info->mode = st.st_mode; file_info->nlink = st.st_nlink; file_info->uid = st.st_uid; file_info->gid = st.st_gid; names_counter += name_len; files_info_counter++; } closedir(d); files_info[files_info_counter].name_offset = (size_t) -1; *names_pnt = names; if (opt_t) { if (opt_r) { cmp_func = cmp_rt; } else { cmp_func = cmp_t; } } else if (opt_S) { if (opt_r) { cmp_func = cmp_rS; } else { cmp_func = cmp_S; } } else if (opt_r) { cmp_func = cmp_r; } else { cmp_func = cmp; } qsort(files_info, files_info_counter, sizeof files_info[0], cmp_func); return files_info; } /* have to change to the directory first (speed hack for -R) */ static void listdir(unsigned int depth, int f, void * const tls_fd, const char *name) { PureFileInfo *dir; char *names; PureFileInfo *s; PureFileInfo *r; int d; if (depth >= max_ls_depth || matches >= max_ls_files) { return; } if ((dir = sreaddir(&names)) == NULL) { addreply(226, MSG_CANT_READ_FILE, name); return; } s = dir; while (s->name_offset != (size_t) -1) { d = 0; if (FI_NAME(s)[0] != '.') { d = listfile(s, NULL); } else if (opt_a) { if (FI_NAME(s)[1] == 0 || (FI_NAME(s)[1] == '.' && FI_NAME(s)[2] == 0)) { listfile(s, NULL); } else { d = listfile(s, NULL); } } if (!d) { s->name_offset = (size_t) -1; } s++; } outputfiles(f, tls_fd); r = dir; while (opt_R && r != s) { if (r->name_offset != (size_t) -1 && !chdir(FI_NAME(r))) { char *alloca_subdir; const size_t sizeof_subdir = PATH_MAX + 1U; if ((alloca_subdir = ALLOCA(sizeof_subdir)) == NULL) { goto toomany; } if (SNCHECK(snprintf(alloca_subdir, sizeof_subdir, "%s/%s", name, FI_NAME(r)), sizeof_subdir)) { goto nolist; } wrstr(f, tls_fd, "\r\n\r\n"); wrstr(f, tls_fd, alloca_subdir); wrstr(f, tls_fd, ":\r\n\r\n"); listdir(depth + 1U, f, tls_fd, alloca_subdir); nolist: ALLOCA_FREE(alloca_subdir); if (matches >= max_ls_files) { goto toomany; } if (chdir("..")) { /* defensive in the extreme... */ if (chdir(wd) || chdir(name)) { /* someone rmdir()'d it? */ die(421, LOG_ERR, "chdir: %s", strerror(errno)); } } } r++; } toomany: free(names); free(dir); names = NULL; } static char *unescape_and_return_next_file(char * const str) { char *pnt = str; signed char seen_backslash = 0; while (*pnt != 0) { if (seen_backslash == 0) { if (*pnt == '\\') { seen_backslash = 1; } else if (*pnt == ' ') { *pnt++ = 0; if (*pnt != 0) { return pnt; } break; } pnt++; } else { seen_backslash = 0; if (*pnt == ' ' || *pnt == '\\' || *pnt == '{' || *pnt == '}') { memmove(pnt - 1, pnt, strlen(pnt) + (size_t) 1U); } } } return NULL; } void dolist(char *arg, const int on_ctrl_conn) { int c; void *tls_fd = NULL; matches = 0U; opt_a = opt_C = opt_d = opt_F = opt_R = opt_r = opt_t = opt_S = 0; opt_l = 1; if (force_ls_a != 0) { opt_a = 1; } if (arg != NULL) { while (isspace((unsigned char) *arg)) { arg++; } while (*arg == '-') { while (arg++ && isalnum((unsigned char) *arg)) { switch (*arg) { case 'a': opt_a = 1; break; case 'l': opt_l = 1; opt_C = 0; break; case '1': opt_l = opt_C = 0; break; case 'C': opt_l = 0; opt_C = 1; break; case 'F': opt_F = 1; break; case 'R': opt_R = 1; break; case 'd': opt_d = 1; break; case 'r': opt_r = 1; break; case 't': opt_t = 1; opt_S = 0; break; case 'S': opt_S = 1; opt_t = 0; break; } } while (isspace((unsigned char) *arg)) { arg++; } } } if (on_ctrl_conn == 0) { opendata(); if ((c = xferfd) == -1) { return; } doreply(); #ifdef WITH_TLS if (data_protection_level == CPL_PRIVATE) { tls_init_data_session(xferfd, passive); tls_fd = tls_data_cnx; } #endif } else { /* STAT command */ c = clientfd; #ifdef WITH_TLS if (tls_cnx != NULL) { secure_safe_write(tls_cnx, "213-STAT" CRLF, sizeof "213-STAT" CRLF - 1U); tls_fd = tls_cnx; } else #endif { safe_write(c, "213-STAT" CRLF, sizeof "213-STAT" CRLF - 1U, -1); } } if (arg != NULL && *arg != 0) { int justone; justone = 1; /* just one argument, so don't print dir name */ do { glob_t g; int a; char *endarg; if ((endarg = unescape_and_return_next_file(arg)) != NULL) { justone = 0; } /* Expand ~ here if needed */ alarm(GLOB_TIMEOUT); memset(&g, 0, sizeof g); a = sglob(arg, opt_a ? (GLOB_PERIOD | GLOB_LIMIT) : GLOB_LIMIT, NULL, &g, max_ls_files + 2, max_ls_depth * 2); alarm(0); if (a == 0) { char **path; if (g.gl_pathc <= 0) { path = NULL; } else { path = g.gl_pathv; } if (path != NULL && path[0] != NULL && path[1] != NULL) { justone = 0; } while (path != NULL && *path != NULL) { struct stat st; if (stat(*path, &st) == 0) { if (opt_d || !(S_ISDIR(st.st_mode))) { listfile(NULL, *path); **path = 0; } } else { **path = 0; } path++; } outputfiles(c, tls_fd); /* in case of opt_C */ path = g.gl_pathv; while (path != NULL && *path != NULL) { if (matches >= max_ls_files) { break; } if (**path != 0) { if (!justone) { wrstr(c, tls_fd, "\r\n\r\n"); wrstr(c, tls_fd, *path); wrstr(c, tls_fd, ":\r\n\r\n"); } if (!chdir(*path)) { listdir(0U, c, tls_fd, *path); if (chdir(wd)) { die(421, LOG_ERR, "chdir: %s", strerror(errno)); } } } path++; } } else { if (a == GLOB_NOSPACE) { addreply(226, MSG_GLOB_NO_MEMORY, arg); addreply_noformat(0, MSG_PROBABLY_DENIED); } else if (a == GLOB_ABEND) { addreply(226, MSG_GLOB_READ_ERROR, arg); } else if (a != GLOB_NOMATCH) { addreply(226, MSG_GLOB_READ_ERROR, arg); addreply_noformat(0, MSG_PROBABLY_DENIED); } } globfree(&g); arg = endarg; } while (arg != NULL); } else { if (opt_d) { listfile(NULL, "."); } else { listdir(0U, c, tls_fd, "."); } outputfiles(c, tls_fd); } wrstr(c, tls_fd, NULL); if (on_ctrl_conn == 0) { #ifdef WITH_TLS closedata(); #endif close(c); } else { addreply_noformat(213, "End."); goto end; } if (opt_a || opt_C || opt_d || opt_F || opt_l || opt_r || opt_R || opt_t || opt_S) addreply(0, "Options: %s%s%s%s%s%s%s%s%s", opt_a ? "-a " : "", opt_C ? "-C " : "", opt_d ? "-d " : "", opt_F ? "-F " : "", opt_l ? "-l " : "", opt_r ? "-r " : "", opt_R ? "-R " : "", opt_S ? "-S " : "", opt_t ? "-t" : ""); if (matches >= max_ls_files) { addreply(226, MSG_LS_TRUNCATED, matches); } else { addreply(226, MSG_LS_SUCCESS, matches); } end: if (chdir(wd)) { die(421, LOG_ERR, "chdir: %s", strerror(errno)); } } void donlst(const char *base) { char line[PATH_MAX + 3U]; DIR *dir; void *tls_fd = NULL; struct dirent *de; size_t name_len; unsigned int matches = 0; int c; int base_has_trailing_slash = 0; if (*base != 0 && chdir(base) != 0) { if (*base++ == '-') { while (!isspace((unsigned char) *base++)); while (isspace((unsigned char) *base++)); if (*base != 0 && chdir(base) != 0) { addreply_noformat(550, MSG_STAT_FAILURE2); return; } } else { addreply_noformat(550, MSG_STAT_FAILURE2); return; } } if (*base !=0 && base[strlen(base) - 1U] == '/') { base_has_trailing_slash = 1; } if ((dir = opendir(".")) == NULL) { addreply_noformat(550, MSG_STAT_FAILURE2); goto bye; } opendata(); if ((c = xferfd) == -1) { goto bye; } doreply(); #ifdef WITH_TLS if (data_protection_level == CPL_PRIVATE) { tls_init_data_session(xferfd, passive); tls_fd = tls_data_cnx; } #endif while ((de = readdir(dir)) != NULL) { if (checkprintable(de->d_name) != 0) { continue; } name_len = strlen(de->d_name); if (name_len > sizeof line - 3U) { continue; } memcpy(line, de->d_name, name_len); line[name_len] = '\r'; line[name_len + 1] = '\n'; line[name_len + 2] = 0; if (*base) { wrstr(c, tls_fd, base); if (base_has_trailing_slash == 0) { wrstr(c, tls_fd, "/"); } } wrstr(c, tls_fd, line); matches++; if (matches >= max_ls_files) { break; } } closedir(dir); wrstr(c, tls_fd, NULL); closedata(); if (matches >= max_ls_files) { addreply(226, MSG_LS_TRUNCATED, matches); } else { addreply(226, MSG_LS_SUCCESS, matches); } bye: if (chdir(wd) != 0) { die(421, LOG_ERR, "chdir: %s", strerror(errno)); } } void domlsd(const char *base) { char line[PATH_MAX + 1]; DIR *dir = NULL; void *tls_fd = NULL; struct dirent *de; unsigned int matches = 0; int c; if (*base != 0 && chdir(base) != 0) { if (*base++ == '-') { while (!isspace((unsigned char) *base++)); while (isspace((unsigned char) *base++)); if (*base != 0 && chdir(base) != 0) { addreply_noformat(550, MSG_STAT_FAILURE2); return; } } else { addreply_noformat(550, MSG_STAT_FAILURE2); return; } } if ((dir = opendir(".")) == NULL) { addreply_noformat(550, MSG_STAT_FAILURE2); goto bye; } opendata(); if ((c = xferfd) == -1) { goto bye; } doreply(); #ifdef WITH_TLS if (data_protection_level == CPL_PRIVATE) { tls_init_data_session(xferfd, passive); tls_fd = tls_data_cnx; } #endif while ((de = readdir(dir)) != NULL) { if (checkprintable(de->d_name) != 0 || modernformat(de->d_name, line, sizeof line, "") < 0) { continue; } wrstr(c, tls_fd, line); wrstr(c, tls_fd, "\r\n"); matches++; if (matches >= max_ls_files) { break; } } wrstr(c, tls_fd, NULL); closedata(); if (matches >= max_ls_files) { addreply(226, MSG_LS_TRUNCATED, matches); } else { addreply(226, MSG_LS_SUCCESS, matches); } bye: if (dir != NULL) { closedir(dir); } if (chdir(wd) != 0) { die(421, LOG_ERR, "chdir: %s", strerror(errno)); } } pure-ftpd-1.0.49.orig/src/log_pam.h0000644000175000017500000000052013350542502015760 0ustar rackeracke#ifndef __LOG_PAM_H__ #define __LOG_PAM_H__ 1 void pw_pam_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer); #define pw_pam_parse NULL #define pw_pam_exit NULL #endif pure-ftpd-1.0.49.orig/src/messages_zh_tw.h0000644000175000017500000002620713446174132017404 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "šOŽÉ" #define MSG_CAPABILITIES "ľLŞk¤Á´ŤŠĘŻŕ" #define MSG_CLIENT_CLOSED_CNX "ĽÎ¤áşÝĂöłŹłs˝u" #define MSG_CLIENT_READ_ERR "ąqĽÎ¤áşÝĹŞ¨úľoĽÍżůť~" #define MSG_CANT_OPEN_CNX "ľLŞkś}ąŇłs˝u" #define MSG_CANT_CREATE_DATA_SOCKET "ľLŞkŤŘĽß¸ęŽĆąľ¤f" #define MSG_DEBUG_CLIENT_IS "ĽÎ¤áşÝŚě§}ŹO" #define MSG_SYNTAX_ERROR_IP "ťyŞkżůť~ŠóIPŚě§}" #define MSG_PORT_SUCCESSFUL "PORTŠRĽOOK" #define MSG_ONLY_IPV4V6 "śČ¤ä´ŠIPv4ťPIPv6 (1,2)" #define MSG_ONLY_IPV4 "śČ¤ä´ŠIPv4 (1)" #define MSG_TIMEOUT_PARSER "šOŽÉ - ¤UŚ^¸Ő¸ŐşVÁäŽÉłtŤ×§Ö¤@ÂI" #define MSG_LINE_TOO_LONG "ŠRĽOŚćšLŞř" #define MSG_LOG_OVERFLOW "ĽÎ¤ášÁ¸Ő­nˇ¸şĄŠRĽOŚć˝w˝Ä°Ď" #define MSG_GOODBYE "ŚA¨ŁĄCąz¤WśÇ%llu¨Ă¤U¸ü%llu kbytes." #define MSG_DEBUG_COMMAND "ŠRĽO" #define MSG_IS_YOUR_CURRENT_LOCATION "ŹOązĽŘŤeŞşŚě¸m" #define MSG_NOT_LOGGED_IN "ąz¨ĂĽźľn¤J" #define MSG_AUTH_UNIMPLEMENTED "ŚwĽţÂXĽRśľĽźšęŹI" #define MSG_NO_FILE_NAME "ľLŔɎ׌WşŮ" #define MSG_NO_DIRECTORY_NAME "ľLĽŘżýŚWşŮ" #define MSG_NO_RESTART_POINT "ľL­Ťˇsś}ŠlÂI" #define MSG_ABOR_SUCCESS "ABOR OK" #define MSG_MISSING_ARG "żňĽ˘°ŃźĆ" #define MSG_GARBAGE_FOUND "°ŃźĆ­ČŤáŚłľLĽÎŞşŚrŚę" #define MSG_VALUE_TOO_LARGE "°ŃźĆ­ČšL¤j" #define MSG_IDLE_TIME "ś˘¸mŽÉśĄł]ʰ %lu Źí" #define MSG_SITE_HELP "¤UŚCŞşSITEŠRĽOłQť{Ľi" #define MSG_BAD_CHMOD "ľLŽÄŞşĹv­­" #define MSG_UNKNOWN_EXTENSION "ŹO¤ŁŠúŞşÂXĽRśľ" #define MSG_XDBG_OK "XDBGŠRĽOOKĄA°Łżůľ{Ť×˛{ŚbŹO %d" #define MSG_UNKNOWN_COMMAND "¤ŁŠúŞşŠRĽO" #define MSG_TIMEOUT_NOOP "šOŽÉ (¤w %lu ŹíľLžŢ§@)" #define MSG_TIMEOUT_DATA "šOŽÉ (¤w %lu ŹíľLˇs¸ęŽĆ)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "ąz¤w¸gľn¤J" #define MSG_ANY_PASSWORD "ĽôŚóąK˝XłŁĽiĽÎ" #define MSG_ANONYMOUS_LOGGED "°ÎŚW¨ĎĽÎŞĚľn¤J" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "°ÎŚW¨ĎĽÎŞĚľn¤J¨ěľęŔŔFTP" #define MSG_USER_OK "¨ĎĽÎŞĚ %s OK. ťÝ­nąK˝X." #define MSG_CANT_DO_TWICE "ŚbĽŘŤełs˝u´ÁśĄ¤ŁŻŕłoźË°ľ" #define MSG_UNABLE_SECURE_ANON "ľLŞkŤŘĽßŚwĽţ°ÎŚWFTP" #define MSG_BANDWIDTH_RESTRICTED "ązŞşŔWźe¨ĎĽÎ¨ü­­¨î" #define MSG_NO_PASSWORD_NEEDED "ĽôŚóąK˝XłŁĽiĽÎ" #define MSG_NOTRUST "ŠęşpĄA§ÚľLŞkŤHĽôąz" #define MSG_WHOAREYOU "˝Đ§iśD§Ú§AŹO˝Ö" #define MSG_AUTH_FAILED "ĹçĂŇĽ˘ąŃĄAŠęşp" #define MSG_AUTH_TOOMANY "ĹçĂŇĽ˘ąŃ¤ÓŚhڏ" #define MSG_NO_HOMEDIR "¨SŚłŽaĽŘżý - ¨úŽř" #define MSG_NO_HOMEDIR2 "%s ¤ŁŚsŚbŠÎľLŞk¨ěšF" #define MSG_START_SLASH "ś}ŠlŠó /" #define MSG_USER_GROUP_ACCESS "¨ĎĽÎŞĚ %s Śł¸s˛ŐŚs¨úŠó" #define MSG_FXP_SUPPORT "ło­ÓŚřŞAžš¤ä´ŠFXPśÇżé" #define MSG_RATIO "ązĽ˛śˇżíŚu %u:%u (UL/DL) ¤ń˛v" #define MSG_CHROOT_FAILED "ľLŞkł]ŠwŚwĽţŞşchroot() jail" #define MSG_CURRENT_DIR_IS "OK. ĽŘŤeŞşĽŘżýŹO %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. ĽŘŤe­­¨îŞşĽŘżýŹO %s" #define MSG_IS_NOW_LOGGED_IN "%s ˛{Śbľn¤J" #define MSG_CANT_CHANGE_DIR "ľLŞkĹܧóĽŘżý¨ě %s" #define MSG_PATH_TOO_LONG "¸ôŽ|¤ÓŞř" #define MSG_CANT_PASV "ąz¤ŁŻŕŚbIPv6łs˝u¨ĎĽÎPASVĄC˝Đ§ďĽÎEPSVĄC" #define MSG_CANT_PASSIVE "ľLŞkś}ąŇłQ°ĘŚĄłs˝u" #define MSG_PORTS_BUSY "ŠŇŚłŤOŻdŞşTCP portsłŁĽżŚŁ¸L¤¤" #define MSG_GETSOCKNAME_DATA "ľLŞkżëĂŃĽťž÷¸ęŽĆąľ¤f" #define MSG_GETPEERNAME "ľLŞkżëĂŃĽťž÷ąľ¤f" #define MSG_INVALID_IP "ŠęşpĄAľšŞşŹOľLŽÄŞşŚě§}" #define MSG_NO_EPSV "˝Đ¨ĎĽÎ˛ĹŚXIPv6¨Ă¤ä´ŠEPSVŞşĽÎ¤áşÝ" #define MSG_BAD_PORT "ŠęşpĄAľLŞkłs˝u¨ě ports < 1024" #define MSG_NO_FXP "§Ú¤ŁŻŕś}ąŇłs˝u¨ě %s (śČ %s)" #define MSG_FXP "FXPśÇżé: ąq %s ¨ě %s" #define MSG_NO_DATA_CONN "ľL¸ęŽĆłs˝u" #define MSG_ACCEPT_FAILED "łs˝uľLŞkłQąľ¨ü" #define MSG_ACCEPT_SUCCESS "ąľ¨ü¸ęŽĆłs˝u" #define MSG_CNX_PORT_FAILED "ľLŞkś}ąŇ¸ęŽĆłs˝u¨ěport %d" #define MSG_CNX_PORT "łs˝u¨ěport %d" #define MSG_ANON_CANT_MKD "ŠęşpĄA¤Ł­ă°ÎŚW¨ĎĽÎŞĚŤŘĽßĽŘżý" #define MSG_ANON_CANT_RMD "ŠęşpĄA¤Ł­ă°ÎŚW¨ĎĽÎŞĚ˛ž°ŁĽŘżý" #define MSG_ANON_CANT_RENAME "¤Ł­ă°ÎŚW¨ĎĽÎŞĚˇh˛ž/§óŚWŔÉŽ×" #define MSG_ANON_CANT_CHANGE_PERMS "°ÎŚW¨ĎĽÎŞĚ¤ŁŻŕĹܧóĹv­­" #define MSG_GLOB_NO_MEMORY "§Îڍ %s ŽÉĄA°OžĐĹ餣¨Ź" #define MSG_PROBABLY_DENIED "(łoĽiŻŕˇN¨ý \"Ĺv­­łQŠÚ\")" #define MSG_GLOB_READ_ERROR "§Îڍ %s ŽÉľoĽÍĹŞ¨úżůť~" #define MSG_GLOB_NO_MATCH "¨SŚł˛ĹŚXŞş %s ĄAŠó %s ¤¤" #define MSG_CHMOD_FAILED "¤ŁŻŕĹܧó %s Ĺv­­" #define MSG_CHMOD_SUCCESS " %s Ĺv­­¤wĹܧó" #define MSG_CHMOD_TOTAL_FAILURE "ŠęşpĄA§ÚľLŞkĹܧóĽôŚóĹv­­" #define MSG_ANON_CANT_DELETE "°ÎŚW¨ĎĽÎŞĚ¤ŁŻŕ§R°ŁŔÉŽ×" #define MSG_ANON_CANT_OVERWRITE "°ÎŚW¨ĎĽÎŞĚ¤ŁŻŕÂĐźg˛{ŚsŞşŔÉŽ×" #define MSG_DELE_FAILED "ľLŞk§R°Ł %s" #define MSG_DELE_SUCCESS "§R°Ł %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "¨SŚł§R°ŁŔÉŽ×" #define MSG_LOAD_TOO_HIGH "ˇíązłs˝uŽÉ­t¸üŹO %3.2f ĄC­t¸üŚpŚš°ŞŽÉĄA§Ú­Ě¤Ł­ă°ÎŚW¨ĎĽÎŞĚ¤U¸üĄC\n¤WśÇŤhłŁŹOĽiĽHŞş" #define MSG_OPEN_FAILURE "ľLŞkś}ąŇ %s" #define MSG_OPEN_FAILURE2 "ľLŞkś}ąŇ¨ş­ÓŔÉŽ×" #define MSG_STAT_FAILURE "ľLŞk§ä¨ěŔɎפj¤p" #define MSG_STAT_FAILURE2 "ľLŞkŔËŹdŔɎתşŚsŚbŠĘ" #define MSG_REST_TOO_LARGE_FOR_FILE "°wšďŔɎפj¤p %lldŽÉĄA­Ťˇsś}Šloffset %lld ˇ|šL¤jĄC" #define MSG_REST_RESET "offset­Ťł]ʰ 0 ­Ťˇsś}Šl" #define MSG_NOT_REGULAR_FILE "§ÚĽuŻŕ§ě¨ú¤@ŻëŔÉŽ×" #define MSG_NOT_MODERATED "ŚšŔɼѰΌW¨ĎĽÎŞĚ¤WśÇĄC\nÁ٨SŚłłQݏĽxşŢ˛z­űŽÖ­ă¨Ń¤U¸üĄC" #define MSG_RATIO_DENIAL "ŠęşpĄA¤WśÇ/¤U¸ü˛vŹO %u:%u ĄC\nązĽŘŤe¤WśÇ %llu Kb ¤U¸ü %llu KbĄC\n˝Đ¤WśÇ¤@¨ÇŚnŞFŚčľMŤáąßÂIŚAšÁ¸Ő§ě¨úĄC" #define MSG_NO_MORE_TO_DOWNLOAD "¤w¨SŞFŚčĽi¤U¸ü" #define MSG_WINNER "šq¸ŁŹOązŞşŞB¤ÍĄCŤHĽôšq¸Ł" #define MSG_KBYTES_LEFT "łŃ %.1f kbytes­n¤U¸ü" #define MSG_ABORTED "śÇżé¤¤¤î" #define MSG_DATA_WRITE_FAILED "¸ęŽĆłs˝uźg¤JŽÉľoĽÍżůť~" #define MSG_DATA_READ_FAILED "¸ęŽĆłs˝uĹŞ¨úŽÉľoĽÍżůť~" #define MSG_MMAP_FAILED "ľLŞkąNŔÉŽ×mapśi°OžĐĹé" #define MSG_WRITE_FAILED "źg¤JŔɎ׎ɾoĽÍżůť~" #define MSG_TRANSFER_RATE_M "%.3f Źí (¨ěĽŘŤe),¨CŹí %.2f Mbytes" #define MSG_TRANSFER_RATE_K "%.3f Źí (¨ěĽŘŤe),¨CŹí %.2f Kbytes" #define MSG_TRANSFER_RATE_B "%.3f Źí (¨ěĽŘŤe),¨CŹí %.2f bytes" #define MSG_SPACE_FREE_M "%.1f Mbytes łŃžlľwşĐŞĹśĄ" #define MSG_SPACE_FREE_K "%f Kbytes łŃžlľwşĐŞĹśĄ" #define MSG_DOWNLOADED "¤w¤U¸ü" #define MSG_REST_NOT_NUMERIC "RESTťÝ­nźĆŚr°ŃźĆ" #define MSG_REST_ASCII_STRICT "ŚbASCIIźŇŚĄŚ^ŔłźĐ°OĽ˛śˇŹO 0" #define MSG_REST_ASCII_WORKAROUND "­Ťˇsś}ŠlŠó %lldĄCŚýŹO§Ú­ĚŚbASCIIźŇŚĄ" #define MSG_REST_SUCCESS "­Ťˇsś}ŠlŠó %lld" #define MSG_SANITY_DIRECTORY_FAILURE "¸TĽÎŞşĽŘżýŚWşŮ" #define MSG_SANITY_FILE_FAILURE "¸TĽÎŞşŔÉŚW: %s" #define MSG_MKD_FAILURE "ľLŞkŤŘĽßĽŘżý" #define MSG_MKD_SUCCESS "ŤŘĽßĽŘżýOK" #define MSG_RMD_FAILURE "ľLŞk˛ž°ŁĽŘżý" #define MSG_RMD_SUCCESS "˛ž°ŁĽŘżýOK" #define MSG_TIMESTAMP_FAILURE "ľLŞk¨úąoŽÉśĄÂW°O" #define MSG_MODE_ERROR "Ľu¤ä´ŠASCII¤ÎbinaryźŇŚĄ" #define MSG_CREATE_FAILURE "ľLŞkŤŘĽßŔÉŽ×" #define MSG_ABRT_ONLY "ˇí¤WśÇŽÉABRTŹO°ß¤@ŻŕĽÎŞşŠRĽO" #define MSG_UPLOAD_PARTIAL "łĄĽ÷¤WśÇ" #define MSG_REMOVED "˛ž°Ł¤F" #define MSG_UPLOADED "¤WśÇ¤F" #define MSG_GMTIME_FAILURE "ľLŞk¨úąoˇíŚaŽÉśĄ" #define MSG_TYPE_8BIT_FAILURE "Ľu¤ä´Š8-bit bytesĄA§Ú­Ě¤ŁŹOŚb¤QŚ~ŤeŞşŚ~ĽN" #define MSG_TYPE_UNKNOWN "¤ŁŠúŞşTYPE" #define MSG_TYPE_SUCCESS "TYPEĽŘŤeŹO" #define MSG_STRU_FAILURE "Ľu¤ä´ŠF(ile)" #define MSG_MODE_FAILURE "˝Đ¨ĎĽÎS(tream)źŇŚĄ" #define MSG_RENAME_ABORT "¤¤¤î¤§ŤeŞş§óŚWžŢ§@" #define MSG_RENAME_RNFR_SUCCESS "RNFRąľ¨ü - ŔɎ׌sŚbĄAˇÇłĆ¨ěĽŘŞşŚa" #define MSG_FILE_DOESNT_EXIST "ŠęşpĄAŔÉŽ×¤ŁŚsŚb" #define MSG_RENAME_ALREADY_THERE "RENAMEĽ˘ąŃ - ĽŘŞşŔɎפw¸gŚsŚb" #define MSG_RENAME_NORNFR "RNTOŤeťÝ­nRNFR" #define MSG_RENAME_FAILURE "§óŚW/˛ž°ĘĽ˘ąŃ" #define MSG_RENAME_SUCCESS "ŔɎקóŚW/˛ž°ĘOK" #define MSG_NO_SUPERSERVER "˝ĐŚbsuper-server (like tcpserver)¤¤°őŚćpure-ftpd" #define MSG_NO_FTP_ACCOUNT "ľLŞk§ä¨ě'ftp'ąb¸š" #define MSG_CONF_ERR "˛ŐşAł]Šwżůť~" #define MSG_NO_VIRTUAL_FILE "żňĽ˘ľęŔŔ¨ĎĽÎŞĚŔÉŚW" #define MSG_ILLEGAL_THROTTLING "¤ŁŚXŞkŞş¸`Źy­Č" #define MSG_ILLEGAL_TRUSTED_GID "¤ŁŚXŞkŞşchrootŤHĽôgid" #define MSG_ILLEGAL_USER_LIMIT "¤ŁŚXŞkŞş¨ĎĽÎŞĚ­­¨î" #define MSG_ILLEGAL_FACILITY "¤ŁŠúŞş°Ożýł]ŹIŚWşŮ" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "ľLŽÄŞşLDAP˛ŐşAŔÉŽ×" #define MSG_ILLEGAL_LOAD_LIMIT "¤ŁŚXŞkŞş­t¸ü­­¨î" #define MSG_ILLEGAL_PORTS_RANGE "¤ŁŚXŞkŞş°đ¤f˝dłň" #define MSG_ILLEGAL_LS_LIMITS "¤ŁŚXŞkŞş'ls'­­¨î" #define MSG_ILLEGAL_FORCE_PASSIVE "łQ°ĘŚĄłs˝uŽÉĄA¤ŁŚXŞkŞşąj¨îIP" #define MSG_ILLEGAL_RATIO "¤ŁŚXŞkŞş¤WśÇ/¤U¸ü˛v" #define MSG_ILLEGAL_UID_LIMIT "¤ŁŚXŞkŞşuid­­¨î" #define MSG_ILLEGAL_OPTION "¤ŁŠúŞşrun-timeżďśľ" #define MSG_LDAP_MISSING_BASE "LDAP˛ŐşAŔɤ¤żňĽ˘LDAPBaseDN" #define MSG_LDAP_WRONG_PARMS "żůť~ŞşLDAP°ŃźĆ" #define MSG_NEW_CONNECTION "ŚŰ %s Şşˇsłs˝u" #define MSG_WELCOME_TO "ĹwŞď¨Ó¨ě" #define MSG_MAX_USERS "%lu ¨ĎĽÎŞĚ(łĚ¤j­Č)¤w¸gľn¤JĄAŠęşp" #define MSG_NB_USERS "ązŹO˛Ä %u ­Ó¨ĎĽÎŞĚĄAłĚŚhĽišF %u ­Ółs˝u" #define MSG_WELCOME_TIME "˛{ŚbĽťŚaŽÉśĄŹO %02d:%02d ĄCŚřŞAžš°đ¤f: %uĄC" #define MSG_ANONYMOUS_FTP_ONLY "ło¸ĚĽuĽÎ°ÎŚWFTP" #define MSG_RATIOS_EVERYONE "°wšďEVERYONEąŇĽÎ¤ń˛v:" #define MSG_RATIOS_ANONYMOUS "°ÎŚW¨ĎĽÎŞĚłWŠwĽÎUL/DL˛v:" #define MSG_RATIOS_RULE "­n¤U¸ü %u Mb, Ľý¸q°Č¤WśÇ %u Mb ŞşŚnŞFŚčĄC" #define MSG_INFO_IDLE_M "Śb %lu ¤ŔÄÁ¤ş¨SŚłŹĄ°ĘĄAązłQˇ|Â_˝uĄC" #define MSG_INFO_IDLE_S "Śb %lu Źí¤ş¨SŚłŹĄ°ĘĄAązłQˇ|Â_˝uĄC" #define MSG_CANT_READ_FILE "ŠęşpĄA§Ú­ĚľLŞkĹŞ¨ú[%s]" #define MSG_LS_TRUNCATED "żéĽXşIľu¨ě %u ˛ĹŚX" #define MSG_LS_SUCCESS "Á`Ś@ %u ˛ĹŚX" #define MSG_LOGOUT "ľnĽX." #define MSG_AUTH_FAILED_LOG "¨ĎĽÎŞĚ[%s]ĹçĂŇĽ˘ąŃ" #define MSG_ILLEGAL_UMASK "ľLŽÄŞşumask" #define MSG_STANDALONE_FAILED "ľLŞkąŇ°Ęstandalone server" #define MSG_NO_ANONYMOUS_LOGIN "łoŹO¨pĽÎ¨t˛Î - ¤Łś}Šń°ÎŚWľn¤J" #define MSG_ANONYMOUS_ANY_PASSWORD "ĽôŚóąK˝XłŁĽiĽÎ" #define MSG_MAX_USERS_IP "¤ÓŚhłs˝u (%lu) ¨ÓŚŰło­Ó IP" #define MSG_ACTIVE_DISABLED "ĽD°ĘźŇŚĄĂöłŹ" #define MSG_TRANSFER_SUCCESSFUL "ŔɎלǰeOK" #define MSG_NO_DISK_SPACE "ľwşĐĂzşĄ - ˝ĐąßÂI¤WśÇ" #define MSG_OUT_OF_MEMORY "°OžĐĹ餣¨Ź" #define MSG_ILLEGAL_TRUSTED_IP "¤ŁŚXŞkŞşŤHĽôIPŚě§}" #define MSG_NO_ASCII_RESUME "ASCII­ŤśÇ¨Ă¤ŁŚwĽţĄA˝ĐĽý§R°ŁŔÉŽ×" #define MSG_UNKNOWN_ALTLOG "¤ŁŠúŞş°OżýŔɎ挥" #define MSG_ACCOUNT_DISABLED "ľLŞkľn¤Jʰ[%s]: ąb¸šĂöłŹ" #define MSG_SQL_WRONG_PARMS "żůť~ŞşSQL°ŃźĆ" #define MSG_ILLEGAL_CONFIG_FILE_SQL "ľLŽÄŞşSQLł]ŠwŔÉ" #define MSG_SQL_MISSING_SERVER "SQL˛ŐşAŔɤ¤żňĽ˘ŚřŞAžšł]Šw" #define MSG_SQL_DOWN "SQL serverŚnšłĂöž÷¤F" #define MSG_ILLEGAL_QUOTA "ľLŽÄŞşĂBŤ×" #define MSG_QUOTA_FILES "%llu ŔɎןƨϼΠ(%d%%) - ąÂĹvĽiĽÎ: %llu ­ÓŔÉŽ×" #define MSG_QUOTA_SIZE "%llu Kbytes¨ĎĽÎ (%d%%) - ąÂĹvĽiĽÎ: %llu Kb" #define MSG_QUOTA_EXCEEDED "śWšLĂBŤ×: [%s] ¤Łˇ|łQŔxŚs" #define MSG_AUTH_UNKNOWN "¤ŁŠúŞşĹçĂҤčŞk" #define MSG_PDB_BROKEN "ľLŞkĹŞ¨úindexed puredbŔÉ(ŠÎ°ť´ú¨ěÂŽ挥) - ¸Ő¸Ő pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s ŹO§OŚWĄAľš %s Şş" #define MSG_ALIASES_UNKNOWN "¤ŁŠúŞş§OŚW %sĄC" #define MSG_ALIASES_BROKEN_FILE "ˇlĂaŞş§OŚWŔÉŽ×" #define MSG_ALIASES_LIST "ĽH¤UŞş§OŚWĽiĽÎĄG" #define MSG_PERUSER_MAX "ľLŞkąľ¨ü¨ÓŚŰŚP¤@¨ĎĽÎŞĚśWšL %lu Şşłs˝uźĆ" #define MSG_IPV6_OK "łołĄĽDž÷¤]ĹwŞďIPv6Şşłs˝u" #define MSG_TLS_INFO "TLS: ąŇĽÎ %s with %s, %d Śě¤¸Ľ[ąK" #define MSG_TLS_WEAK "TLS: ąK˝X¤Ł¨Ź" #define MSG_TLS_NEEDED "ŠęşpĄAŚšŚřŞAžš¤Łąľ¨üŠú¤ĺŚĄłs˝uĄC\n" \ "˝Đ¨ĎĽÎTLSŞşŚwĽţž÷¨î­Ťˇsłs˝uĄC" #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/pure-authd.c0000644000175000017500000002506013450665410016426 0ustar rackeracke#include #ifndef WITH_EXTAUTH #include int main(void) { puts("Please compile the server with --with-extauth to use this feature.\n" "Thank you."); return 0; } #else #include "ftpd.h" #include "log_extauth.h" #include "pure-authd_p.h" #include "safe_rw.h" #ifdef WITH_DMALLOC # include #endif static void setcloexec(const int fd) { fcntl(fd, F_SETFD, FD_CLOEXEC); } static int closedesc_all(const int closestdin) { int fodder; if (closestdin != 0) { (void) close(0); if ((fodder = open("/dev/null", O_RDONLY)) == -1) { return -1; } (void) dup2(fodder, 0); if (fodder > 0) { (void) close(fodder); } } if ((fodder = open("/dev/null", O_WRONLY)) == -1) { return -1; } (void) dup2(fodder, 1); (void) dup2(1, 2); if (fodder > 2) { (void) close(fodder); } return 0; } static void dodaemonize(void) { pid_t child; if (daemonize != 0) { if ((child = fork()) == (pid_t) -1) { perror("Daemonization failed - fork"); return; } else if (child != (pid_t) 0) { _exit(EXIT_SUCCESS); } else if (setsid() == (pid_t) -1) { perror("Daemonization failed : setsid"); } (void) chdir("/"); #ifdef HAVE_CLOSEFROM (void) closefrom(3); #endif (void) closedesc_all(1); } } static int init(void) { #ifndef NON_ROOT_FTP if (geteuid() != (uid_t) 0) { fprintf(stderr, "Sorry, but you have to be root to run this program\n"); return -1; } #endif return 0; } static void usage(void) { #ifndef NO_GETOPT_LONG const struct option *options = long_options; do { printf("-%c\t--%s\t%s\n", options->val, options->name, options->has_arg ? "" : ""); options++; } while (options->name != NULL); #endif exit(EXIT_SUCCESS); } static int parseoptions(int argc, char *argv[]) { #ifndef NO_GETOPT_LONG int option_index = 0; #endif int fodder; while ((fodder = #ifndef NO_GETOPT_LONG getopt_long(argc, argv, GETOPT_OPTIONS, long_options, &option_index) #else getopt(argc, argv, GETOPT_OPTIONS) #endif ) != -1) { switch (fodder) { case 'B': { daemonize = 1; break; } case 'g': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; gid = (gid_t) strtoul(nptr, &endptr, 10); if (!nptr || !*nptr || !endptr || *endptr) { perror("Illegal GID - Must be a number\n"); } break; } case 'p': { if ((authd_pid_file = strdup(optarg)) == NULL) { perror("Oh no ! More memory !"); } break; } #ifndef NO_GETOPT_LONG case 'h': { usage(); } #endif case 'r': { if (script == NULL && (script = strdup(optarg)) == NULL) { perror("Oh no ! More memory !"); } break; } case 's': { if (socketpath == NULL && (socketpath = strdup(optarg)) == NULL) { perror("Oh no ! More memory !"); } break; } case 'u': { const char *nptr; char *endptr; nptr = optarg; endptr = NULL; uid = (uid_t) strtoul(nptr, &endptr, 10); if (!*nptr || !endptr || *endptr) { perror("Illegal UID - Must be a number\n"); } break; } default: usage(); } } return 0; } static int changeuidgid(void) { #ifndef NON_ROOT_FTP if ( # ifdef HAVE_SETGROUPS setgroups(1U, &gid) || # endif setgid(gid) || setegid(gid) || setuid(uid) || seteuid(uid) || chdir("/")) { return -1; } #endif return 0; } static void newenv_str(const char * const var, const char * const str) { size_t s; char *v; if (str == NULL || *str == 0) { return; } s = strlen(var) + strlen(str) + (size_t) 2U; if ((v = malloc(s)) == NULL) { return; } if (SNCHECK(snprintf(v, s, "%s=%s", var, str), s)) { free(v); return; } #ifdef HAVE_PUTENV putenv(v); #endif } static void updatepidfile(void) { int fd; char buf[42]; size_t buf_len; if (SNCHECK(snprintf(buf, sizeof buf, "%lu\n", (unsigned long) getpid()), sizeof buf)) { return; } if (unlink(authd_pid_file) != 0 && errno != ENOENT) { return; } if ((fd = open(authd_pid_file, O_CREAT | O_WRONLY | O_TRUNC | O_NOFOLLOW, (mode_t) 0644)) == -1) { return; } buf_len = strlen(buf); if (safe_write(fd, buf, buf_len, -1) != (ssize_t) buf_len) { ftruncate(fd, (off_t) 0); } close(fd); } static void callback_client_account(const char *str) { newenv_str(ENV_AUTHD_ACCOUNT, str); } static void callback_client_password(const char *str) { newenv_str(ENV_AUTHD_PASSWORD, str); } static void callback_client_sa_host(const char *str) { newenv_str(ENV_AUTHD_SA_HOST, str); } static void callback_client_sa_port(const char *str) { newenv_str(ENV_AUTHD_SA_PORT, str); } static void callback_client_peer_host(const char *str) { newenv_str(ENV_AUTHD_PEER_HOST, str); } static void callback_client_encrypted(const char *str) { newenv_str(ENV_AUTHD_ENCRYPTED, str); } static void callback_client_sni_name(const char *str) { if (*str != 0) { newenv_str(ENV_AUTHD_CLIENT_SNI_NAME, str); } } static void callback_client_end(const char *str) { (void) str; ended = 1; } static void process(const int clientfd) { ssize_t readnb; char *linepnt; char *crpoint; pid_t pid; int pfds[2]; char line[4096]; while ((readnb = read(clientfd, line, sizeof line - 1U)) < (ssize_t) 0 && (errno == EINTR || errno == EIO)); if (readnb <= (ssize_t) 0) { return; } line[readnb] = 0; if (pipe(pfds) != 0) { return; } pid = fork(); if (pid == (pid_t) -1) { close(pfds[0]); close(pfds[1]); return; } if (pid != (pid_t) 0) { close(pfds[1]); /* close the output side of the pipe */ if ((readnb = safe_read(pfds[0], line, sizeof line - 1U)) > (ssize_t) 0) { (void) safe_write(clientfd, line, readnb, -1); } #ifdef HAVE_WAITPID (void) waitpid(pid, NULL, 0); #else while (wait3(NULL, 0, NULL) != pid); #endif close(pfds[0]); return; } /* now, we are in the child */ close(clientfd); close(kindy); close(pfds[0]); /* close the input side of the pipe */ closedesc_all(1); linepnt = line; while ((crpoint = strchr(linepnt, '\n')) != NULL) { const ExtauthdCallBack *scanned; size_t keyword_len; *crpoint = 0; scanned = extauthd_callbacks; while (scanned->keyword != NULL) { keyword_len = strlen(scanned->keyword); if (strncmp(scanned->keyword, linepnt, keyword_len) == 0) { scanned->func(linepnt + keyword_len); break; } scanned++; } linepnt = crpoint + 1; } if (ended == 0) { close(pfds[1]); _exit(EXIT_FAILURE); } if (dup2(pfds[1], 1) == -1) { close(pfds[1]); _exit(EXIT_FAILURE); } close(pfds[1]); #ifdef DO_AUTHD_TIMEOUT (void) alarm(AUTHD_SCRIPT_TIMEOUT); #endif (void) execl(script, script, (char *) NULL); _exit(EXIT_SUCCESS); } int listencnx(void) { struct sockaddr_un *saddr; int clientfd; int ret = -1; const size_t socketpath_len = strlen(socketpath); if ((saddr = malloc(sizeof(*saddr) + socketpath_len + (size_t) 1U)) == NULL) { perror("No more memory to listen to anything"); goto bye; } memcpy(saddr->sun_path, socketpath, socketpath_len + (size_t) 1U); saddr->sun_family = AF_UNIX; (void) unlink(socketpath); (void) umask(077); if ((kindy = socket(AF_UNIX, SOCK_STREAM, 0)) == -1) { perror("Unable to create a local socket"); goto bye; } setcloexec(kindy); if (bind(kindy, (struct sockaddr *) saddr, SUN_LEN(saddr)) != 0) { perror("Unable to bind a local socket"); goto bye; } if (chmod(socketpath, 0600) != 0) { perror("Unable to change perms on the local socket"); goto bye; } if (listen(kindy, AUTHD_BACKLOG) != 0) { perror("Unable to listen the local socket"); goto bye; } if (changeuidgid() < 0) { perror("Identity change"); (void) unlink(authd_pid_file); return -1; } do { if ((clientfd = accept(kindy, NULL, NULL)) == -1) { if (exit_authd != 0) { break; } (void) sleep(1); continue; } setcloexec(clientfd); process(clientfd); close(clientfd); } while (exit_authd == 0); ret = 0; bye: if (kindy != -1) { close(kindy); kindy = -1; } (void) unlink(socketpath); free(saddr); return ret; } static RETSIGTYPE sigterm(int sig) { (void) sig; exit_authd = 1; if (kindy != -1) { close(kindy); kindy = -1; } } int main(int argc, char *argv[]) { int err; #ifdef HAVE_SETLOCALE # ifdef LC_MESSAGES (void) setlocale(LC_MESSAGES, ""); # endif # ifdef LC_CTYPE (void) setlocale(LC_CTYPE, ""); # endif # ifdef LC_COLLATE (void) setlocale(LC_COLLATE, ""); # endif #endif if (init() < 0) { return -1; } (void) signal(SIGTERM, sigterm); (void) signal(SIGQUIT, sigterm); (void) signal(SIGINT, sigterm); #ifdef SIGXCPU (void) signal(SIGXCPU, sigterm); #endif if (parseoptions(argc, argv) < 0) { return -1; } if (script == NULL || *script != '/') { fprintf(stderr, "You must give -r /path/to/auth/program\n"); return -2; } if (socketpath == NULL || *socketpath == 0) { fprintf(stderr, "You must give -s /path/to/socket\n"); return -2; } if (daemonize != 0) { dodaemonize(); } updatepidfile(); #ifdef SIGPIPE signal(SIGPIPE, SIG_IGN); #endif #ifdef SIGCHLD signal(SIGCHLD, SIG_DFL); #endif err = listencnx(); (void) unlink(authd_pid_file); return err; } #endif pure-ftpd-1.0.49.orig/src/messages_da.h0000644000175000017500000003336513446174132016640 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Timeout" #define MSG_CAPABILITIES "Kan ikke ćndre muligheder" #define MSG_CLIENT_CLOSED_CNX "Klient afbrřd forbindelsen" #define MSG_CLIENT_READ_ERR "Lćsefejl fra klienten" #define MSG_CANT_OPEN_CNX "Kan ikke ĺbne forbindelse" #define MSG_CANT_CREATE_DATA_SOCKET "Kan ikke oprette data sokkel" #define MSG_DEBUG_CLIENT_IS "Klientens adresse er" #define MSG_SYNTAX_ERROR_IP "Syntaks fejl i IP adresse" #define MSG_PORT_SUCCESSFUL "PORT kommando lykkedes" #define MSG_ONLY_IPV4V6 "Kun IPv4 og IPv6 er understřttet (1,2)" #define MSG_ONLY_IPV4 "Kun IPv4 er understřttet (1)" #define MSG_TIMEOUT_PARSER "Timeout - prřv at skrive lidt hurtigere nćste gang" #define MSG_LINE_TOO_LONG "Linie for lang" #define MSG_LOG_OVERFLOW "Klienten prřvede at overfylde kommandolinie bufferen" #define MSG_GOODBYE "Farvel, du har uploaded %llu og downloaded %llu kbytes." #define MSG_DEBUG_COMMAND "Kommando" #define MSG_IS_YOUR_CURRENT_LOCATION "er din nuvćrende possition" #define MSG_NOT_LOGGED_IN "Du er ikke logget pĺ" #define MSG_AUTH_UNIMPLEMENTED "Sikkerhedsudvidelser er ikke implementeret" #define MSG_NO_FILE_NAME "Intet filnavn" #define MSG_NO_DIRECTORY_NAME "Intet mappenavn" #define MSG_NO_RESTART_POINT "Intet genstartspunkt" #define MSG_ABOR_SUCCESS "Siden du ser denne ABOR, er det nok lykkedes" #define MSG_MISSING_ARG "Manglende besked" #define MSG_GARBAGE_FOUND "Skidt fundet efter vćrdi" #define MSG_VALUE_TOO_LARGE "Vćrdi for stor" #define MSG_IDLE_TIME "Ledig tid sat til %lu sekunder" #define MSG_SITE_HELP "Disse SITE kommandoer kendes" #define MSG_BAD_CHMOD "Forkerte tilladelser" #define MSG_UNKNOWN_EXTENSION "er en ukendt udvidelse" #define MSG_XDBG_OK "XDBG kommando lykkedes, debug niveao er nu %d" #define MSG_UNKNOWN_COMMAND "Ukendt kommando" #define MSG_TIMEOUT_NOOP "Timeout (intet udfřrt i %lu sekunder)" #define MSG_TIMEOUT_DATA "Timeout (ingen ny data i %lu sekunder)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "Du er allerede logget pĺ" #define MSG_ANY_PASSWORD "Et hvilketsomhlest kodeord virker" #define MSG_ANONYMOUS_LOGGED "Anonym bruger er logget pĺ" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Anonym bruger er logget pĺ virtuel FTP" #define MSG_USER_OK "Bruger %s OK. Der skal bruges kodeord" #define MSG_CANT_DO_TWICE "Det kan vi ikke i denne forbindelse" #define MSG_UNABLE_SECURE_ANON "Kunne ikke oprette sikker anonym FTP forbindelse" #define MSG_BANDWIDTH_RESTRICTED "Dit bĺndbredde forbrug er begrćnset" #define MSG_NO_PASSWORD_NEEDED "Jeg beřves intet kodeord, kćre anonyme ko" #define MSG_NOTRUST "Desvćrre, jeg stoler ikke pĺ dig" #define MSG_WHOAREYOU "Fortćl mig venligst hvem du er" #define MSG_AUTH_FAILED "Godkendelse mislykkedes" #define MSG_AUTH_TOOMANY "For mange mislykkedes godkendelses forsřg" #define MSG_NO_HOMEDIR "Hjemmemappe ikke tilgćngelig - afbrydder" #define MSG_NO_HOMEDIR2 "%s kan ikke findes " #define MSG_START_SLASH "Starter i /" #define MSG_USER_GROUP_ACCESS "Bruger %s har gruppeadgang til" #define MSG_FXP_SUPPORT "Denne server understřtter FXP overfřrsler" #define MSG_RATIO "Du mĺ respektere %u:%u (op/ned) ratioen" #define MSG_CHROOT_FAILED "Kunne ikke sćtte en sikker chroot() sćlle" #define MSG_CURRENT_DIR_IS "OK. Nuvćrende mappe er %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Nuvćrende begrćnsede mappe er %s" #define MSG_IS_NOW_LOGGED_IN "%s er logget pĺ nu" #define MSG_CANT_CHANGE_DIR "Kan ikke ćndre mappen til %s" #define MSG_PATH_TOO_LONG "Sti for lang" #define MSG_CANT_PASV "Jeg kan ikke oprette en passiv forbindelse med den forćldede kommando" #define MSG_CANT_PASSIVE "Kunne ikke oprette en passiv forbindelse" #define MSG_PORTS_BUSY "Alle reserverede TCP porte er optaget" #define MSG_GETSOCKNAME_DATA "Kunne ikke identificere den lokale data sokkel" #define MSG_GETPEERNAME "Kunne ikke identificere den lokale sokkel" #define MSG_INVALID_IP "Desvćrre, ugyldig adresse" #define MSG_NO_EPSV "Brug venligst en klient der understřtter IPv6 med EPSV" #define MSG_BAD_PORT "Jeg vil desvćrre ikke forbinde til porte < 1024" #define MSG_NO_FXP "Jeg vil ikke ĺbne en forbindelse til %s (kun til %s)" #define MSG_FXP "FXP overfřrsel : fra %s til %s" #define MSG_NO_DATA_CONN "Ingen date forbindelse" #define MSG_ACCEPT_FAILED "Forbindelsen kunne ikke blive godkendt" #define MSG_ACCEPT_SUCCESS "Dataforbindelse godkendt" #define MSG_CNX_PORT_FAILED "Kunne ikke ĺbne for dataforbindelsen til port %d" #define MSG_CNX_PORT "Forbinder til port %d" #define MSG_ANON_CANT_MKD "Anonyme brugere mĺ ikke oprette mapper" #define MSG_ANON_CANT_RMD "Anonyme brugere mĺ ikke slette mapper" #define MSG_ANON_CANT_RENAME "Anonyme brugere mĺ ikke flytte/omdřbe filer" #define MSG_ANON_CANT_CHANGE_PERMS "Anonyme brugere kan ikke ćndre tilladelser" #define MSG_GLOB_NO_MEMORY "Lřb třr for hukommelse under gennemgang af %s" #define MSG_PROBABLY_DENIED "(Det her betydder sikkert 'Ingen adgang')" #define MSG_GLOB_READ_ERROR "Lćsefejl under gennemgang af %s" #define MSG_GLOB_NO_MATCH "Ingen %s i %s" #define MSG_CHMOD_FAILED "Kunne ikke ćndre tilladelser pĺ %s" #define MSG_CHMOD_SUCCESS "Tilladelser pĺ %s ćndret" #define MSG_CHMOD_TOTAL_FAILURE "Desvćrre, jeg kunne ikke ćndre nogen tilladelser" #define MSG_ANON_CANT_DELETE "Anonyme brugere kan ikke slette filer" #define MSG_ANON_CANT_OVERWRITE "Anonyme brugere mĺ ikke overskive filer" #define MSG_DELE_FAILED "Kunne ikke slette %s" #define MSG_DELE_SUCCESS "Slettede %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "Ingen fil slettet" #define MSG_LOAD_TOO_HIGH \ "Belastningen var %3.2f da du kom pĺ. Vi tillader ikke anonyme brugere\n" \ "at downloade nĺr belastngingen er sĺ hřj. Uploads er altid tilladt" #define MSG_OPEN_FAILURE "Kan ikke ĺbne %s" #define MSG_OPEN_FAILURE2 "Kan ikke ĺbne den fil" #define MSG_STAT_FAILURE "Kan ikke finde filstřrrelse" #define MSG_STAT_FAILURE2 "Kan ikke checke om filen findes" #define MSG_REST_TOO_LARGE_FOR_FILE "Genstart offset %lld er for stor for filstřrrelse %lld." #define MSG_REST_RESET "genstart offset sat til 0" #define MSG_NOT_REGULAR_FILE "Jeg kan kun hente almindelig filer" #define MSG_NOT_MODERATED \ "Denne fil er uploaded af en anonym bruger. Den er endnu ikke\n" \ "blevet godkendt af administratorerne til download." #define MSG_RATIO_DENIAL \ "Upload/download forholdet er %u:%u.\n" \ "Du har uploaded %llu Kb og downloaded %llu Kb.\n" \ "Upload venligst nogle godter og kom tilbage og snylt senere." #define MSG_NO_MORE_TO_DOWNLOAD "Der er intet tilbage at downloade" #define MSG_WINNER "Computeren er din ven. Stol pĺ computeren" #define MSG_KBYTES_LEFT "%.1f kbytes at hente" #define MSG_ABORTED "Overfřrelse afbrudt" #define MSG_DATA_WRITE_FAILED "Fejl under skrivning til dataforbindelsen" #define MSG_DATA_READ_FAILED "Fejl under lćsning fra dataforbindelsen" #define MSG_MMAP_FAILED "Kunne ikke lćgge filen i RAM" #define MSG_WRITE_FAILED "Fejl under skrivning til fil" #define MSG_TRANSFER_RATE_M "%.3f sekunder (mĺlt her), %.2f Mbytes pr sekund" #define MSG_TRANSFER_RATE_K "%.3f sekunder (mĺlt her), %.2f Kbytes pr sekund" #define MSG_TRANSFER_RATE_B "%.3f sekunder (mĺlt her), %.2f bytes pr sekund" #define MSG_SPACE_FREE_M "%.1f Mbytes fri disk plads" #define MSG_SPACE_FREE_K "%f Kbytes fri disk plads" #define MSG_DOWNLOADED "downloaded" #define MSG_REST_NOT_NUMERIC "REST skal bruge en numereisk parameter" #define MSG_REST_ASCII_STRICT "Svar markřr skal vćre 0 i ASCII mode" #define MSG_REST_ASCII_WORKAROUND "Genstarter ved %lld. Men vi er i ASCII mode" #define MSG_REST_SUCCESS "Genstarter ved %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Forbudt mappenavn" #define MSG_SANITY_FILE_FAILURE "Forbudt filnavn: %s" #define MSG_MKD_FAILURE "Kan ikke oprette mappe" #define MSG_MKD_SUCCESS "Mappen blev oprettet" #define MSG_RMD_FAILURE "Kan ikke fjerne mappen" #define MSG_RMD_SUCCESS "Mappen blev fjernet" #define MSG_TIMESTAMP_FAILURE "Kan ikke hente tidsstempel" #define MSG_MODE_ERROR "Kun ASCII og binćr overfřrsel er understřttet" #define MSG_CREATE_FAILURE "Kunne ikke oprette fil" #define MSG_ABRT_ONLY "ABRT er den eneste lovlige kommando under upload" #define MSG_UPLOAD_PARTIAL "Delvist uploaded" #define MSG_REMOVED "fjernet" #define MSG_UPLOADED "uploaded" #define MSG_GMTIME_FAILURE "Kunne ikke hente den lokale tid" #define MSG_TYPE_8BIT_FAILURE "Kun 8 bit er understřttet, vi er ikke 10 ĺr tilbage" #define MSG_TYPE_UNKNOWN "Ukendt TYPE" #define MSG_TYPE_SUCCESS "TYPE er nu" #define MSG_STRU_FAILURE "Kun F(il) er understřttet" #define MSG_MODE_FAILURE "Brug venligst S(tream) mode" #define MSG_RENAME_ABORT "Afbrydder forige omdřb opgave" #define MSG_RENAME_RNFR_SUCCESS "RNFR godkendt - fil findes, klar til destination" #define MSG_FILE_DOESNT_EXIST "Den fil findes ikke" #define MSG_RENAME_ALREADY_THERE "OMDŘB mislykkedes - destinations fil findes allerede" #define MSG_RENAME_NORNFR "Skal bruge RNFR fřr RNTO" #define MSG_RENAME_FAILURE "Omdřb/flyt fejl" #define MSG_RENAME_SUCCESS "Fil blev omdřbt eller flyttet" #define MSG_NO_SUPERSERVER "Křr venligst pure-ftpd fra en super-server (f. eks. tcpserver)" #define MSG_NO_FTP_ACCOUNT "Kunne ikke finde 'ftp' kontoen" #define MSG_CONF_ERR "Konfigurations fejl" #define MSG_NO_VIRTUAL_FILE "Virtuelle brugers filnavn mangler" #define MSG_ILLEGAL_THROTTLING "Ulovlig vćrdi for throttle" #define MSG_ILLEGAL_TRUSTED_GID "Ulovlig gid for chroot" #define MSG_ILLEGAL_USER_LIMIT "Ulovlig grćnse for bruger" #define MSG_ILLEGAL_FACILITY "Ukendt facilitets navn" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Forkert LDAP konfigurations fil" #define MSG_ILLEGAL_LOAD_LIMIT "Ulovlig lćse grćnse" #define MSG_ILLEGAL_PORTS_RANGE "Forkert port omrĺde" #define MSG_ILLEGAL_LS_LIMITS "Forkerte 'ls' grćnser" #define MSG_ILLEGAL_FORCE_PASSIVE "Ulovlig tvungen IP til passive forbindelser" #define MSG_ILLEGAL_RATIO "Ulovlig upload/download forhold" #define MSG_ILLEGAL_UID_LIMIT "Ulovlig uid grćnse" #define MSG_ILLEGAL_OPTION "Ukendt run-time valg" #define MSG_LDAP_MISSING_BASE "Manglende LDAPBaseDN i LDAP konfigurations filen" #define MSG_LDAP_WRONG_PARMS "Forkerte LDAP parametre" #define MSG_NEW_CONNECTION "Ny forbindelse fra %s" #define MSG_WELCOME_TO "Velkommen til" #define MSG_MAX_USERS "%lu brugere (det maksimale) er allerede logget pĺ, desvćrre" #define MSG_NB_USERS "Du er bruger nr %u af %u tilladte" #define MSG_WELCOME_TIME "Lokal tid er nu %02d:%02d. Server port: %u." #define MSG_ANONYMOUS_FTP_ONLY "Kun anonym FTP er tilladt her" #define MSG_RATIOS_EVERYONE "FORHOLD ER SLĹET TIL FOR ALLE :" #define MSG_RATIOS_ANONYMOUS "ANONUME BRUGERE FĹR ET UL/DL FORHOLD :" #define MSG_RATIOS_RULE "for at downloade %u Mb, skal du uploade %u Mb godter." #define MSG_INFO_IDLE_M "Du bliver koblet af efter %lu minutters inaktivitet." #define MSG_INFO_IDLE_S "Du bliver koblet af efter %lu sekunders inaktivitet." #define MSG_CANT_READ_FILE "Kunne ikke lćse [%s]" #define MSG_LS_TRUNCATED "Data afrundet til %u sammenfald" #define MSG_LS_SUCCESS "%u sammenfald totalt" #define MSG_LOGOUT "Logout." #define MSG_AUTH_FAILED_LOG "Godkendelse mislykkedes for [%s]" #define MSG_ILLEGAL_UMASK "Forkert umask" #define MSG_STANDALONE_FAILED "Kunne ikke starte tandalone server" #define MSG_NO_ANONYMOUS_LOGIN "Dette er et privat system - Ingen anonyme logins" #define MSG_ANONYMOUS_ANY_PASSWORD "Et hvilketsomhlest kodeord virker" #define MSG_MAX_USERS_IP "For mange forbindelser(%lu) fra denne IP" #define MSG_ACTIVE_DISABLED "Aktiv mode er slĺet fra" #define MSG_TRANSFER_SUCCESSFUL "Filoverfřrsel lykkedes" #define MSG_NO_DISK_SPACE "Disken er fuld - upload venligst senere" #define MSG_OUT_OF_MEMORY "Er lřbet třr for hukommelse" #define MSG_ILLEGAL_TRUSTED_IP "Ulovlig pĺlidelig IP adresse" #define MSG_NO_ASCII_RESUME "ASCII genoptagning er usikker, slet venligst filen fřrst" #define MSG_UNKNOWN_ALTLOG "Ukendt log format" #define MSG_ACCOUNT_DISABLED "Du kan ikke logge pĺ som [%s]: konto er deaktiveret" #define MSG_SQL_WRONG_PARMS "Forkerte SQL indstillinger" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Forkert SQL konfigurations fil" #define MSG_SQL_MISSING_SERVER "Server i SQL konfigurationsfil mangler" #define MSG_SQL_DOWN "Det ladder til at SQL serveren er nede" #define MSG_ILLEGAL_QUOTA "Forkert quota" #define MSG_QUOTA_FILES "%llu filer bliver brugt (%d%%) - autoriseret: %llu filer" #define MSG_QUOTA_SIZE "%llu Kbyte er brugt (%d%%) - autoriseret: %llu Kb" #define MSG_QUOTA_EXCEEDED "Quota grćnse overskredet : [%s] bliver ikke gemt" #define MSG_AUTH_UNKNOWN "Ukendt godkendelses metode" #define MSG_PDB_BROKEN "Kunne ikke lćse den indexerede puredb fil (eller gammelt format fundet) - Prřv pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s er et alias for %s." #define MSG_ALIASES_UNKNOWN "Ukendt alias %s." #define MSG_ALIASES_BROKEN_FILE "Řdelagt alias fil" #define MSG_ALIASES_LIST "Dess aliaser er tilgćngelige :" #define MSG_PERUSER_MAX "Jeg kan ikke ĺbne mere en %lu forbindelser for den samme bruger" #define MSG_IPV6_OK "IPv6 forbindelser er ogsĺ velkomne pĺ denne server" #define MSG_TLS_INFO "TLS: Enabled %s with %s, %d secret bits cipher" #define MSG_TLS_WEAK "TLS: Cipher too weak" #define MSG_TLS_NEEDED "Sorry, cleartext sessions are not accepted on this server.\n" \ "Please reconnect using TLS security mechanisms." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/log_mysql_p.h0000644000175000017500000000402713350542502016675 0ustar rackeracke#ifndef __LOG_MYSQL_P_H__ #define __LOG_MYSQL_P_H__ 1 #include #ifdef MYSQL_VERSION_ID # if MYSQL_VERSION_ID < 32224 # define mysql_field_count(X) mysql_num_fields(X) # endif #endif static char *server; static char *port_s; static int port; static char *socket_path; static char *user; static char *pw; static char *db; static char *crypto; static char *transactions; static char *sqlreq_getpw; static char *sqlreq_getuid; static char *sql_default_uid; static char *sqlreq_getgid; static char *sql_default_gid; static char *sqlreq_getdir; static char *tildexp_s; static int tildexp; #ifdef QUOTAS static char *sqlreq_getqta_sz; static char *sqlreq_getqta_fs; #endif #ifdef RATIOS static char *sqlreq_getratio_ul; static char *sqlreq_getratio_dl; #endif #ifdef THROTTLING static char *sqlreq_getbandwidth_ul; static char *sqlreq_getbandwidth_dl; #endif static signed char server_down; static ConfigKeywords mysql_config_keywords[] = { { "MYSQLServer", &server }, { "MYSQLPort", &port_s }, { "MYSQLSocket", &socket_path }, { "MYSQLUser", &user }, { "MYSQLPassword", &pw }, { "MYSQLDatabase", &db }, { "MYSQLCrypt", &crypto }, { "MYSQLTransactions", &transactions }, { "MYSQLGetPW", &sqlreq_getpw }, { "MYSQLGetUID", &sqlreq_getuid }, { "MYSQLDefaultUID", &sql_default_uid }, { "MYSQLGetGID", &sqlreq_getgid }, { "MYSQLDefaultGID", &sql_default_gid }, { "MYSQLGetDir", &sqlreq_getdir }, { "MYSQLForceTildeExpansion", &tildexp_s }, #ifdef QUOTAS { "MYSQLGetQTAFS", &sqlreq_getqta_fs }, { "MYSQLGetQTASZ", &sqlreq_getqta_sz }, #endif #ifdef RATIOS { "MYSQLGetRatioUL", &sqlreq_getratio_ul }, { "MYSQLGetRatioDL", &sqlreq_getratio_dl }, #endif #ifdef THROTTLING { "MYSQLGetBandwidthUL", &sqlreq_getbandwidth_ul }, { "MYSQLGetBandwidthDL", &sqlreq_getbandwidth_dl }, #endif { NULL, NULL } }; #ifdef HAVE_MY_MAKE_SCRAMBLED_PASSWORD extern void my_make_scrambled_password(char *to, const char *password, size_t pass_len); #endif #endif pure-ftpd-1.0.49.orig/src/caps.h0000644000175000017500000000015213350542501015270 0ustar rackeracke#ifndef __CAPS_H__ #define __CAPS_H__ 1 void drop_login_caps(void); void set_initial_caps(void); #endif pure-ftpd-1.0.49.orig/src/ftpd.h0000644000175000017500000005076113446174132015321 0ustar rackeracke#ifndef __FTPD_H__ #define __FTPD_H__ 1 #ifndef __GNUC__ # ifdef __attribute__ # undef __attribute__ # endif # define __attribute__(a) #endif #include #ifdef STDC_HEADERS # include # include # include #else # if HAVE_STDLIB_H # include # endif #endif #include #ifdef HAVE_STDINT_H # include #endif #ifdef HAVE_LOCALE_H # include #endif #ifdef HAVE_STRING_H # if !STDC_HEADERS && HAVE_MEMORY_H # include # endif # include #else # if HAVE_STRINGS_H # include # endif #endif #include #include #include #include #ifdef HAVE_UNISTD_H # include #endif #ifdef TIME_WITH_SYS_TIME # include # include #else # if HAVE_SYS_TIME_H # include # else # include # endif #endif #include #ifdef HAVE_FCNTL_H # include #elif defined(HAVE_SYS_FCNTL_H) # include #endif #ifdef HAVE_IOCTL_H # include #elif defined(HAVE_SYS_IOCTL_H) # include #endif #include #include #ifdef HAVE_NETINET_IN_SYSTM_H # include #endif #include #include #include #include #ifdef HAVE_SYS_RESOURCE_H # include #endif #ifdef HAVE_SYS_PARAM_H # include #endif #ifdef HAVE_SYS_MOUNT_H # include #endif #include #include #include #include #ifdef HAVE_SYS_VFS_H # ifndef STATFS_ALREADY_DEFINED # include # endif #endif #ifdef HAVE_SYS_STATVFS_H # include #endif #ifdef HAVE_SYS_LOADAVG_H # include #endif #ifdef HAVE_SYS_SYSMP_H # include #endif #ifdef HAVE_SYS_SYSGET_H # include #endif #ifdef HAVE_UTIME_H # include #endif #include "mysnprintf.h" #if !defined(HAVE_GETADDRINFO) || !defined(HAVE_GETNAMEINFO) || (!defined(HAVE_INET_NTOP) && !defined(inet_ntop)) || (!defined(HAVE_INET_PTON) && !defined(inet_pton)) # define OLD_IP_STACK 1 #endif #include "ipstack.h" /* We can't have more than one implementation, so if more than one were * found, the configure test failed - Use none */ #ifdef VIRTUOZZO # ifndef DISABLE_SENDFILE # define DISABLE_SENDFILE 1 # endif #endif /* Solaris now supports both sendfilev() and Linux-like sendfile(). * Prefer sendfile() if available. */ #if defined(SENDFILEV_SOLARIS) && defined(SENDFILE_LINUX) # undef SENDFILEV_SOLARIS #endif #if defined(DISABLE_SENDFILE) || \ (defined(SENDFILE_FREEBSD) && (defined(SENDFILE_LINUX) || defined(SENDFILEV_SOLARIS) || defined(SENDFILE_HPUX))) || \ (defined(SENDFILE_LINUX) && (defined(SENDFILEV_SOLARIS) || defined(SENDFILE_HPUX))) || \ (defined(SENDFILEV_SOLARIS) && defined(SENDFILE_HPUX)) # undef SENDFILE_FREEBSD # undef SENDFILE_LINUX # undef SENDFILE64_LINUX # undef SENDFILE_HPUX # undef SENDFILEV_SOLARIS #endif #if defined(SENDFILE_FREEBSD) || defined(SENDFILEV_SOLARIS) || \ defined(SENDFILE_HPUX) || \ (defined(SENDFILE_LINUX) && defined(SENDFILE64_LINUX)) /* Old Linux kernels/glibcs that can't handle 64-bits sendfile() aren't * supported any more. */ #else # define SENDFILE_NONE #endif #ifdef HAVE_SYS_UIO_H # include #endif /* * sendfile() is very kernel dependant. It's probable that you have platforms * that require specific #include before sys/sendfile.h . So to enhance * portability, we only include sys/sendfile.h on operating systems known * to be supported */ #if (defined(SENDFILE_LINUX) || defined(SENDFILEV_SOLARIS)) && defined(HAVE_SYS_SENDFILE_H) # include #endif #ifdef HAVE_ALLOCA # ifdef HAVE_ALLOCA_H # include # endif # define ALLOCA(X) alloca(X) # define ALLOCA_FREE(X) do { } while (0) #else # define ALLOCA(X) malloc(X) # define ALLOCA_FREE(X) free(X) #endif #ifdef __FTPD_P_H__ # define SYSLOG_NAMES 1 /* for -f */ #endif #include #ifndef HAVE_SYSLOG_NAMES # include "syslognames.h" #endif #ifdef HAVE_CRYPT_H # include #endif #ifdef USE_SHADOW # ifdef HAVE_SHADOW_H # include # endif #endif #if defined(__svr4__) && defined(__sun__) /* Solaris 2 aka SunOS 5 */ # include # include #endif #ifdef HAVE_SYS_PSTAT_H # include #endif #ifndef O_NOFOLLOW # define O_NOFOLLOW 0 #endif #ifndef O_DIRECTORY # define O_DIRECTORY 0 #endif #ifndef MAP_FILE # define MAP_FILE 0 #endif /* * It's a hell. Some OS (Linux, BSD) have statfs. * Other OS (Solaris, Irix) have statvfs and statvfs64. * They do the same thing, but with a different syntax. */ #if defined(HAVE_STATVFS) || defined(HAVE_STATVFS64) # ifdef HAVE_STATVFS64 # define STATFS_STRUCT struct statvfs64 # define STATFS(PATH, STR) statvfs64(PATH, STR) # define FSTATFS(FD, STR) fstatvfs64(FD, STR) # define STATFS_TYPE 1 # else # define STATFS_STRUCT struct statvfs # define STATFS(PATH, STR) statvfs(PATH, STR) # define FSTATFS(FD, STR) fstatvfs(FD, STR) # define STATFS_TYPE 2 # endif # define STATFS_BAVAIL(X) ((X).f_bavail) # define STATFS_BLOCKS(X) ((X).f_blocks) # define STATFS_BSIZE(X) ((X).f_bsize) # define STATFS_FRSIZE(X) ((X).f_frsize) #elif defined(HAVE_STATFS) # define STATFS_STRUCT struct statfs # define STATFS(PATH, STR) statfs(PATH, STR) # define FSTATFS(FD, STR) fstatfs(FD, STR) # define STATFS_TYPE 3 # define STATFS_BAVAIL(X) ((X).f_bavail) # define STATFS_BLOCKS(X) ((X).f_blocks) # define STATFS_FRSIZE(X) ((X).f_bsize) # define STATFS_BSIZE(X) ((X).f_bsize) #else # define STATFS_STRUCT int # define STATFS(PATH, STR) (-1) # define FSTATFS(FD, STR) (-1) # define STATFS_TYPE -1 # define STATFS_BAVAIL(X) (0) # define STATFS_BLOCKS(X) (0) # define STATFS_BSIZE(X) (0) # define STATFS_FRSIZE(X) (0) #endif #ifndef errno extern int errno; #endif #ifndef environ # ifdef __APPLE_CC__ # include # define environ (*_NSGetEnviron()) # else extern char **environ; # endif #endif typedef struct AuthResult_ { int auth_ok; /* 0=no auth/login not found,1=ok,-1=auth failed */ uid_t uid; gid_t gid; const char *dir; int slow_tilde_expansion; void *backend_data; #ifdef THROTTLING unsigned long throttling_bandwidth_ul; unsigned long throttling_bandwidth_dl; int throttling_ul_changed; int throttling_dl_changed; #endif #ifdef QUOTAS unsigned long long user_quota_size; unsigned long long user_quota_files; int quota_size_changed; int quota_files_changed; #endif #ifdef RATIOS unsigned int ratio_upload; unsigned int ratio_download; int ratio_ul_changed; int ratio_dl_changed; #endif #ifdef PER_USER_LIMITS unsigned int per_user_max; #endif } AuthResult; typedef struct PureFileInfo_ { char **names_pnt; size_t name_offset; off_t size; time_t mtime; mode_t mode; nlink_t nlink; uid_t uid; gid_t gid; } PureFileInfo; #define FI_NAME(X) (*((X)->names_pnt) + (X)->name_offset) typedef enum { ALTLOG_NONE, ALTLOG_CLF, ALTLOG_STATS, ALTLOG_W3C, ALTLOG_XFERLOG } AltLogFormat; typedef struct AltLogPrefixes_ { const char *prefix; const AltLogFormat format; } AltLogPrefixes; typedef enum { CPL_NONE, CPL_CLEAR, CPL_SAFE, CPL_CONFIDENTIAL, CPL_PRIVATE } ChannelProtectionLevel; int pureftpd_start(int argc, char *argv[], const char *home_directory); #ifdef WITH_TLS ssize_t secure_safe_write(void * const tls_fd, const void *buf_, size_t count); #endif void parser(void); void stripctrl(char * const buf, size_t len); void dobanner(const int type); void douser(const char *name); void dopass(char *password); void docwd(const char *dir); void doretr(char *name); void dorest(const char *name); void dodele(char *name); void dostor(char *name, const int append, const int autorename); void domkd(char *name); void dormd(char *name); void domdtm(const char *name); void dosize(const char *name); void doeprt(char *p); void doport(const char *arg); void doport2(struct sockaddr_storage a, unsigned int p); #ifndef MINIMAL void doesta(void); void doestp(void); void doallo(const off_t size); #endif void dopasv(int); void doopts(char *args); void dochmod(char *name, mode_t mode); void doutime(char *name, const char * const wanted_time); void error(int n, const char *msg); void domode(const char *arg); void dostru(const char *arg); void dotype(const char *arg); void donoop(void); void dornfr(char *name); void dornto(char *name); void dostou(void); void dofeat(void); void domlst(const char * const file); void domlsd(const char * const base); void dositetime(void); int ul_check_free_space(const char *name, const double min_space); void disablesignals(void); void getnames(void); void dolist(char *arg, const int on_ctrlconn); void donlst(const char *base); void opendata(void); void closedata(void); void client_fflush(void); void client_printf(const char * const format, ...) __attribute__ ((format(printf, 1, 2))); void addreply(const int code, const char * const line, ...) __attribute__ ((format(printf, 2, 3))); void addreply_noformat(const int code, const char * const line); void doreply(void); void sighandler(int sig); void prevent(char *arg); unsigned int daemons(in_port_t server_port); void logfile(const int facility, const char *format, ...) __attribute__ ((format(printf, 2, 3))); char *skip_telnet_controls(const char *str); void die(const int err, const int priority, const char * const format, ...) __attribute__ ((format(printf, 3, 4))) __attribute__ ((noreturn)); void die_mem(void) __attribute__ ((noreturn)); void _EXIT(const int status) __attribute__ ((noreturn)); void setprocessname(const char * const title); int modernformat(const char *file, char *target, size_t target_size, const char * const prefix); int sfgets(void); const char *getgroup(const gid_t gid); const char *getname(const uid_t uid); unsigned int zrand(void); void simplify(char *subdir); int checkprintable(register const char *s); void delete_atomic_file(void); void usleep2(const unsigned long microsec); int mysnprintf(char *str, size_t size, const char *format, ...); extern int opt_a, opt_C, opt_d, opt_F, opt_l, opt_R; #ifndef CONFDIR # define CONFDIR "/etc" #endif #ifndef VHOST_PATH # define VHOST_PATH CONFDIR "/pure-ftpd" #endif #ifdef WITH_TLS # ifndef TLS_CONFDIR # define TLS_CONFDIR "/etc/ssl/private" # endif # ifndef TLS_CERTIFICATE_FILE # define TLS_CERTIFICATE_FILE TLS_CONFDIR "/pure-ftpd.pem" # endif # ifndef TLS_KEY_FILE # define TLS_KEY_FILE TLS_CERTIFICATE_FILE # endif # ifndef TLS_DHPARAMS_FILE # define TLS_DHPARAMS_FILE TLS_CONFDIR "/pure-ftpd-dhparams.pem" # endif #endif #ifndef TLS_DEFAULT_CIPHER_SUITE # define TLS_DEFAULT_CIPHER_SUITE \ "ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:!DSS" #endif #ifndef TLS_DEFAULT_ECDH_CURVE # define TLS_DEFAULT_ECDH_CURVE "prime256v1" #endif #define FAKE_SHELL "ftp" #ifndef PID_FILE # ifdef NON_ROOT_FTP # define PID_FILE CONFDIR "/pure-ftpd.pid" # else # define PID_FILE STATEDIR "/run/pure-ftpd.pid" # endif #endif #ifndef UPLOADSCRIPT_PID_FILE # ifdef NON_ROOT_FTP # define UPLOADSCRIPT_PID_FILE CONFDIR "/pure-uploadscript.pid" # else # define UPLOADSCRIPT_PID_FILE STATEDIR "/run/pure-uploadscript.pid" # endif #endif #ifndef AUTHD_PID_FILE # ifdef NON_ROOT_FTP # define AUTHD_PID_FILE CONFDIR "/pure-authd.pid" # else # define AUTHD_PID_FILE STATEDIR "/run/pure-authd.pid" # endif #endif #ifndef CERTD_PID_FILE # ifdef NON_ROOT_FTP # define CERTD_PID_FILE CONFDIR "/pure-certd.pid" # else # define CERTD_PID_FILE STATEDIR "/run/pure-certd.pid" # endif #endif #ifndef NON_ROOT_FTP # ifdef IMPLICIT_TLS # define DEFAULT_FTP_PORT_S "990" # else # define DEFAULT_FTP_PORT_S "21" # endif #elif defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) # ifdef IMPLICIT_TLS # define DEFAULT_FTP_PORT_S "990" # else # define DEFAULT_FTP_PORT_S "21" # endif #else # ifdef IMPLICIT_TLS # define DEFAULT_FTP_PORT_S "9990" # else # define DEFAULT_FTP_PORT_S "2121" # endif #endif /* * Some operating systems (at least Solaris > 2.7 and FreeBSD) have strange * troubles with reusing TCP ports, even when SO_REUSEADDR is enabled. * As a workaround, we try several unassigned privileged ports. * The last way is to let the OS assign a port. * For egress filtering, you can accept connections from ports <= 20 * to ports >= 1024. */ #define FTP_ACTIVE_SOURCE_PORTS { \ DEFAULT_FTP_DATA_PORT, 2U, 3U, 4U, 5U, 6U, 10U, 14U, 16U, 0U \ } #ifndef PATH_MAX # ifdef MAXPATHLEN # define PATH_MAX MAXPATHLEN # else # define PATH_MAX 65536U # error Warning: neither PATH_MAX nor MAXPATHLEN were found. # error Remove these lines if you really want to compile the server, but # error the server may be insecure if a wrong value is set here. # endif #endif #if (PATH_MAX) >= (INT_MAX) Your platform has a very large PATH_MAX, we should not trust it. #endif #ifndef MAX_PASSWORD_LEN # define MAX_PASSWORD_LEN 512 #endif #ifndef DEFAULT_MAX_USERS # define DEFAULT_MAX_USERS 50 #endif #ifndef DEFAULT_FTP_DATA_PORT # ifdef IMPLICIT_TLS # define DEFAULT_FTP_DATA_PORT 989 # else # define DEFAULT_FTP_DATA_PORT 20 # endif #endif #ifndef MAX_SYSLOG_LINE # define MAX_SYSLOG_LINE (PATH_MAX + 512U) #endif #ifndef DEFAULT_IDLE # define DEFAULT_IDLE (15UL * 60UL) #endif #ifndef MAX_SITE_IDLE # define MAX_SITE_IDLE (42UL * 60UL) #endif #ifndef DEFAULT_MAX_LS_FILES # define DEFAULT_MAX_LS_FILES 10000U #endif #ifndef DEFAULT_MAX_LS_DEPTH # define DEFAULT_MAX_LS_DEPTH 5U #endif #ifndef GLOB_TIMEOUT # define GLOB_TIMEOUT 17 /* Max user time for a 'ls' to complete */ #endif #ifndef MAX_CPU_TIME # define MAX_CPU_TIME (4 * 60 * 60) /* Max allowed CPU time per session */ #endif #ifndef MAX_SESSION_XFER_IDLE # define MAX_SESSION_XFER_IDLE (24 * 60 * 60) /* Max duration of a transfer */ #endif #ifndef MAX_USER_LENGTH # define MAX_USER_LENGTH 127U #endif #ifdef LOG_FTP # define DEFAULT_FACILITY LOG_FTP #else # define DEFAULT_FACILITY LOG_LOCAL2 #endif #ifndef MAX_DATA_SIZE # ifdef HAVE_LIBSODIUM # define MAX_DATA_SIZE (70 * 1024 * 1024) # elif defined(WITH_LDAP) || defined(WITH_MYSQL) || defined(WITH_PGSQL) # define MAX_DATA_SIZE (16 * 1024 * 1024) /* Max memory usage - SQL/LDAP need more */ # else # define MAX_DATA_SIZE (8 * 1024 * 1024) /* Max memory usage */ # endif #endif #if CONF_TCP_SO_RCVBUF < 65536 # undef CONF_TCP_SO_RCVBUF # define CONF_TCP_SO_RCVBUF 65536 #endif #if CONF_TCP_SO_SNDBUF < 65536 # undef CONF_TCP_SO_SNDBUF # define CONF_TCP_SO_SNDBUF 65536 #endif #ifndef DL_MIN_CHUNK_SIZE # define DL_MIN_CHUNK_SIZE (8 * 1024) #endif #ifndef DL_DEFAULT_CHUNK_SIZE # define DL_DEFAULT_CHUNK_SIZE 49152UL #endif #ifndef DL_DEFAULT_CHUNK_SIZE_ASCII # define DL_DEFAULT_CHUNK_SIZE_ASCII 32768UL #endif #ifndef DL_MAX_CHUNK_SIZE # define DL_MAX_CHUNK_SIZE (128 * 1024UL) #endif #ifndef DL_DLMAP_SIZE # define DL_DLMAP_SIZE (128 * 1024UL) #endif #if DL_DEFAULT_CHUNK_SIZE > DL_MAX_CHUNK_SIZE || DL_MIN_CHUNK_SIZE > DL_MAX_CHUNK_SIZE # error DL_MAX_CHUNK_SIZE shouldnt be <= DL_MIN_CHUNK_SIZE or <= DL_DEFAULT_CHUNK_SIZE #endif #if DL_DLMAP_SIZE < DL_MAX_CHUNK_SIZE # error DL_DLMAP_SIZE should be >= DL_MAX_CHUNK_SIZE #endif #ifndef UL_MIN_CHUNK_SIZE # define UL_MIN_CHUNK_SIZE CONF_TCP_SO_RCVBUF #endif #ifndef UL_DEFAULT_CHUNK_SIZE # define UL_DEFAULT_CHUNK_SIZE (CONF_TCP_SO_RCVBUF * 2) #endif #ifndef UL_DEFAULT_CHUNK_SIZE_ASCII # if CONF_TCP_SO_RCVBUF < 65536 # define UL_DEFAULT_CHUNK_SIZE_ASCII CONF_TCP_SO_RCVBUF # else # define UL_DEFAULT_CHUNK_SIZE_ASCII 65536UL # endif #endif #ifndef UL_MAX_CHUNK_SIZE # define UL_MAX_CHUNK_SIZE (512 * 1024UL) #endif #define VHOST_PREFIX_MAX_LEN 64 #define PUREFTPD_TMPFILE_PREFIX ".pureftpd-" #define ATOMIC_PREFIX_PREFIX PUREFTPD_TMPFILE_PREFIX "upload." #define WIN32_ANON_DIR "/ftp" #define STORAGE_PORT(X) (*storage_port(&(X))) #define STORAGE_PORT_CONST(X) (*storage_port_const(&(X))) #define STORAGE_PORT6(X) (*storage_port6(&(X))) #define STORAGE_PORT6_CONST(X) (*storage_port6_const(&(X))) #define STORAGE_SIN_ADDR(X) (storage_sin_addr(&(X))->s_addr) #define STORAGE_SIN_ADDR_CONST(X) (storage_sin_addr_const(&(X))->s_addr) #define STORAGE_SIN_ADDR6(X) (storage_sin_addr6(&(X))->s6_addr) #define STORAGE_SIN_ADDR6_CONST(X) (storage_sin_addr6_const(&(X))->s6_addr) #define STORAGE_SIN_ADDR6_NF(X) (*(storage_sin_addr6(&(X)))) #define STORAGE_SIN_ADDR6_NF_CONST(X) (*(storage_sin_addr6_const(&(X)))) #ifdef HAVE_SS_LEN # define STORAGE_LEN(X) ((X).ss_len) # define SET_STORAGE_LEN(X, Y) do { STORAGE_LEN(X) = (Y); } while(0) #elif defined(HAVE___SS_LEN) # define STORAGE_LEN(X) ((X).__ss_len) # define SET_STORAGE_LEN(X, Y) do { STORAGE_LEN(X) = (Y); } while(0) #else # define STORAGE_LEN(X) (STORAGE_FAMILY(X) == AF_INET ? sizeof(struct sockaddr_in) : sizeof(struct sockaddr_in6)) # define SET_STORAGE_LEN(X, Y) (void) 0 #endif #ifdef HAVE___SS_FAMILY # define STORAGE_FAMILY(X) ((X).__ss_family) #else # define STORAGE_FAMILY(X) ((X).ss_family) #endif #ifndef SOL_IP # define SOL_IP IPPROTO_IP #endif #ifndef SOL_TCP # define SOL_TCP IPPROTO_TCP #endif #ifndef INADDR_NONE # define INADDR_NONE 0 #endif #if !defined(O_NDELAY) && defined(O_NONBLOCK) # define O_NDELAY O_NONBLOCK #endif #ifndef FNDELAY # define FNDELAY O_NDELAY #endif #ifndef MAP_FAILED # define MAP_FAILED ((void *) -1) #endif #ifndef HAVE_STRTOULL # ifdef HAVE_STRTOQ # define strtoull(X, Y, Z) strtoq(X, Y, Z) # else # define strtoull(X, Y, Z) strtoul(X, Y, Z) # endif #endif #ifndef ULONG_LONG_MAX # define ULONG_LONG_MAX (1ULL << 63) #endif #ifdef HAVE_DIRENT_H # include #endif #ifdef HAVE_SYS_NDIR_H # include #endif #ifdef HAVE_NDIR_H # include #endif #ifdef STAT_MACROS_BROKEN # undef S_ISBLK # undef S_ISCHR # undef S_ISDIR # undef S_ISFIFO # undef S_ISLNK # undef S_ISMPB # undef S_ISMPC # undef S_ISNWK # undef S_ISREG # undef S_ISSOCK #endif /* STAT_MACROS_BROKEN. */ #ifndef S_IFMT # define S_IFMT 0170000 #endif #if !defined(S_ISBLK) && defined(S_IFBLK) # define S_ISBLK(m) (((m) & S_IFMT) == S_IFBLK) #endif #if !defined(S_ISCHR) && defined(S_IFCHR) # define S_ISCHR(m) (((m) & S_IFMT) == S_IFCHR) #endif #if !defined(S_ISDIR) && defined(S_IFDIR) # define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR) #endif #if !defined(S_ISREG) && defined(S_IFREG) # define S_ISREG(m) (((m) & S_IFMT) == S_IFREG) #endif #if !defined(S_ISFIFO) && defined(S_IFIFO) # define S_ISFIFO(m) (((m) & S_IFMT) == S_IFIFO) #endif #if !defined(S_ISLNK) && defined(S_IFLNK) # define S_ISLNK(m) (((m) & S_IFMT) == S_IFLNK) #endif #if !defined(S_ISSOCK) && defined(S_IFSOCK) # define S_ISSOCK(m) (((m) & S_IFMT) == S_IFSOCK) #endif #if !defined(S_ISMPB) && defined(S_IFMPB) /* V7 */ # define S_ISMPB(m) (((m) & S_IFMT) == S_IFMPB) # define S_ISMPC(m) (((m) & S_IFMT) == S_IFMPC) #endif #if !defined(S_ISNWK) && defined(S_IFNWK) /* HP/UX */ # define S_ISNWK(m) (((m) & S_IFMT) == S_IFNWK) #endif #ifndef S_IEXEC # define S_IEXEC S_IXUSR #endif #ifndef S_IXUSR # define S_IXUSR S_IEXEC #endif #ifndef S_IXGRP # define S_IXGRP (S_IEXEC >> 3) #endif #ifndef S_IXOTH # define S_IXOTH (S_IEXEC >> 6) #endif #ifndef S_IXUGO # define S_IXUGO (S_IXUSR | S_IXGRP | S_IXOTH) #endif #ifdef DISABLE_UNICODE_CONTROL_CHARS # define ISCTRLCODE(X) ((X) == 0x7f || !(((unsigned char) (X)) & 0x60)) #else # define ISCTRLCODE(X) ((X) == 0x7f || ((unsigned char) (X)) < 32U) #endif #ifndef HAVE_MUNMAP # define munmap(A, B) (0) #endif #ifndef HAVE_GETHOSTNAME # define gethostname(A, B) (-1) #endif #ifndef HAVE_SETEUID # ifdef HAVE_SETREUID # define seteuid(X) setreuid(-1, (X)) # elif defined(HAVE_SETRESUID) # define seteuid(X) setresuid(-1, (X), -1) # else # define seteuid(X) (-1) # endif #endif #ifndef HAVE_SETEGID # ifdef HAVE_SETREGID # define setegid(X) setregid(-1, (X)) # elif defined(HAVE_SETRESGID) # define setegid(X) setresgid(-1, (X), -1) # else # define setegid(X) (-1) # endif #endif #if defined(HAVE_DEV_URANDOM) || defined(HAVE_DEV_RANDOM) # define HAVE_RANDOM_DEV 1 #endif #define CRLF "\r\n" #ifdef WITH_DMALLOC # define _exit(X) exit(X) #endif #ifndef offsetof # define offsetof(type, member) ((size_t) &((type*) NULL)->member) #endif #include "bsd-realpath.h" #include "fakechroot.h" #endif pure-ftpd-1.0.49.orig/src/parser.c0000644000175000017500000000451313450665410015644 0ustar rackeracke /* * This is a tiny basic parser, used for LDAP, MySQL, and Postgres configuration * files, but it may be useful for future extensions as well. * -Jedi. */ #include #if defined(WITH_LDAP) || defined(WITH_MYSQL) || defined(WITH_PGSQL) # include "ftpd.h" # include "parser_p.h" # include "parser.h" # ifdef WITH_DMALLOC # include #endif int generic_parser(const char * const file, ConfigKeywords *config_keywords) { char *linepnt; char *linepnt2; FILE *fp; ConfigKeywords *config_keywords_pnt; char line[LINE_MAX]; if (file == NULL || (fp = fopen(file, "r")) == NULL) { return -1; } while (fgets(line, sizeof line, fp) != NULL) { line[sizeof line - 1U] = 0; /* paranoia */ linepnt = line; while (*linepnt != 0 && isspace((unsigned char) *linepnt)) { linepnt++; } if (ISCTRLCODE(*linepnt) || *linepnt == CONFIG_COMMENT) { continue; } config_keywords_pnt = config_keywords; do { size_t keyword_len; keyword_len = strlen(config_keywords_pnt->keyword); if (strncasecmp(config_keywords_pnt->keyword, linepnt, keyword_len) == 0) { linepnt += keyword_len; while (*linepnt != 0 && isspace((unsigned char) *linepnt)) { linepnt++; } if (*linepnt == 0) { fclose(fp); return -1; } linepnt2 = linepnt + strlen(linepnt) - 1U; while (linepnt2 != linepnt && (isspace((unsigned char) *linepnt2) || ISCTRLCODE(*linepnt2))) { linepnt2--; } linepnt2[1] = 0; /* No possible off-by-one here */ if ((*config_keywords_pnt->value = strdup(linepnt)) == NULL) { fclose(fp); return -1; } break; } config_keywords_pnt++; } while (config_keywords_pnt->keyword != NULL); if (config_keywords_pnt->keyword == NULL) { fclose(fp); return -1; } } fclose(fp); return 0; } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/messages_cs_cz.h0000644000175000017500000003421113446174132017344 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "čas vypršel" #define MSG_CAPABILITIES "Nemohu změnit privilegia" #define MSG_CLIENT_CLOSED_CNX "Klient uzavřel spojení" #define MSG_CLIENT_READ_ERR "Chyba při čtení od klienta" #define MSG_CANT_OPEN_CNX "Nemůžu vytvořit spojení" #define MSG_CANT_CREATE_DATA_SOCKET "Nemůžu vytvořit datový socket" #define MSG_DEBUG_CLIENT_IS "Klientova adresa je" #define MSG_SYNTAX_ERROR_IP "Syntaktická chyba v IP adrese" #define MSG_PORT_SUCCESSFUL "Příkaz PORT úspěšne vykonán" #define MSG_ONLY_IPV4V6 "Jsou podporovány pouze IPv4 a IPv6 (1,2)" #define MSG_ONLY_IPV4 "Podporován je pouze IPv4 (1)" #define MSG_TIMEOUT_PARSER "čas vypršel, příště zkuste psát rychleji" #define MSG_LINE_TOO_LONG "řádek je příliš dlouhý" #define MSG_LOG_OVERFLOW "Klient se pokusil přeplnit buffer pro příkazový řádek" #define MSG_GOODBYE "Nashledanou. Uploadli jste %llu a downloadli %llu kilobajtů." #define MSG_DEBUG_COMMAND "Příkaz" #define MSG_IS_YOUR_CURRENT_LOCATION "je vaše současná location" #define MSG_NOT_LOGGED_IN "Nejste přihlášen" #define MSG_AUTH_UNIMPLEMENTED "Bezpečnostní rozšíření nejsou implementovány" #define MSG_NO_FILE_NAME "žádné jméno souboru" #define MSG_NO_DIRECTORY_NAME "žádné jméno adresáře" #define MSG_NO_RESTART_POINT "žádný začátek restartu" #define MSG_ABOR_SUCCESS "Vidíte-li tohle, pak příkaz ABOR byl uspěšný" #define MSG_MISSING_ARG "Chybějící argument" #define MSG_GARBAGE_FOUND "Za hodnotou se nachází smetí" #define MSG_VALUE_TOO_LARGE "Příliš vysoká hodnota" #define MSG_IDLE_TIME "čas nečinnosti nastaven na %lu sekund" #define MSG_SITE_HELP "Nasledující SITE příkazy jsou rozeznány" #define MSG_BAD_CHMOD "Chybná přístupová práva" #define MSG_UNKNOWN_EXTENSION "je neznámé rozšíření" #define MSG_XDBG_OK "Příkaz XDBG byl úspěšný, debug úroveň nastavena na %d" #define MSG_UNKNOWN_COMMAND "Neznámý příkaz" #define MSG_TIMEOUT_NOOP "čas vypršel (žádna operace v průběhu %lu sekund)" #define MSG_TIMEOUT_DATA "čas vypršel (žádná nová data v průběhu %lu sekund)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "Už jste přihlášenej" #define MSG_ANY_PASSWORD "Můžete zatat libovolné heslo" #define MSG_ANONYMOUS_LOGGED "Přihlášen jako anonymní uživatel" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Anonymní uživatel se přihlásil ve virtuálním FTP" #define MSG_USER_OK "Uživatel %s je OK. Heslo je povinné" #define MSG_CANT_DO_TWICE "Během tohoto sezení to nemohu provést" #define MSG_UNABLE_SECURE_ANON "Nemohu nastavit bezpečné anonymní FTP" #define MSG_BANDWIDTH_RESTRICTED "Vaše přenosová rychlost je omezena" #define MSG_NO_PASSWORD_NEEDED MSG_ANY_PASSWORD #define MSG_NOTRUST "Lituji, ale nemohu Vám důvěřovat" #define MSG_WHOAREYOU "Prosím řekněte mi, kdo jste" #define MSG_AUTH_FAILED "Lituji, ale autentifikace zlyhala" #define MSG_AUTH_TOOMANY "Příliš mnoho zlyhaní autentifikace" #define MSG_NO_HOMEDIR "Domovský adresář je nepřístupný - konec" #define MSG_NO_HOMEDIR2 "%s neexistuje nebo není dosažitelný" #define MSG_START_SLASH "Začínám v /" #define MSG_USER_GROUP_ACCESS "Uživatel %s má skupinový přístup do" #define MSG_FXP_SUPPORT "Tento server podporuje FXP přenosy" #define MSG_RATIO "Musíte dodržovat poměr %u:%u (UL/DL)" #define MSG_CHROOT_FAILED "Nemohu vytvořit bezpečnou chroot() klec" #define MSG_CURRENT_DIR_IS "OK. Aktualní adresář je %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Aktualní omezený adresář je %s" #define MSG_IS_NOW_LOGGED_IN "%s je pravě přihlášen" #define MSG_CANT_CHANGE_DIR "Nemůžu přejít do adresáře %s" #define MSG_PATH_TOO_LONG "Cesta je příliš dlouhá" #define MSG_CANT_PASV "Nemůžete používat PASV na IPv4 přenosech. Použijte EPSV." #define MSG_CANT_PASSIVE "Nemohu vytvořit pasivní spojení" #define MSG_PORTS_BUSY "Všechny rezervované TCP porty jsou používány" #define MSG_GETSOCKNAME_DATA "Nemohu identifikovat lokalní datový socket" #define MSG_GETPEERNAME "Nemohu identifikovat lokalní socket" #define MSG_INVALID_IP "Lituji, ale zadali jste chybnou adresu" #define MSG_NO_EPSV "Prosím použijte klienta kompatibliního s IPv6 s podporou EPSV" #define MSG_BAD_PORT "Lituji, ale nepřipojím se na port nižší než 1024" #define MSG_NO_FXP "Neotevřu spojení na %s (pouze do %s)" #define MSG_FXP "FXP přenos : z %s na %s" #define MSG_NO_DATA_CONN "Žádné datové spojení" #define MSG_ACCEPT_FAILED "Spojení nemohlo být akceptováno" #define MSG_ACCEPT_SUCCESS "Datové spojení přijaté" #define MSG_CNX_PORT_FAILED "Nemohu vytvořit datové spojení na port %d" #define MSG_CNX_PORT "Připájím se na port %d" #define MSG_ANON_CANT_MKD "Lituji, ale anonymní uživatel nemůže vytvářet adresáře" #define MSG_ANON_CANT_RMD "Lituji, ale anonymní uživatel nemůže mazat adresáře" #define MSG_ANON_CANT_RENAME "Anonymní uživatel nemůže přesuvat/přejmenovávat soubory" #define MSG_ANON_CANT_CHANGE_PERMS "Anonymní uživatel nemůže měnit přístupová práva" #define MSG_GLOB_NO_MEMORY "Během globbingu %s došla paměť" #define MSG_PROBABLY_DENIED "(Tohle pravděpodobně znamená \"Odmítnutý přístup\")" #define MSG_GLOB_READ_ERROR "Chyba čtení při globbovaní %s" #define MSG_GLOB_NO_MATCH "Žádná shoda mezi %s v %s" #define MSG_CHMOD_FAILED "Nemohu změnit přístupová práva na %s" #define MSG_CHMOD_SUCCESS "Přístupová práva změněna na %s" #define MSG_CHMOD_TOTAL_FAILURE "Lituji, ale nemohl jsem změnit žádná přístupová práva" #define MSG_ANON_CANT_DELETE "Anonymní uživatel nemůže mazat soubory" #define MSG_ANON_CANT_OVERWRITE "Anonymní uživatel nemůže přepisovat existující soubory" #define MSG_DELE_FAILED "%s nelze smazat" #define MSG_DELE_SUCCESS "Soubor %s%s%s%s smazán" #define MSG_DELE_TOTAL_FAILURE "Žádný soubor nebyl smazán" #define MSG_LOAD_TOO_HIGH \ "Zátěž systému, když jste se přihlásil, byla %3.2f. Nedovolujeme dowloady\n" \ "anonymním uživatelům při tak vysoké zátěži. Uploady jsou vždy povoleny\n" #define MSG_OPEN_FAILURE "Nemohu otevřít %s" #define MSG_OPEN_FAILURE2 "Nemohu otevřít ten soubor" #define MSG_STAT_FAILURE "Nemohu zjistit velikost souboru" #define MSG_STAT_FAILURE2 "Nemohu ověřit existenci souboru" #define MSG_REST_TOO_LARGE_FOR_FILE "Offset %lld pro restart stahování je příliš vysoký, soubor má velikost pouze %lld." #define MSG_REST_RESET "Začátek restartu nastaven na 0" #define MSG_NOT_REGULAR_FILE "Soubor není běžný" #define MSG_NOT_MODERATED \ "Tento soubor byl uploadnut anonymním uživatelem. Administrátor serveru " \ "ho pro download zatím neschválil." #define MSG_RATIO_DENIAL \ "Lituji, ale poměr upload/download je %u:%u .\n" \ "Zatím jste uploadli %llu kilobajtů, downloadli %llu kilobajtů.\n" \ "Jestli nám tu uploadnete něco hezkého, můžete si pak na oplátku taky něco hezkého stáhnout." #define MSG_NO_MORE_TO_DOWNLOAD "Na download tu už nic není" #define MSG_WINNER "Počítač je tvůj přítel. Důvěřuj mu!" #define MSG_KBYTES_LEFT "%.1f kilobajtů na download" #define MSG_ABORTED "Přenos přerušen" #define MSG_DATA_WRITE_FAILED "Chyba během zápisu do datového spojení" #define MSG_DATA_READ_FAILED "Chyba během čtení z datového spojení" #define MSG_MMAP_FAILED "Nemůžu namapovat soubor do paměti" #define MSG_WRITE_FAILED "Chyba během zápisu do souboru" #define MSG_TRANSFER_RATE_M "%.3f sekund (měřeno zde), %.2f megabajtů za sekundu" #define MSG_TRANSFER_RATE_K "%.3f sekund (měřeno zde), %.2f kilobajtů za sekundu" #define MSG_TRANSFER_RATE_B "%.3f sekund (měřeno zde), %.2f bajtů za sekundu" #define MSG_SPACE_FREE_M "%.1f megabajtů volného diskového prostoru" #define MSG_SPACE_FREE_K "%f kilobjatů volného diskového prostoru" #define MSG_DOWNLOADED "downloadnut" #define MSG_REST_NOT_NUMERIC "REST vyžaduje číselný parametr" #define MSG_REST_ASCII_STRICT "Označení odpovědi musí být 0 v ASCII režimu" #define MSG_REST_ASCII_WORKAROUND "Pokračuji od %lld. Ale jsme v ASCII režimu" #define MSG_REST_SUCCESS "Pokračuji od %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Zakázaný název adresáře" #define MSG_SANITY_FILE_FAILURE "Zakázaný název souboru: %s" #define MSG_MKD_FAILURE "Nemohu vytvořit adresář" #define MSG_MKD_SUCCESS "Adresář byl úspěšně vytvořen" #define MSG_RMD_FAILURE "Nemohu smazat adresář" #define MSG_RMD_SUCCESS "Adresář byl úspěšně smazán" #define MSG_TIMESTAMP_FAILURE "Nemohu získat časovu značku" #define MSG_MODE_ERROR "Podporován je pouze ASCII a binární režim" #define MSG_CREATE_FAILURE "Nemohu vytvořit soubor" #define MSG_ABRT_ONLY "Příkaz ABRT je možné použít pouze během uploadu." #define MSG_UPLOAD_PARTIAL "částěčně uploadnut" #define MSG_REMOVED "odstraněn" #define MSG_UPLOADED "uploadnut" #define MSG_GMTIME_FAILURE "Nemohu zjistit lokální čas" #define MSG_TYPE_8BIT_FAILURE "Podporuju pouze 8 bitové bajty, odkud jste přišel, člověče??" #define MSG_TYPE_UNKNOWN "Neznámý TYPE" #define MSG_TYPE_SUCCESS "TYPE je nyní" #define MSG_STRU_FAILURE "Pouze F(ile) je podporován" #define MSG_MODE_FAILURE "Prosím použijte S(tream) režim" #define MSG_RENAME_ABORT "Přerušuji předešlé přejmenování" #define MSG_RENAME_RNFR_SUCCESS "Příkaz RNFR byl akceptován, soubor existuje, očekávám cíl" #define MSG_FILE_DOESNT_EXIST "Lituji, ale zadaný soubor neexistuje" #define MSG_RENAME_ALREADY_THERE "Příkaz RENAME selhal - cílový soubor již existuje" #define MSG_RENAME_NORNFR "Potřebuji RNFR před RNTO" #define MSG_RENAME_FAILURE "Chyba přemenování/přesunu" #define MSG_RENAME_SUCCESS "Soubor úspněšně přesunut/přemenován" #define MSG_NO_SUPERSERVER "Prosím spouštějte pure-ftpd ze super-serveru (například z tcpserver)" #define MSG_NO_FTP_ACCOUNT "Nemohu najít účet 'ftp'" #define MSG_CONF_ERR "Chyba konfigurace" #define MSG_NO_VIRTUAL_FILE "Chybějící soubor virtualních uživatelů" #define MSG_ILLEGAL_THROTTLING "Chybná hodnota škrcení rychlosti přenosu" #define MSG_ILLEGAL_TRUSTED_GID "Chybná důvěřovaná gid pro chroot" #define MSG_ILLEGAL_USER_LIMIT "Chybný limit uživatelů" #define MSG_ILLEGAL_FACILITY "Neznámé jméno služby" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Chybný konfigurační soubor LDAPu" #define MSG_ILLEGAL_LOAD_LIMIT "Chyný limit meze zátěže systému" #define MSG_ILLEGAL_PORTS_RANGE "Chybný rozsah portů" #define MSG_ILLEGAL_LS_LIMITS "Chybný limit pro 'ls'" #define MSG_ILLEGAL_FORCE_PASSIVE "Chybná vnucená IP pro pasivní přenosy" #define MSG_ILLEGAL_RATIO "Chybný upload/download poměr" #define MSG_ILLEGAL_UID_LIMIT "Chybný uid limit" #define MSG_ILLEGAL_OPTION "Neznámá run-time volba" #define MSG_LDAP_MISSING_BASE "Chybějící LDAPBaseDN v konfiguračním souboru LDAPu" #define MSG_LDAP_WRONG_PARMS "Chybné LDAP parametry" #define MSG_NEW_CONNECTION "Nové spojení z %s" #define MSG_WELCOME_TO "Vítejte na" #define MSG_MAX_USERS "Lituji, ale %lu (maximum) uživatelů je již přihlášených" #define MSG_NB_USERS "Jste uživatelem číslo %u z %u povolených" #define MSG_WELCOME_TIME "Lokalní čas je %02d:%02d. Port serveru je %u." #define MSG_ANONYMOUS_FTP_ONLY "Zde je povolen pouze anonymní přístup" #define MSG_RATIOS_EVERYONE "VŠICHNI UŽIVATELE MUSI DODRŽET POMER UL/DL :" #define MSG_RATIOS_ANONYMOUS "ANONYMNI UŽIVATELE MUSI DODRŽET POMER UL/DL :" #define MSG_RATIOS_RULE "na download %u MB musíte uploadnut %u MB." #define MSG_INFO_IDLE_M "Budete odpojeni po %lu minutách nečinnosti." #define MSG_INFO_IDLE_S "Budete odpojeni po %lu sekundách nečinnosti." #define MSG_CANT_READ_FILE "Lituji, nebyl jsem schopný přečíst [%s]" #define MSG_LS_TRUNCATED "Výstup zkrácen na %u shod" #define MSG_LS_SUCCESS "Spolu %u shod" #define MSG_LOGOUT "Logout." #define MSG_AUTH_FAILED_LOG "Autentifikace uživatele selhala [%s]" #define MSG_ILLEGAL_UMASK "Neplatná maska" #define MSG_STANDALONE_FAILED "Nemohu spustit samostatný server" #define MSG_NO_ANONYMOUS_LOGIN "Tohle je soukromý systém - anonymní uživatelé jsou zakázáni" #define MSG_ANONYMOUS_ANY_PASSWORD "Můžete zadat libovolné heslo" #define MSG_MAX_USERS_IP "Příliš mnoho aktivních spojení (%lu) z vaší IP" #define MSG_ACTIVE_DISABLED "Aktivní režim je vypnut" #define MSG_TRANSFER_SUCCESSFUL "Soubor byl úspěšně přenesen" #define MSG_NO_DISK_SPACE "Disk je plný, zkuste později" #define MSG_OUT_OF_MEMORY "Nedostatek paměti" #define MSG_ILLEGAL_TRUSTED_IP "Neplatná důvěřovaná IP adresa" #define MSG_NO_ASCII_RESUME "Pokračování přenosu v ASCII režime není bezpečné, soubor nejdřív smažte, prosím" #define MSG_UNKNOWN_ALTLOG "Neznámý logovací formát" #define MSG_ACCOUNT_DISABLED "Nemůžete se přihlásit jako [%s] : účet je deaktivován" #define MSG_SQL_WRONG_PARMS "Chybné SQL parametry" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Chybný konfigurační soubor SQL" #define MSG_SQL_MISSING_SERVER "V konfiguračním souboru chybí SQL server" #define MSG_SQL_DOWN "Vypadá to, že SQL server spadl" #define MSG_ILLEGAL_QUOTA "Chybná kvota" #define MSG_QUOTA_FILES "%llu souborů použitých (%d%%) - autorizovaných: %llu souborů" #define MSG_QUOTA_SIZE "%llu kilobajtů použitých (%d%%) - autorizovaných: %llu kilobajtů" #define MSG_QUOTA_EXCEEDED "Kvota překročena: [%s] nebude uložen" #define MSG_AUTH_UNKNOWN "Neznámá autentifikační metoda" #define MSG_PDB_BROKEN "Nebylo možné přečíst indexovaný soubor puredb (nebo byla detekována stará verze) - Vyzkoušejte spustit pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s je alias pro %s." #define MSG_ALIASES_UNKNOWN "Neznámý alias %s." #define MSG_ALIASES_BROKEN_FILE "Poškozen soubor s aliasy" #define MSG_ALIASES_LIST "Jsou dostupné nasledující aliasy:" #define MSG_PERUSER_MAX "Nemohu akceptovat víc než %lu připojení stejného uživatele" #define MSG_IPV6_OK "Na tento server se lze rovněž připojovat použitím IPv6 protokolu" #define MSG_TLS_INFO "TLS: Enabled %s with %s, %d secret bits cipher" #define MSG_TLS_WEAK "TLS: Cipher too weak" #define MSG_TLS_NEEDED "Sorry, cleartext sessions are not accepted on this server.\n" \ "Please reconnect using TLS security mechanisms." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Neplatný argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/diraliases.c0000644000175000017500000000677013450665410016477 0ustar rackeracke/* 0) alias file format. alternating lines of alias and dir (this enables embedded whitespace in dir and alias without quoting rules) optional blank lines optional lines beginning with '#' as comments (no you can't put a '#' just anywhere) 1) data structure for alias list nodes. typedef struct DirAlias_ { char *alias; char *dir; struct DirAlias *next; } DirAlias; 2) init routine A) open alias file B) while not EOF do read line parse line dir must begin with "/" allocate DirAlias and members if tail is NULL then head and tail (global DirAlias_t pointers) are set to member else tail->next is set to member and then tail is set to member 3) lookup routine A) given potential alias return dir or NULL (walk list starting with head looking for match) 4) FTP CWD command mods A) if chdir() fails try alias (use lookup routine) 5) FTP SITE ALIAS command A) list aliases */ #include #ifdef WITH_DIRALIASES #include "ftpd.h" #include "messages.h" #include "diraliases.h" #ifdef WITH_DMALLOC # include #endif static DirAlias *head, *tail; static signed char aliases_up; /* returns: 0 on success, -1 on failure */ int init_aliases(void) { FILE *fp; char alias[MAXALIASLEN + 1U]; char dir[PATH_MAX + 1U]; if ((fp = fopen(ALIASES_FILE, "r")) == NULL) { return 0; } while (fgets(alias, sizeof alias, fp) != NULL) { if (*alias == '#' || *alias == '\n' || *alias == 0) { continue; } { char * const z = alias + strlen(alias) - 1U; if (*z != '\n') { goto bad; } *z = 0; } do { if (fgets(dir, sizeof dir, fp) == NULL || *dir == 0) { goto bad; } { char * const z = dir + strlen(dir) - 1U; if (*z == '\n') { *z = 0; } } } while (*dir == '#' || *dir == 0); if (head == NULL) { if ((head = tail = malloc(sizeof *head)) == NULL || (tail->alias = strdup(alias)) == NULL || (tail->dir = strdup(dir)) == NULL) { die_mem(); } tail->next = NULL; } else { DirAlias *curr; if ((curr = malloc(sizeof *curr)) == NULL || (curr->alias = strdup(alias)) == NULL || (curr->dir = strdup(dir)) == NULL) { die_mem(); } tail->next = curr; tail = curr; } } fclose(fp); aliases_up++; return 0; bad: fclose(fp); logfile(LOG_ERR, MSG_ALIASES_BROKEN_FILE " [" ALIASES_FILE "]"); return -1; } char *lookup_alias(const char *alias) { const DirAlias *curr = head; if (aliases_up == 0) { return NULL; } while (curr != NULL) { if (strcmp(curr->alias, alias) == 0) { return curr->dir; } curr = curr->next; } return NULL; } void print_aliases(void) { const DirAlias *curr = head; if (aliases_up == 0) { addreply_noformat(502, MSG_CONF_ERR); return; } addreply_noformat(214, MSG_ALIASES_LIST); while (curr != NULL) { char line[MAXALIASLEN + PATH_MAX + 3U]; snprintf(line, sizeof line, " %s %s", curr->alias, curr->dir); addreply_noformat(0, line); curr = curr->next; } addreply_noformat(214, " "); } #endif pure-ftpd-1.0.49.orig/src/ipstack.c0000644000175000017500000001434213450665410016007 0ustar rackeracke /* * An IPv4-only reimplementation of getnameinfo(), getaddrinfo(), * freeaddrinfo() and inet_pton() for old IP stacks. * IPv6-enabled stacks don't need this, so we assume we have IPv4 everywhere. * * Jedi * Matthias Andree */ #include #include "ftpd.h" #ifdef OLD_IP_STACK # ifdef WITH_DMALLOC # include # endif # define DEFAULT_PROTO_NAME "tcp" /* * This is a stripped-down version of getnameinfo() * Only host names can be resolved, and NI_NOFQDN is ignored. */ # ifndef HAVE_GETNAMEINFO int getnameinfo(const struct sockaddr *sa_, socklen_t salen, char *host, size_t hostlen, char *serv, size_t servlen, int flags) { struct sockaddr_in *sa = (struct sockaddr_in *) sa_; (void) salen; if (sa == NULL || sa->sin_family != AF_INET) { return EAI_FAMILY; } if (serv != NULL && servlen > (size_t) 1U) { snprintf(serv, servlen, "%lu", (unsigned long) ntohs(sa->sin_port)); } if (host != NULL && hostlen > (size_t) 1U) { struct hostent *he; if ((flags & NI_NUMERICHOST) == 0 && (he = gethostbyaddr((const char *) &(sa->sin_addr), sizeof sa->sin_addr, AF_INET)) != NULL && he->h_name != NULL && *he->h_name != 0) { size_t h_name_len; if ((h_name_len = strlen(he->h_name)) >= hostlen) { goto resolve_numeric_ip; } memcpy(host, he->h_name, h_name_len + (size_t) 1U); } else { char * numeric_ip; size_t numeric_ip_len; resolve_numeric_ip: if ((numeric_ip = inet_ntoa(sa->sin_addr)) == NULL) { return EAI_SYSTEM; } if ((numeric_ip_len = strlen(numeric_ip)) >= hostlen) { return EAI_FAIL; } memcpy(host, numeric_ip, numeric_ip_len + (size_t) 1U); } } return 0; } # endif /* Stripped-down version of getaddrinfo() - Only one answer, no linked list */ # ifndef HAVE_GETADDRINFO int getaddrinfo(const char *node, const char *service, const struct addrinfo *hints, struct addrinfo **res) { struct addrinfo * answer; struct sockaddr_in *saddr; const char * proto_name = DEFAULT_PROTO_NAME; int socktype = SOCK_STREAM; in_port_t port = 0U; if (res == NULL) { return EAI_FAIL; } *res = NULL; if ((answer = malloc(sizeof *answer)) == NULL) { return EAI_MEMORY; } if ((saddr = malloc(sizeof *saddr)) == NULL) { free(answer); return EAI_MEMORY; } answer->ai_family = AF_INET; answer->ai_addrlen = sizeof *saddr; answer->ai_addr = (struct sockaddr *) saddr; answer->ai_next = NULL; memset(saddr, 0, sizeof *saddr); saddr->sin_family = AF_INET; # if defined(HAVE_SIN_LEN) saddr->sin_len = sizeof *saddr; # endif if (hints != NULL) { struct protoent *pe; if ((pe = getprotobynumber(hints->ai_protocol)) != NULL && pe->p_name != NULL && *pe->p_name != 0) { proto_name = pe->p_name; } if (hints->ai_socktype != 0) { socktype = hints->ai_socktype; } else if (strcasecmp(proto_name, "udp") == 0) { socktype = SOCK_DGRAM; } } if (service != NULL) { struct servent *se; if ((se = getservbyname(service, proto_name)) != NULL && se->s_port > 0) { port = se->s_port; } else if ((port = (in_port_t) strtoul(service, NULL, 0)) <= 0U || port > 65535U) { port = 0U; } } if (hints != NULL && (hints->ai_flags & AI_PASSIVE) != 0) { saddr->sin_addr.s_addr = htonl(INADDR_ANY); } if (node != NULL) { struct hostent *he; if ((he = gethostbyname(node)) != NULL && he->h_addr_list != NULL && he->h_addr_list[0] != NULL && he->h_length > 0 && he->h_length <= (int) sizeof saddr->sin_addr) { memcpy(&saddr->sin_addr, he->h_addr_list[0], he->h_length); } } answer->ai_socktype = socktype; saddr->sin_port = htons(port); *res = answer; return 0; } void freeaddrinfo(struct addrinfo *res) { if (res == NULL) { return; } free(res->ai_addr); res->ai_addr = NULL; free(res); } # endif # if !defined(HAVE_INET_PTON) && !defined(inet_pton) int inet_pton(int af, const char *src, void *dst) /* written by Matthias Andree */ { in_addr_t ina; if (af != AF_INET) { errno = EAFNOSUPPORT; return -1; } /* inet_aton would be better, but Solaris 7 e. g. doesn't have it */ ina = inet_addr(src); if (ina == 0UL) { return 0; } memcpy(dst, &ina, sizeof ina); return 1; } # endif #endif in_port_t * storage_port(struct sockaddr_storage *const ss) { struct sockaddr_in *const si = (struct sockaddr_in *) ss; return &si->sin_port; } const in_port_t * storage_port_const(const struct sockaddr_storage *const ss) { const struct sockaddr_in *const si = (const struct sockaddr_in *) ss; return &si->sin_port; } in_port_t * storage_port6(struct sockaddr_storage *const ss) { struct sockaddr_in6 *const si = (struct sockaddr_in6 *) ss; return &si->sin6_port; } const in_port_t * storage_port6_const(const struct sockaddr_storage *const ss) { const struct sockaddr_in6 *const si = (const struct sockaddr_in6 *) ss; return &si->sin6_port; } struct in_addr * storage_sin_addr(struct sockaddr_storage *const ss) { struct sockaddr_in *const si = (struct sockaddr_in *) ss; return &si->sin_addr; } const struct in_addr * storage_sin_addr_const(const struct sockaddr_storage *const ss) { const struct sockaddr_in *const si = (const struct sockaddr_in *) ss; return &si->sin_addr; } struct in6_addr * storage_sin_addr6(struct sockaddr_storage *const ss) { struct sockaddr_in6 *const si = (struct sockaddr_in6 *) ss; return &si->sin6_addr; } const struct in6_addr * storage_sin_addr6_const(const struct sockaddr_storage *const ss) { const struct sockaddr_in6 *const si = (const struct sockaddr_in6 *) ss; return &si->sin6_addr; } pure-ftpd-1.0.49.orig/src/simpleconf.h0000644000175000017500000000204513350542502016505 0ustar rackeracke#ifndef __SIMPLECONF_H__ #define __SIMPLECONF_H__ 1 #include typedef struct SimpleConfEntry_ { const char *in; const char *out; } SimpleConfEntry; typedef enum SimpleConfSpecialHandlerResult_ { SC_SPECIAL_HANDLER_RESULT_UNDEFINED, SC_SPECIAL_HANDLER_RESULT_NEXT, SC_SPECIAL_HANDLER_RESULT_ERROR, SC_SPECIAL_HANDLER_RESULT_INCLUDE, } SimpleConfSpecialHandlerResult; typedef SimpleConfSpecialHandlerResult (*SimpleConfSpecialHandler) (void **output_p, const char *arg, void *user_data); typedef struct SimpleConfConfig_ { void *user_data; SimpleConfSpecialHandler special_handler; } SimpleConfConfig; int sc_build_command_line_from_file(const char *file_name, const SimpleConfConfig *config, const SimpleConfEntry entries[], size_t entries_count, char *app_name, int *argc_p, char ***argv_p); void sc_argv_free(int argc, char *argv[]); #endif pure-ftpd-1.0.49.orig/src/log_extauth.h0000644000175000017500000000341713446205705016704 0ustar rackeracke#ifndef __LOG_EXTAUTH_H__ #define __LOG_EXTAUTH_H__ 1 #ifdef WITH_EXTAUTH void pw_extauth_parse(const char * const file); void pw_extauth_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer); void pw_extauth_exit(void); #define EXTAUTH_KEYWORD_SEP ":" #define EXTAUTH_CLIENT_ACCOUNT "account" EXTAUTH_KEYWORD_SEP #define EXTAUTH_CLIENT_PASSWORD "password" EXTAUTH_KEYWORD_SEP #define EXTAUTH_CLIENT_SA_HOST "localhost" EXTAUTH_KEYWORD_SEP #define EXTAUTH_CLIENT_SA_PORT "localport" EXTAUTH_KEYWORD_SEP #define EXTAUTH_CLIENT_PEER_HOST "peer" EXTAUTH_KEYWORD_SEP #define EXTAUTH_CLIENT_ENCRYPTED "encrypted" EXTAUTH_KEYWORD_SEP #define EXTAUTH_CLIENT_SNI_NAME "sni_name" EXTAUTH_KEYWORD_SEP #define EXTAUTH_CLIENT_END "end" #define EXTAUTH_REPLY_AUTH_OK "auth_ok" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_UID "uid" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_GID "gid" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_DIR "dir" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_SLOW_TILDE_EXPANSION "slow_tilde_expansion" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_THROTTLING_BANDWIDTH_UL "throttling_bandwidth_ul" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_THROTTLING_BANDWIDTH_DL "throttling_bandwidth_dl" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_USER_QUOTA_SIZE "user_quota_size" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_USER_QUOTA_FILES "user_quota_files" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_RATIO_UPLOAD "ratio_upload" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_RATIO_DOWNLOAD "ratio_download" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_PER_USER_MAX "per_user_max" EXTAUTH_KEYWORD_SEP #define EXTAUTH_REPLY_END "end" #endif #endif pure-ftpd-1.0.49.orig/src/fakechroot.c0000644000175000017500000002625213450665410016501 0ustar rackeracke#include #define FAKECHROOT_FUNCS_DEFINITION 1 #ifdef WITH_VIRTUAL_CHROOT # include "ftpd.h" # ifdef WITH_DMALLOC # include # endif static char curdir[PATH_MAX]; static char *chroot_base; static size_t chroot_len; int fakechroot(const char *path) { char *z; if (path == NULL || *path == 0) { # ifdef EINVAL errno = EINVAL; # endif return -1; } free(chroot_base); chroot_base = NULL; if (path[0] == '/' && path[1] == 0) { /* chroot("/") => no chroot */ return 0; } if ((chroot_base = strdup(path)) == NULL) { return -1; } simplify(chroot_base); z = chroot_base; while (*z != 0) { z++; } for (;;) { z--; if (z == chroot_base || *z != '/') { break; } *z = 0; } if ((chroot_len = strlen(chroot_base)) >= sizeof curdir) { # ifdef ENAMETOOLONG errno = ENAMETOOLONG; # endif return -1; } return 0; } char *fakegetcwd(char *dir, size_t size) { char *curdirchr; size_t s; if (chroot_base == NULL) { return getcwd(dir, size); } if (strncmp(curdir, chroot_base, chroot_len) != 0) { abort(); } curdirchr = curdir + chroot_len; s = strlen(curdirchr); if (s <= (size_t) 0U) { # ifdef EFAULT errno = EFAULT; # endif return NULL; } { char *sp = curdirchr + s - 1U; while (sp != curdirchr && *sp == '/') { *sp = 0; s--; } } s++; if (s > size || s < (size_t) 2U) { # ifdef ENAMETOOLONG errno = ENAMETOOLONG; # endif return NULL; } memcpy(dir, curdirchr, s); return curdirchr; } static int fakexlate(char *curdirtmp, size_t sizeof_curdirtmp, const char *dir) { char *sl; size_t curdirlen; if ((curdirlen = strlen(curdir)) >= sizeof_curdirtmp) { return -1; } memcpy(curdirtmp, curdir, curdirlen + (size_t) 1U); simplify(curdirtmp); loop: if (dir[0] == '.' && dir[1] == '.' && (dir[2] == 0 || dir[2] == '/')) { if ((sl = strrchr(curdirtmp, '/')) != NULL) { *sl = 0; } else { *curdirtmp = 0; } if (strncmp(curdirtmp, chroot_base, chroot_len) != 0 || curdirtmp[chroot_len] != '/') { snprintf(curdirtmp, sizeof_curdirtmp, "%s/", chroot_base); } if (dir[0] == '.' && dir[1] == '.' && dir[2] == '/') { dir += 3; goto loop; } } else if (*dir == '/') { snprintf(curdirtmp, sizeof_curdirtmp, "%s/", chroot_base); dir++; goto loop; } else if (*dir != 0) { size_t dirlen; size_t curdirtmplen; if ((dir[0] == '.' && dir[1] == '.' && (dir[2] == 0 || dir[2] == '/')) || strstr(dir, "/../") != NULL) { perm: # ifdef EPERM errno = EPERM; # endif return -1; } dirlen = strlen(dir) + (size_t) 1U; if (dirlen >= (size_t) 4U && (dir[dirlen - 2U] == '.' && dir[dirlen - 3U] == '.' && dir[dirlen - 4U] == '/')) { goto perm; } curdirtmplen = strlen(curdirtmp); if (curdirtmplen + dirlen >= sizeof_curdirtmp) { # ifdef ENAMETOOLONG errno = ENAMETOOLONG; # endif return -1; } curdirtmp[curdirtmplen] = '/'; memcpy(curdirtmp + curdirtmplen + 1U, dir, dirlen); } simplify(curdirtmp); return 0; } int fakechdir(const char *dir) { char curdirtmp[PATH_MAX]; size_t curdirtmplen; if (chroot_base == NULL) { return chdir(dir); } if (fakexlate(curdirtmp, sizeof curdirtmp, dir) != 0) { return -1; } if (chdir(curdirtmp) != 0) { return -1; } if ((curdirtmplen = strlen(curdirtmp)) >= sizeof curdir) { return -1; } memcpy(curdir, curdirtmp, curdirtmplen + (size_t) 1U); return 0; } int fakestat(const char *file, struct stat *st) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return stat(file, st); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return stat(curdirtmp, st); } int fakelstat(const char *file, struct stat *st) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return lstat(file, st); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return lstat(curdirtmp, st); } FILE *fakefopen(const char *file, const char *mode) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return fopen(file, mode); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return NULL; } return fopen(curdirtmp, mode); } int fakeaccess(const char *file, int mode) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return access(file, mode); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return access(curdirtmp, mode); } int fakeunlink(const char *file) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return unlink(file); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return unlink(curdirtmp); } DIR *fakeopendir(const char *file) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return opendir(file); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return NULL; } return opendir(curdirtmp); } int fakechmod(const char *file, mode_t mode) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return chmod(file, mode); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return chmod(curdirtmp, mode); } int fakemkdir(const char *file, mode_t mode) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return mkdir(file, mode); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return mkdir(curdirtmp, mode); } int fakermdir(const char *file) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return rmdir(file); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return rmdir(curdirtmp); } # ifdef HAVE_UTIME int fakeutime(const char *file, struct utimbuf *buf) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return utime(file, buf); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return utime(curdirtmp, buf); } # endif # ifdef HAVE_UTIMES int fakeutimes(const char *file, struct timeval *buf) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return utimes(file, buf); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return utimes(curdirtmp, buf); } # endif int fakechown(const char *file, uid_t uid, gid_t gid) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return chown(file, uid, gid); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return chown(file, uid, gid); } # ifdef HAVE_MKFIFO int fakemkfifo(const char *file, mode_t mode) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return mkfifo(file, mode); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return mkfifo(file, mode); } # endif # ifdef HAVE_MKNOD int fakemknod(const char *file, mode_t mode, dev_t dev) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return mknod(file, mode, dev); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return mknod(file, mode, dev); } # endif int fakelink(const char *oldpath, const char *newpath) { char curdirtmp[PATH_MAX]; char curdirtmp2[PATH_MAX]; if (chroot_base == NULL) { return link(oldpath, newpath); } if (fakexlate(curdirtmp, sizeof curdirtmp, oldpath) != 0 || fakexlate(curdirtmp2, sizeof curdirtmp2, newpath) != 0) { return -1; } return link(curdirtmp, curdirtmp2); } int fakesymlink(const char *oldpath, const char *newpath) { char curdirtmp[PATH_MAX]; char curdirtmp2[PATH_MAX]; if (chroot_base == NULL) { return symlink(oldpath, newpath); } if (fakexlate(curdirtmp, sizeof curdirtmp, oldpath) != 0 || fakexlate(curdirtmp2, sizeof curdirtmp2, newpath) != 0) { return -1; } return symlink(curdirtmp, curdirtmp2); } int fakereadlink(const char *file, char *buf, size_t bufsiz) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return readlink(file, buf, bufsiz); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return -1; } return readlink(file, buf, bufsiz); } int fakerename(const char *oldpath, const char *newpath) { char curdirtmp[PATH_MAX]; char curdirtmp2[PATH_MAX]; if (chroot_base == NULL) { return rename(oldpath, newpath); } if (fakexlate(curdirtmp, sizeof curdirtmp, oldpath) != 0 || fakexlate(curdirtmp2, sizeof curdirtmp2, newpath) != 0) { return -1; } return rename(curdirtmp, curdirtmp2); } /* * Promotion of mode_t is problematic. For instance, on MacOS X, * mode_t is an unsigned short. */ # if SIZEOF_MODE_T <= 0 # define VA_ARG_MODE_T unsigned int # elif SIZEOF_MODE_T <= SIZEOF_INT # define VA_ARG_MODE_T unsigned int # elif SIZEOF_MODE_T <= SIZEOF_LONG # define VA_ARG_MODE_T unsigned long # elif SIZEOF_MODE_T <= SIZEOF_LONG_LONG # define VA_ARG_MODE_T unsigned long long # else # define VA_ARG_MODE_T mode_t # endif int fakeopen(const char *file, int flags, ...) { va_list va; mode_t mode; char curdirtmp[PATH_MAX]; va_start(va, flags); if (chroot_base == NULL) { if ((flags & O_CREAT) != 0) { mode = va_arg(va, VA_ARG_MODE_T); va_end(va); return open(file, flags, mode); } va_end(va); return open(file, flags); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { va_end(va); return -1; } if ((flags & O_CREAT) != 0) { mode = va_arg(va, VA_ARG_MODE_T); va_end(va); return open(curdirtmp, flags, mode); } va_end(va); return open(curdirtmp, flags); } char *fakerealpath(const char *file, char *resolved_path) { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return realpath(file, resolved_path); } if (fakexlate(curdirtmp, sizeof curdirtmp, file) != 0) { return NULL; } return realpath(curdirtmp, resolved_path); } # if STATFS_TYPE == 1 int fakestatvfs64(const char *path, STATFS_STRUCT *str) # elif STATFS_TYPE == 2 int fakestatvfs(const char *path, STATFS_STRUCT *str) # elif STATFS_TYPE == 3 int fakestatfs(const char *path, STATFS_STRUCT *str) # endif # if STATFS_TYPE > 0 { char curdirtmp[PATH_MAX]; if (chroot_base == NULL) { return STATFS(path, str); } if (fakexlate(curdirtmp, sizeof curdirtmp, path) != 0) { return -1; } return STATFS(curdirtmp, str); } # endif #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/dynamic.c0000644000175000017500000000604513450665410015776 0ustar rackeracke#include #ifndef NO_STANDALONE # include "ftpd.h" # include "dynamic.h" # include "ftpwho-update.h" # include "globals.h" # ifdef WITH_DMALLOC # include # endif static IPTrack *iptrack_list; void iptrack_delete_pid(const pid_t pid) { unsigned int c = 0U; if (iptrack_list == NULL) { return; } do { if (iptrack_list[c].pid == pid) { iptrack_list[c].pid = (pid_t) 0; return; } c++; } while (c < maxusers); } void iptrack_free(void) { free(iptrack_list); iptrack_list = NULL; } static unsigned int iptrack_find_ip_or_shift (const struct sockaddr_storage * const ip) { unsigned int c = 0U; do { if (iptrack_list[c].pid != (pid_t) 0 && STORAGE_FAMILY(iptrack_list[c].ip) != STORAGE_FAMILY(*ip)) { if (STORAGE_FAMILY(iptrack_list[c].ip) == AF_INET && STORAGE_SIN_ADDR_CONST(iptrack_list[c].ip) == STORAGE_SIN_ADDR_CONST(*ip)) { return c; } else if (STORAGE_FAMILY(iptrack_list[c].ip) == AF_INET6 && IN6_ARE_ADDR_EQUAL (&STORAGE_SIN_ADDR6_NF_CONST(iptrack_list[c].ip), &STORAGE_SIN_ADDR6_NF_CONST(*ip))) { return c; } } c++; } while (c < maxusers); c--; if (c != 0U) { memmove(&(iptrack_list[0]), &(iptrack_list[1]), /* safe */ (sizeof iptrack_list[0]) * c); } return c; } unsigned int iptrack_get(const struct sockaddr_storage * const ip) { unsigned int c = 0U; unsigned int nb = 0U; if (iptrack_list == NULL) { return 0U; } do { if (iptrack_list[c].pid != (pid_t) 0 && STORAGE_FAMILY(iptrack_list[c].ip) == STORAGE_FAMILY(*ip)) { if (STORAGE_FAMILY(iptrack_list[c].ip) == AF_INET && STORAGE_SIN_ADDR_CONST(iptrack_list[c].ip) == STORAGE_SIN_ADDR_CONST(*ip)) { nb++; } else if (STORAGE_FAMILY(iptrack_list[c].ip) == AF_INET6 && IN6_ARE_ADDR_EQUAL (&STORAGE_SIN_ADDR6_NF_CONST(iptrack_list[c].ip), &STORAGE_SIN_ADDR6_NF_CONST(*ip))) { nb++; } } c++; } while (c < maxusers); return nb; } void iptrack_add(const struct sockaddr_storage * const ip, const pid_t pid) { unsigned int c = 0U; if (iptrack_list == NULL) { unsigned int ci = 0U; if ((iptrack_list = malloc(maxusers * sizeof *iptrack_list)) == NULL) { return; } do { iptrack_list[ci].pid = (pid_t) 0; ci++; } while (ci < maxusers); } do { if (iptrack_list[c].pid == (pid_t) 0U) { force: iptrack_list[c].pid = pid; iptrack_list[c].ip = *ip; return; } c++; } while (c < maxusers); c = iptrack_find_ip_or_shift(ip); goto force; } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/bonjour.c0000644000175000017500000000263613450665407016040 0ustar rackeracke#include #ifdef WITH_BONJOUR # include "ftpd.h" # include "bonjour.h" # include # ifdef WITH_DMALLOC # include # endif static DNSServiceRef service_ref; static void reg_reply(DNSServiceRef sdRef, DNSServiceFlags flags, DNSServiceErrorType errorCode, const char *name, const char *regtype, const char *domain, void *context) { (void) sdRef; (void) flags; (void) errorCode; (void) name; (void) regtype; (void) domain; (void) context; } void doregistration(const char *name, unsigned long port) { DNSServiceRegister(&service_ref, 0, 0, name, "_ftp._tcp.", NULL, NULL, port, 0, NULL, reg_reply, NULL); } # ifdef __APPLE_CC__ void refreshManager(void) { CFStringRef observedObject = CFSTR("org.pureftpd.osx"); CFNotificationCenterRef center = CFNotificationCenterGetDistributedCenter(); CFNotificationCenterPostNotification(center, CFSTR("refreshStatus"), observedObject, NULL /* no dictionary */, TRUE); } # else void refreshManager(void) { /* ... */ } # endif #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/log_mysql.h0000644000175000017500000000156213350542502016357 0ustar rackeracke#ifndef __LOG_MYSQL_H__ #define __LOG_MYSQL_H__ 1 #define PASSWD_SQL_ARGON2 "argon2" #define PASSWD_SQL_SCRYPT "scrypt" #define PASSWD_SQL_CRYPT "crypt" #define PASSWD_SQL_CLEARTEXT "cleartext" #define PASSWD_SQL_MYSQL "password" #define PASSWD_SQL_MD5 "md5" #define PASSWD_SQL_SHA1 "sha1" #define PASSWD_SQL_ANY "any" #define MYSQL_DEFAULT_SERVER "localhost" #define MYSQL_DEFAULT_PORT 3306 #define MYSQL_MAX_REQUEST_LENGTH ((size_t) 8192U) #define MYSQL_TRANSACTION_START "set autocommit=0" #define MYSQL_TRANSACTION_END "COMMIT" #define MYSQL_CRYPT_LEN 17U void pw_mysql_parse(const char * const file); void pw_mysql_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer); void pw_mysql_exit(void); #endif pure-ftpd-1.0.49.orig/src/mysnprintf.h0000644000175000017500000000142313350542502016556 0ustar rackeracke#ifndef __MYSNPRINTF_H__ #define __MYSNPRINTF_H__ 1 int workaround_snprintf(char *str, size_t size, const char *format, ...); #ifndef HAVE_SNPRINTF # include "fakesnprintf.h" #endif #ifdef CONF_SNPRINTF_TYPE # if CONF_SNPRINTF_TYPE == 8 # define SNPRINTF_C99 1 # elif CONF_SNPRINTF_TYPE <= 0 # define SNPRINTF_OLD 1 # define SNPRINTF_IS_BOGUS 1 # else # define SNPRINTF_IS_BOGUS 1 # endif #else # warning Unknown snprintf() type # define SNPRINTF_IS_BOGUS 1 #endif #if CONF_SNPRINTF_TYPE < 0 # define SNCHECK(CALL, SIZE) ((CALL) < 0) #elif defined(SNPRINTF_IS_BOGUS) || !defined(SNPRINTF_C99) || \ CONF_SNPRINTF_TYPE == 4 || CONF_SNPRINTF_TYPE == 8 # define SNCHECK(CALL, SIZE) ((CALL) >= ((int) (SIZE))) #else # define SNCHECK(CALL, SIZE) (workaround_ ## CALL) #endif #endif pure-ftpd-1.0.49.orig/src/simpleconf.c0000644000175000017500000005146413450665410016516 0ustar rackeracke#include #include #include #include #include #include #include "simpleconf.h" #ifndef SC_MAX_ARG_LENGTH # define SC_MAX_ARG_LENGTH 65536 #endif #ifndef SC_MAX_RECURSION # define SC_MAX_RECURSION 16 #endif typedef enum State_ { STATE_UNDEFINED, STATE_PROPNAME, STATE_AFTERPROPNAME, STATE_AFTERPROPNAME2, STATE_AFTERPROPNAMESEP, STATE_RCHAR, STATE_MATCH_ALPHA, STATE_MATCH_ALNUM, STATE_MATCH_DIGITS, STATE_MATCH_XDIGITS, STATE_MATCH_NOSPACE, STATE_MATCH_ANY, STATE_MATCH_ANY_WITHINQUOTES, STATE_MATCH_ANY_AFTERQUOTES, STATE_MATCH_ANY_WITHOUTQUOTES, STATE_MATCH_ANY_UNQUOTED, STATE_MATCH_SPACES, STATE_MATCH_BOOLEAN, STATE_TEMPLATE_UNDEFINED, STATE_TEMPLATE_RCHAR, STATE_TEMPLATE_SUBST_ESC } State; typedef struct Match_ { const char *str; size_t str_len; } Match; typedef enum EntryResult_ { ENTRYRESULT_UNDEFINED, ENTRYRESULT_OK, ENTRYRESULT_IGNORE, ENTRYRESULT_PROPNOTFOUND, ENTRYRESULT_MISMATCH, ENTRYRESULT_SYNTAX, ENTRYRESULT_INVALID_ENTRY, ENTRYRESULT_INTERNAL, ENTRYRESULT_E2BIG, ENTRYRESULT_SPECIAL } EntryResult; static const char * skip_spaces(const char *str) { while (*str != 0 && isspace((unsigned char)*str)) { str++; } return str; } static int prefix_match(const char **str, const char *prefix) { size_t prefix_len = strlen(prefix); size_t str_len = strlen(*str); size_t i; int x = 0; if (str_len < prefix_len) { return 0; } for (i = 0; i < prefix_len; i++) { x |= tolower((unsigned char)(*str)[i]) ^ tolower((unsigned char)prefix[i]); } if (x == 0) { *str += prefix_len; return 1; } return 0; } static int add_to_matches(Match *const matches, size_t *matches_len, const char *start, const char *end) { size_t len; start = skip_spaces(start); len = (size_t)(end - start); while (len > 0 && isspace((unsigned char)start[len - 1])) { len--; } if (len == 0) { return -1; } matches[*matches_len].str = start; matches[*matches_len].str_len = len; (*matches_len)++; return 0; } static EntryResult err_mismatch(const char **err_p, const char *line_pnt, const char *line) { *err_p = *line_pnt != 0 ? line_pnt : line; return ENTRYRESULT_MISMATCH; } static EntryResult err_syntax(const char **err_p, const char *line_pnt, const char *line) { *err_p = *line_pnt != 0 ? line_pnt : line; return ENTRYRESULT_SYNTAX; } static EntryResult try_entry(const SimpleConfEntry *const entry, const char *line, char **arg_p, const char **err_p) { const char *in_pnt; const char *line_pnt; const char *match_start = NULL; const char *out_pnt; const char *prop_name = NULL; const char *wildcard_start = NULL; char * arg; Match matches[10]; size_t arg_len; size_t matches_len; size_t wildcard_len; State state = STATE_UNDEFINED; int expect_char; int is_boolean; int is_enabled; int is_special; int c = 0; int d = 0; *err_p = NULL; *arg_p = NULL; line = skip_spaces(line); if (*line == 0 || *line == '#') { return ENTRYRESULT_IGNORE; } in_pnt = entry->in; line_pnt = line; prop_name = in_pnt; matches_len = 0; expect_char = 0; is_boolean = 0; is_enabled = 0; is_special = 0; state = STATE_PROPNAME; while (*in_pnt != 0 || *line_pnt != 0) { c = *(const unsigned char *)line_pnt; d = *(const unsigned char *)in_pnt; switch (state) { case STATE_PROPNAME: if (isspace(d)) { in_pnt++; state = STATE_AFTERPROPNAME; } else if (d == '?' && is_boolean == 0) { is_boolean = 1; in_pnt++; } else if (d == '!' && is_special == 0) { is_special = 1; in_pnt++; } else if (c != 0 && d != 0 && tolower(c) == tolower(d)) { in_pnt++; line_pnt++; } else { return ENTRYRESULT_PROPNOTFOUND; } continue; case STATE_AFTERPROPNAME: if (c == '=' || c == ':') { state = STATE_AFTERPROPNAMESEP; line_pnt++; } else if (isspace(c)) { state = STATE_AFTERPROPNAME2; line_pnt++; } else { return err_syntax(err_p, line_pnt, line); } continue; case STATE_AFTERPROPNAME2: if (c == '=' || c == ':') { state = STATE_AFTERPROPNAMESEP; line_pnt++; } else if (isspace(c)) { line_pnt++; } else { state = STATE_AFTERPROPNAMESEP; } continue; case STATE_AFTERPROPNAMESEP: if (c == '=' || c == ':') { return err_syntax(err_p, line_pnt, line); } else if (isspace(c)) { line_pnt++; } else { if (*in_pnt == 0 || in_pnt == prop_name) { return err_syntax(err_p, line_pnt, line); } wildcard_start = line_pnt; state = STATE_RCHAR; } continue; case STATE_RCHAR: if (d == 0) { return err_mismatch(err_p, line_pnt, line); } else if (d == '(') { match_start = line_pnt; in_pnt++; } else if (d == ')') { if (match_start == NULL || matches_len >= (sizeof matches) / (sizeof matches[0]) || add_to_matches(matches, &matches_len, match_start, line_pnt) != 0) { return err_mismatch(err_p, line, line); } in_pnt++; } else if (prefix_match(&in_pnt, "")) { expect_char = 1; state = STATE_MATCH_ALPHA; } else if (prefix_match(&in_pnt, "")) { expect_char = 1; state = STATE_MATCH_ALNUM; } else if (prefix_match(&in_pnt, "")) { expect_char = 1; state = STATE_MATCH_DIGITS; } else if (prefix_match(&in_pnt, "")) { expect_char = 1; state = STATE_MATCH_XDIGITS; } else if (prefix_match(&in_pnt, "")) { expect_char = 1; state = STATE_MATCH_NOSPACE; } else if (prefix_match(&in_pnt, "")) { expect_char = 1; state = STATE_MATCH_ANY; } else if (prefix_match(&in_pnt, "")) { expect_char = 1; state = STATE_MATCH_ANY_UNQUOTED; } else if (prefix_match(&in_pnt, "")) { if (is_enabled) { return ENTRYRESULT_INVALID_ENTRY; } state = STATE_MATCH_BOOLEAN; } else if (d == '<') { return ENTRYRESULT_INVALID_ENTRY; } else if (isspace(d)) { in_pnt++; expect_char = 1; state = STATE_MATCH_SPACES; } else if (isgraph(d)) { if (c == d) { in_pnt++; line_pnt++; } else { return err_mismatch(err_p, line_pnt, line); } } else { return err_mismatch(err_p, line_pnt, line); } continue; case STATE_MATCH_ALPHA: if (isalpha(c)) { expect_char = 0; line_pnt++; } else { state = STATE_RCHAR; } continue; case STATE_MATCH_ALNUM: if (isalnum(c)) { expect_char = 0; line_pnt++; } else { state = STATE_RCHAR; } continue; case STATE_MATCH_DIGITS: if (isdigit(c)) { expect_char = 0; line_pnt++; } else { state = STATE_RCHAR; } continue; case STATE_MATCH_XDIGITS: if (isxdigit(c)) { line_pnt++; } else { state = STATE_RCHAR; } continue; case STATE_MATCH_NOSPACE: if (isgraph(c)) { expect_char = 0; line_pnt++; } else { state = STATE_RCHAR; } continue; case STATE_MATCH_ANY: if (c == '"') { if (match_start == line_pnt) { match_start++; } else if (match_start != NULL) { return ENTRYRESULT_INVALID_ENTRY; } line_pnt++; state = STATE_MATCH_ANY_WITHINQUOTES; } else if (isgraph(c)) { expect_char = 0; line_pnt++; state = STATE_MATCH_ANY_WITHOUTQUOTES; } else { state = STATE_RCHAR; } continue; case STATE_MATCH_ANY_WITHINQUOTES: if (c == '"') { state = STATE_MATCH_ANY_AFTERQUOTES; } else if (isprint(c)) { expect_char = 0; line_pnt++; } else { return err_syntax(err_p, line_pnt, line); } continue; case STATE_MATCH_ANY_AFTERQUOTES: if (d == ')') { if (match_start == NULL || matches_len >= (sizeof matches) / (sizeof matches[0]) || add_to_matches(matches, &matches_len, match_start, line_pnt) != 0) { return err_mismatch(err_p, line, line); } match_start = NULL; line_pnt++; in_pnt++; } state = STATE_RCHAR; continue; case STATE_MATCH_ANY_UNQUOTED: if (isprint(c)) { expect_char = 0; line_pnt++; } else { state = STATE_RCHAR; } continue; case STATE_MATCH_ANY_WITHOUTQUOTES: if (isgraph(c)) { expect_char = 0; line_pnt++; } else { state = STATE_RCHAR; } continue; case STATE_MATCH_SPACES: if (isspace(c)) { expect_char = 0; line_pnt++; } else { state = STATE_RCHAR; } continue; case STATE_MATCH_BOOLEAN: { if (prefix_match(&line_pnt, "yes") || prefix_match(&line_pnt, "on") || prefix_match(&line_pnt, "true") || prefix_match(&line_pnt, "1")) { is_enabled = 1; state = STATE_RCHAR; } else if (prefix_match(&line_pnt, "no") || prefix_match(&line_pnt, "off") || prefix_match(&line_pnt, "false") || prefix_match(&line_pnt, "0")) { is_enabled = 0; state = STATE_RCHAR; } else { return err_syntax(err_p, line_pnt, line); } continue; } default: return ENTRYRESULT_INVALID_ENTRY; } } switch (state) { case STATE_RCHAR: case STATE_MATCH_ALPHA: case STATE_MATCH_ALNUM: case STATE_MATCH_DIGITS: case STATE_MATCH_XDIGITS: case STATE_MATCH_NOSPACE: case STATE_MATCH_ANY: case STATE_MATCH_ANY_AFTERQUOTES: case STATE_MATCH_ANY_WITHOUTQUOTES: case STATE_MATCH_ANY_UNQUOTED: case STATE_MATCH_SPACES: case STATE_MATCH_BOOLEAN: break; default: return err_mismatch(err_p, line_pnt, line); } if (expect_char != 0) { return err_mismatch(err_p, line_pnt, line); } if (*in_pnt == ')') { if (match_start == NULL || matches_len >= (sizeof matches) / (sizeof matches[0]) || add_to_matches(matches, &matches_len, match_start, line_pnt) != 0) { return ENTRYRESULT_SYNTAX; } match_start = NULL; } if (is_boolean != 0 && is_enabled == 0) { return ENTRYRESULT_IGNORE; } if (wildcard_start == NULL) { wildcard_len = 0; } else { wildcard_len = (size_t) (line_pnt - wildcard_start); } out_pnt = entry->out; if ((arg = malloc(SC_MAX_ARG_LENGTH + 1)) == NULL) { return ENTRYRESULT_INTERNAL; } arg_len = 0; state = STATE_TEMPLATE_RCHAR; while (arg_len < SC_MAX_ARG_LENGTH && *out_pnt != 0) { d = *(const unsigned char *)out_pnt; switch (state) { case STATE_TEMPLATE_RCHAR: if (d == '$') { out_pnt++; state = STATE_TEMPLATE_SUBST_ESC; } else { arg[arg_len] = (char)d; arg_len++; out_pnt++; } continue; case STATE_TEMPLATE_SUBST_ESC: if (d == '*') { size_t i = 0; while (arg_len < SC_MAX_ARG_LENGTH && i < wildcard_len) { arg[arg_len++] = wildcard_start[i++]; } out_pnt++; state = STATE_TEMPLATE_RCHAR; } else if (d >= '0' && d <= '9') { size_t match_id = (size_t)(d - '0'); size_t i = 0; if (match_id >= matches_len) { return ENTRYRESULT_INVALID_ENTRY; } while ( arg_len < SC_MAX_ARG_LENGTH && i < matches[match_id].str_len) { arg[arg_len++] = matches[match_id].str[i++]; } out_pnt++; state = STATE_TEMPLATE_RCHAR; } else { free(arg); return ENTRYRESULT_INVALID_ENTRY; } continue; default: abort(); } } if (arg_len >= SC_MAX_ARG_LENGTH) { free(arg); errno = E2BIG; return ENTRYRESULT_E2BIG; } arg[arg_len] = 0; *arg_p = arg; if (is_special) { return ENTRYRESULT_SPECIAL; } return ENTRYRESULT_OK; } static char * chomp(char *str) { size_t i = strlen(str); int c; if (i == 0) { return str; } do { i--; c = (unsigned char) str[i]; if (isspace(c)) { str[i] = 0; } else { break; } } while (i != 0); return str; } void sc_argv_free(int argc, char *argv[]) { int i; for (i = 0; i < argc; i++) { free(argv[i]); } free(argv); } static int append_to_command_line_from_file(const char *file_name, const SimpleConfConfig *config, const SimpleConfEntry entries[], size_t entries_count, int *argc_p, char ***argv_p, unsigned int depth) { char line[SC_MAX_ARG_LENGTH]; FILE *fp = NULL; char *arg; char **argv_tmp; const char *err = NULL; const char *err_tmp; size_t i; unsigned int line_count = 0; int try_next = 1; if (depth >= SC_MAX_RECURSION) { fprintf(stderr, "[%s]: too many levels of recursion\n", file_name); return -1; } if ((fp = fopen(file_name, "r")) == NULL) { fprintf(stderr, "Unable to open [%s]: %s\n", file_name, strerror(errno)); return -1; } while (fgets(line, (int)(sizeof line), fp) != NULL) { chomp(line); line_count++; for (i = 0; i < entries_count; i++) { try_next = 1; switch (try_entry(&entries[i], line, &arg, &err_tmp)) { case ENTRYRESULT_IGNORE: try_next = 0; break; case ENTRYRESULT_PROPNOTFOUND: break; case ENTRYRESULT_E2BIG: fclose(fp); return -1; case ENTRYRESULT_INVALID_ENTRY: fprintf(stderr, "Bogus rule: [%s]\n", entries[i].in); abort(); case ENTRYRESULT_INTERNAL: fclose(fp); return -1; case ENTRYRESULT_MISMATCH: err = err_tmp; continue; case ENTRYRESULT_SYNTAX: { err = err_tmp; if (err != NULL && *err != 0) { fprintf(stderr, "%s:%u:%u: syntax error line %u: [%s].\n", file_name, line_count, (unsigned int)(err - line + 1), line_count, err); } else { fprintf(stderr, "%s:%u:1: syntax error line %u: [%s].\n", file_name, line_count, line_count, line); } fclose(fp); return -1; } case ENTRYRESULT_OK: try_next = 0; if (arg == NULL || *arg == 0) { free(arg); break; } if (*argc_p >= INT_MAX / (int)(sizeof *arg)) { abort(); } if ((argv_tmp = realloc(*argv_p, (sizeof arg) * ((size_t) *argc_p + 1))) == NULL) { free(arg); fclose(fp); return -1; } *argv_p = argv_tmp; (*argv_p)[(*argc_p)++] = arg; break; case ENTRYRESULT_SPECIAL: { char *output = NULL; SimpleConfSpecialHandlerResult special_result; try_next = 0; if (config == NULL || config->special_handler == NULL) { fprintf(stderr, "Undefined handler for special keywords\n"); abort(); } special_result = config->special_handler((void **) &output, arg, config->user_data); if (special_result == SC_SPECIAL_HANDLER_RESULT_NEXT) { free(arg); break; } else if (special_result == SC_SPECIAL_HANDLER_RESULT_ERROR) { free(arg); fclose(fp); return -1; } else if (special_result == SC_SPECIAL_HANDLER_RESULT_INCLUDE) { const int ret = append_to_command_line_from_file ((const char *) output, config, entries, entries_count, argc_p, argv_p, depth + 1U); free(output); free(arg); if (ret != 0) { fclose(fp); return -1; } break; } abort(); } default: abort(); } if (try_next == 0) { break; } } if (try_next != 0 && i >= entries_count) { if (err != NULL && *err != 0) { fprintf(stderr, "%s:%u:%u: syntax error line %u: [%s].\n", file_name, line_count, (unsigned int)(err - line + 1), line_count, err); } else { fprintf(stderr, "%s:%u:1: property not found line %u: [%s].\n", file_name, line_count, line_count, line); } fclose(fp); return -1; } } (void) fclose(fp); return 0; } int sc_build_command_line_from_file(const char *file_name, const SimpleConfConfig *config, const SimpleConfEntry entries[], size_t entries_count, char *app_name, int *argc_p, char ***argv_p) { char **argv = NULL; int argc = 0; *argc_p = 0; *argv_p = NULL; if ((argv = malloc(sizeof *argv)) == NULL || (app_name = strdup(app_name)) == NULL) { sc_argv_free(argc, argv); return -1; } argv[argc++] = app_name; if (append_to_command_line_from_file(file_name, config, entries, entries_count, &argc, &argv, 0U) != 0) { sc_argv_free(argc, argv); return -1; } *argc_p = argc; *argv_p = argv; return 0; } pure-ftpd-1.0.49.orig/src/dynamic.h0000644000175000017500000000061713350542501015774 0ustar rackeracke#ifndef __DYNAMIC_H__ #define __DYNAMIC_H__ 1 #ifndef NO_STANDALONE typedef struct IPTrack_ { struct sockaddr_storage ip; pid_t pid; } IPTrack; void iptrack_delete_pid(const pid_t pid); unsigned int iptrack_get(const struct sockaddr_storage * const ip); void iptrack_free(void); void iptrack_add(const struct sockaddr_storage * const ip, const pid_t pid); #endif #endif pure-ftpd-1.0.49.orig/src/log_unix.c0000644000175000017500000000467013450665410016200 0ustar rackeracke#include #include "ftpd.h" #include "log_unix.h" #include "utils.h" #ifdef WITH_DMALLOC # include #endif void pw_unix_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer) { const char *cpwd = NULL; struct passwd pw, *pw_; #ifdef USE_SHADOW struct spwd *spw; #endif char *dir = NULL; (void) sa; (void) peer; result->auth_ok = 0; #ifdef HAVE_GETPWNAM_SHADOW if ((pw_ = getpwnam_shadow(account)) == NULL) { return; } #else if ((pw_ = getpwnam(account)) == NULL) { return; } #endif pw = *pw_; result->auth_ok--; #ifdef HAVE_SETUSERSHELL if (pw.pw_shell == NULL) { return; } if (strcasecmp(pw.pw_shell, FAKE_SHELL) != 0) { const char *shell; setusershell(); while ((shell = (char *) getusershell()) != NULL && strcmp(pw.pw_shell, shell) != 0); endusershell(); if (shell == NULL) { return; } } #endif if ((dir = strdup(pw.pw_dir)) == NULL) { return; } #ifdef USE_SHADOW if ((((pw.pw_passwd)[0] == 'x' && (pw.pw_passwd)[1] == 0) || ((pw.pw_passwd)[0] == '#' && (pw.pw_passwd)[1] == '#' && strcmp(pw.pw_passwd + 2, account) == 0)) && (spw = getspnam(account)) != NULL && spw->sp_pwdp != NULL) { cpwd = spw->sp_pwdp[0] == '@' ? NULL : spw->sp_pwdp; if (spw->sp_expire > 0 || spw->sp_max > 0) { long today = time(NULL) / (24L * 60L * 60L); if (spw->sp_expire > 0 && spw->sp_expire < today) { goto bye; /* account expired */ } if (spw->sp_max > 0 && spw->sp_lstchg > 0 && (spw->sp_lstchg + spw->sp_max < today)) { goto bye; /* password expired */ } } } else #endif { cpwd = pw.pw_passwd; } { const char *crypted; if (cpwd == NULL || (crypted = (const char *) crypt(password, cpwd)) == NULL || pure_strcmp(cpwd, crypted) != 0) { goto bye; } } result->uid = pw.pw_uid; result->gid = pw.pw_gid; result->dir = dir; result->slow_tilde_expansion = 0; result->auth_ok = -result->auth_ok; return; bye: free(dir); } pure-ftpd-1.0.49.orig/src/messages_ru.h0000644000175000017500000003515113446174132016675 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "éÓÔĹËĚĎ ×ŇĹÍŃ ĎÖÉÄÁÎÉŃ" #define MSG_CAPABILITIES "îĹ×ĎÚÍĎÖÎĎ ĐĹŇĹËĚŔŢÉÔŘ ŇÁÚŇĹŰĹÎÉŃ (capabilities)" #define MSG_CLIENT_CLOSED_CNX "ëĚÉĹÎÔ ÚÁËŇŮĚ ÓĎĹÄÉÎĹÎÉĹ" #define MSG_CLIENT_READ_ERR "ďŰÉÂËÁ ŢÔĹÎÉŃ ĎÔ ËĚÉĹÎÔÁ" #define MSG_CANT_OPEN_CNX "îĹ×ĎÚÍĎÖÎĎ ÓĎĹÄÉÎÉÔŘÓŃ" #define MSG_CANT_CREATE_DATA_SOCKET "îĹ×ĎÚÍĎÖÎĎ ÓĎÚÄÁÔŘ ÓĎËĹÔ ÄĚŃ ĐĹŇĹÄÁŢÉ ÄÁÎÎŮČ" #define MSG_DEBUG_CLIENT_IS "áÄŇĹÓ ËĚÉĹÎÔÁ:" #define MSG_SYNTAX_ERROR_IP "óÉÎÔÁËÓÉŢĹÓËÁŃ ĎŰÉÂËÁ × IP ÁÄŇĹÓĹ" #define MSG_PORT_SUCCESSFUL "ëĎÍÁÎÄÁ PORT ×ŮĐĎĚÎĹÎÁ ŐÓĐĹŰÎĎ" #define MSG_ONLY_IPV4V6 "đĎÄÄĹŇÖÉ×ÁŔÔÓŃ ÔĎĚŘËĎ IPv4 É IPv6 (1,2)" #define MSG_ONLY_IPV4 "đĎÄÄĹŇÖÉ×ÁĹÔÓŃ ÔĎĚŘËĎ IPv4 (1)" #define MSG_TIMEOUT_PARSER "éÓÔĹËĚĎ ×ŇĹÍŃ ĎÖÉÄÁÎÉŃ - ĐĎÔĎŇĎĐÉÔĹÓŘ × ÓĚĹÄŐŔÝÉĘ ŇÁÚ" #define MSG_LINE_TOO_LONG "óĚÉŰËĎÍ ÄĚÉÎÎÁŃ ÓÔŇĎËÁ" #define MSG_LOG_OVERFLOW "ëĚÉĹÎÔ ĐĎĐŮÔÁĚÓŃ ĐĹŇĹĐĎĚÎÉÔŘ ÂŐĆĆĹŇ ËĎÍÁÎÄÎĎĘ ÓÔŇĎËÉ" #define MSG_GOODBYE "÷ÓĹÇĎ ČĎŇĎŰĹÇĎ. ÷Ů ÚÁËÁŢÁĚÉ %llu É ÓËÁŢÁĚÉ %llu ËÉĚĎÂÁĘÔ." #define MSG_DEBUG_COMMAND "ëĎÍÁÎÄÁ" #define MSG_IS_YOUR_CURRENT_LOCATION " - ÔĹËŐÝÁŃ ÄÉŇĹËÔĎŇÉŃ" #define MSG_NOT_LOGGED_IN "÷Ů ĹÝĹ ÎĹ ××ĹĚÉ Ó×ĎĹ ÉÍŃ É ĐÁŇĎĚŘ" #define MSG_AUTH_UNIMPLEMENTED "ëĎÍÁÎÄŮ ŐĚŐŢŰĹÎÎĎĘ ÂĹÚĎĐÁÓÎĎÓÔÉ (AUTH É ADAT) ÎĹ ŇĹÁĚÉÚĎ×ÁÎŮ" #define MSG_NO_FILE_NAME "îĹ ÚÁÄÁÎĎ ÉÍŃ ĆÁĘĚÁ" #define MSG_NO_DIRECTORY_NAME "îĹ ÚÁÄÁÎĎ ÉÍŃ ÄÉŇĹËÔĎŇÉÉ" #define MSG_NO_RESTART_POINT "îĹ ÚÁÄÁÎŮ ÍĹÓÔĎ, Ó ËĎÔĎŇĎÇĎ ÎŐÖÎĎ ×ĎÚĎÂÎĎ×ÉÔŘ ÚÁËÁŢËŐ" #define MSG_ABOR_SUCCESS "ëĎÍÁÎÄÁ ABOR ×ŮĐĎĚÎĹÎÁ ŐÓĐĹŰÎĎ" #define MSG_MISSING_ARG "ďÔÓŐÔÓÔ×ŐĹÔ ÁŇÇŐÍĹÎÔ" #define MSG_GARBAGE_FOUND "íŐÓĎŇ ĐĎÓĚĹ ĂĹĚĎÇĎ ÚÎÁŢĹÎÉŃ" #define MSG_VALUE_TOO_LARGE "ăĹĚĎĹ ÚÎÁŢĹÎÉĹ ÓĚÉŰËĎÍ ×ĹĚÉËĎ" #define MSG_IDLE_TIME "÷ŇĹÍŃ ĎÖÉÄÁÎÉŃ ŐÓÔÁÎĎ×ĚĹÎÁ ÎÁ %lu ÓĹËŐÎÄ(Ő/Ů)" #define MSG_SITE_HELP "ňÁÓĐĎÚÎÁŔÔÓŃ ÓĚĹÄŐŔÝÉĹ ËĎÍÁÎÄŮ SITE" #define MSG_BAD_CHMOD "đĚĎČÉĹ ĐŇÁ×Á ÄĎÓÔŐĐÁ" #define MSG_UNKNOWN_EXTENSION "- ÎĹÉÚ×ĹÓÔÎĎĹ ŇÁÓŰÉŇĹÎÉĹ" #define MSG_XDBG_OK "ëĎÍÁÎÄÁ XDBG ×ŮĐĎĚÎĹÎÁ ŐÓĐĹŰÎĎ, debug level ŐÓÔÁÎĎ×ĚĹÎ × %d" #define MSG_UNKNOWN_COMMAND "îĹÉÚ×ĹÓÔÎÁŃ ËĎÍÁÎÄÁ" #define MSG_TIMEOUT_NOOP "éÓÔĹËĚĎ ×ŇĹÍŃ ĎÖÉÄÁÎÉŃ (ÎÉËÁËÉČ ÄĹĘÓÔ×ÉĘ × ÔĹŢĹÎÉĹ %lu ÓĹËŐÎÄ(Ů))" #define MSG_TIMEOUT_DATA "éÓÔĹËĚĎ ×ŇĹÍŃ ĎÖÉÄÁÎÉŃ (ÎĹ ĐĎÓÔŐĐÉĚĎ ÄÁÎÎŮČ × ÔĹŢĹÎÉĹ %lu ÓĹËŐÎÄ(Ů))" #define MSG_SLEEPING "č-Ň-Ň-Ň..." #define MSG_ALREADY_LOGGED "÷Ů ŐÖĹ ×ĎŰĚÉ" #define MSG_ANY_PASSWORD "đĎÄĎĘÄĹÔ ĚŔÂĎĘ ĐÁŇĎĚŘ" #define MSG_ANONYMOUS_LOGGED "÷ĎŰĹĚ ÁÎĎÎÉÍÎŮĘ ĐĎĚŘÚĎ×ÁÔĹĚŘ" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "áÎĎÎÉÍÎŮĘ ĐĎĚŘÚĎ×ÁÔĹĚŘ ×ĎŰĹĚ ÎÁ ×ÉŇÔŐÁĚŘÎŮĘ FTP" #define MSG_USER_OK "ţÔĎÂŮ ×ĎĘÔÉ ËÁË %s ÔŇĹÂŐĹÔÓŃ ĐÁŇĎĚŘ" #define MSG_CANT_DO_TWICE "îĹ×ĎÚÍĎÖÎĎ ÓÄĹĚÁÔŘ ÜÔĎÇĎ × ÔĹËŐÝĹÍ ÓĹÁÎÓĹ" #define MSG_UNABLE_SECURE_ANON "îĹ×ĎÚÍĎÖÎĎ ÚÁĐŐÓÔÉÔŘ ÂĹÚĎĐÁÓÎĎĹ ÁÎĎÎÉÍÎĎĹ FTP" #define MSG_BANDWIDTH_RESTRICTED "đŇĎĐŐÓËÎÁŃ ÓĐĎÓĎÂÎĎÓÔŘ ÄĚŃ ×ÁÓ ĎÇŇÁÎÉŢĹÎÁ" #define MSG_NO_PASSWORD_NEEDED "đÁŇĎĚŘ ÎĹ ÔŇĹÂŐĹÔÓŃ" #define MSG_NOTRUST "ń ÎĹ ÍĎÇŐ ×ÁÍ ÄĎ×ĹŇŃÔŘ" #define MSG_WHOAREYOU "đŇĹÄÓÔÁ×ŘÔĹÓŘ ĐĎÖÁĚŐĘÓÔÁ" #define MSG_AUTH_FAILED "á×ÔĎŇÉÚÁĂÉŃ ÎĹ ŐÄÁĚÁÓŘ, ÉÚ×ÉÎÉÔĹ" #define MSG_AUTH_TOOMANY "óĚÉŰËĎÍ ÍÎĎÇĎ ĐĎĐŮÔĎË Á×ÔĎŇÉÚÁĂÉÉ" #define MSG_NO_HOMEDIR "äĎÍÁŰÎŃŃ ÄÉŇĹËÔĎŇÉŃ ÎĹ ÄĎÓÔŐĐÎÁ - ÚÁ×ĹŇŰĹÎÉĹ" #define MSG_NO_HOMEDIR2 "%s ÎĹ ÓŐÝĹÓÔ×ŐĹÔ ÉĚÉ ÎĹ ÄĎÓÔŐĐÎÁ" #define MSG_START_SLASH "îÁŢÁĚĎ Ó /" #define MSG_USER_GROUP_ACCESS "đĎĚŘÚĎ×ÁÔĹĚŔ %s ŇÁÚŇĹŰĹÎ ÇŇŐĐĐĎ×ĎĘ ÄĎÓÔŐĐ Ë" #define MSG_FXP_SUPPORT "üÔĎÔ ÓĹŇ×ĹŇ ĐĎÄÄĹŇÖÉ×ÁĹÔ ĐĹŇĹËÁŢËŐ FXP" #define MSG_RATIO "÷Ů ÄĎĚÖÎŮ ÓĎÂĚŔÄÁÔŘ ÓĎĎÔÎĎŰĹÎÉĹ %u:%u (UL/DL)" #define MSG_CHROOT_FAILED "îĹ×ĎÚÍĎÖÎĎ ÓĎÚÄÁÔŘ ÂĹÚĎĐÁÓÎŐŔ chroot() ÔŔŇŘÍŐ (jail, sandbox)" #define MSG_CURRENT_DIR_IS "OK. ôĹËŐÝÁŃ ÄÉŇĹËÔĎŇÉŃ %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. ôĹËŐÝÁŃ ËĎŇÎĹ×ÁŃ ÄÉŇĹËÔĎŇÉŃ %s" #define MSG_IS_NOW_LOGGED_IN "%s ×ĎŰĹĚ" #define MSG_CANT_CHANGE_DIR "îĹ×ĎÚÍĎÖÎĎ ÉÚÍĹÎÉÔŘ ÄÉŇĹËÔĎŇÉŔ ÎÁ %s" #define MSG_PATH_TOO_LONG "óĚÉŰËĎÍ ÄĚÉÎÎŮĘ ĐŐÔŘ" #define MSG_CANT_PASV "îĹ×ĎÚÍĎÖÎĎ ÉÓĐĎĚŘÚĎ×ÁÔŘ ËĎÍÁÎÄŐ PASV ÎÁ IPv6 ÓĎĹÄÉÎĹÎÉÉ. éÓĐĎĚŘÚŐĘÔĹ EPSV." #define MSG_CANT_PASSIVE "îĹ×ĎÚÍĎÖÎĎ ŐÓÔÁÎĎ×ÉÔŘ ĐÁÓÓÉ×ÎĎĹ FTP ÓĎĹÄÉÎĹÎÉĹ" #define MSG_PORTS_BUSY "÷ÓĹ ÚÁŇĹÚĹŇ×ÉŇĎ×ÁÎÎŮĹ ĐĎŇÔŮ TCP ÚÁÎŃÔŮ" #define MSG_GETSOCKNAME_DATA "îĹ×ĎÚÍĎÖÎĎ ĎĐŇĹÄĹĚÉÔŘ ÉÍŃ ĚĎËÁĚŘÎĎÇĎ ÓĎËĹÔÁ ÄÁÎÎŮČ" #define MSG_GETPEERNAME "îĹ×ĎÚÍĎÖÎĎ ÉÄĹÎÔÉĆÉĂÉŇĎ×ÁÔŘ ĚĎËÁĚŘÎŮĘ ÓĎËĹÔ" #define MSG_INVALID_IP "éÚ×ÉÎÉÔĹ, ÎĹ×ĹŇÎŮĘ ÁÄŇĹÓ" #define MSG_NO_EPSV "éÓĐĎĚŘÚŐĘÔĹ IPv6-ÓĎ×ÍĹÓÔÉÍŮĘ ËĚÉĹÎÔ Ó ĐĎÄÄĹŇÖËĎĘ ËĎÍÁÎÄŮ EPSV" #define MSG_BAD_PORT "éÚ×ÉÎÉÔĹ, ÎĎ Ń ÎĹ ÂŐÄŐ ĐĎÄËĚŔŢÁÔŘÓŃ Ë ĐĎŇÔŐ Ó ÎĎÍĹŇĎÍ ÍĹÎŘŰÉÍ 1024" #define MSG_NO_FXP "ń ÎĹ ÓĎĹÄÉÎŔÓŘ Ó %s (ÔĎĚŘËĎ Ó %s)" #define MSG_FXP "đĹŇĹËÁŢËÁ FXP: ĎÔ %s Ë %s" #define MSG_NO_DATA_CONN "îĹÔ ÓĎĹÄÉÎĹÎÉŃ ÄĚŃ ÄÁÎÎŮČ" #define MSG_ACCEPT_FAILED "îĹ×ĎÚÍĎÖÎĎ ŐÓÔÁÎĎ×ÉÔŘ ÓĎĹÄÉÎĹÎÉĹ" #define MSG_ACCEPT_SUCCESS "őÓÔÁÎĎ×ĚĹÎĎ ÓĎĹÄÉÎĹÎÉĹ ÄĚŃ ÄÁÎÎŮČ" #define MSG_CNX_PORT_FAILED "îĹ×ĎÚÍĎÖÎĎ ĎÔËŇŮÔŘ ÓĎĹÄÉÎĹÎÉĹ ÄĚŃ ÄÁÎÎŮČ Ë ĐĎŇÔŐ %d" #define MSG_CNX_PORT "óĎĹÄÉÎĹÎÉĹ Ó ĐĎŇÔĎÍ %d" #define MSG_ANON_CANT_MKD "éÚ×ÉÎÉÔĹ, ÁÎĎÎÉÍÎŮÍ ĐĎĚŘÚĎ×ÁÔĹĚŃÍ ÚÁĐŇĹÝĹÎĎ ÓĎÚÄÁ×ÁÔŘ ÄÉŇĹËÔĎŇÉÉ" #define MSG_ANON_CANT_RMD "éÚ×ÉÎÉÔĹ, ÁÎĎÎÉÍÎŮÍ ĐĎĚŘÚĎ×ÁÔĹĚŃÍ ÚÁĐŇĹÝĹÎĎ ŐÄÁĚŃÔŘ ÄÉŇĹËÔĎŇÉÉ" #define MSG_ANON_CANT_RENAME "áÎĎÎÉÍÎŮÍ ĐĎĚŘÚĎ×ÁÔĹĚŃÍ ÚÁĐŇĹÝĹÎĎ ĐĹŇĹÍĹÝÁÔŘ/ĐĹŇĹÉÍĹÎĎ×Ů×ÁÔŘ ĆÁĘĚŮ" #define MSG_ANON_CANT_CHANGE_PERMS "áÎĎÎÉÍÎŮÍ ĐĎĚŘÚĎ×ÁÔĹĚŃÍ ÚÁĐŇĹÝĹÎĎ ÉÚÍĹÎŃÔŘ ĐŇÁ×Á ÄĎÓÔŐĐÁ" #define MSG_GLOB_NO_MEMORY "îĹÄĎÓÔÁÔĎŢÎĎ ĐÁÍŃÔÉ ÄĚŃ ĎÂŇÁÂĎÔËÉ ÚÁĐŇĎÓÁ %s" #define MSG_PROBABLY_DENIED "(üÔĎ ×ĎÚÍĎÖÎĎ ĎÚÎÁŢÁĹÔ \"îĹÔ ÄĎÓÔŐĐÁ\")" #define MSG_GLOB_READ_ERROR "ďŰÉÂËÁ ŢÔĹÎÉŃ ĐŇÉ ĎÂŇÁÂĎÔËĹ %s" #define MSG_GLOB_NO_MATCH "îĹ ÎÁĘÄĹÎĎ ÓĎ×ĐÁÄĹÎÉĘ ÄĚŃ %s × %s" #define MSG_CHMOD_FAILED "îĹ×ĎÚÍĎÖÎĎ ÉÚÍĹÎÉÔŘ ĐŇÁ×Á ÄĎÓÔŐĐÁ Ë %s" #define MSG_CHMOD_SUCCESS "éÚÍĹÎĹÎŮ ĐŇÁ×Á ÄĎÓÔŐĐÁ Ë %s" #define MSG_CHMOD_TOTAL_FAILURE "éÚ×ÉÎÉÔĹ, ÎĎ Ń ÎĹ ÍĎÇŐ ÍĹÎŃÔŘ ĐŇÁ×Á ÄĎÓÔŐĐÁ" #define MSG_ANON_CANT_DELETE "áÎĎÎÉÍÎŮÍ ĐĎĚŘÚĎ×ÁÔĹĚŃÍ ÚÁĐŇĹÝĹÎĎ ŐÄÁĚŃÔŘ ĆÁĘĚŮ" #define MSG_ANON_CANT_OVERWRITE "áÎĎÎÉÍÎŮÍ ĐĎĚŘÚĎ×ÁÔĹĚŃÍ ÚÁĐŇĹÝĹÎĎ ÉÚÍĹÎŃÔŘ ÓŐÝĹÓÔ×ŐŔÝÉĹ ĆÁĘĚŮ" #define MSG_DELE_FAILED "îĹ×ĎÚÍĎÖÎĎ ŐÄÁĚÉÔŘ %s" #define MSG_DELE_SUCCESS "őÄÁĚĹÎĎ: %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "îÉ ĎÄÉÎ ĆÁĘĚ ÎĹ ŐÄÁĚĹÎ" #define MSG_LOAD_TOO_HIGH \ "ëĎÇÄÁ ×Ů ĐĎÄËĚŔŢÉĚÉÓŘ ÎÁÇŇŐÚËÁ ÂŮĚÁ ŇÁ×ÎÁ %3.2f. íŮ ÎĹ ŇÁÚŇĹŰÁĹÍ ÓËÁŢÉ×ÁÔŘ\n" \ "ÁÎĎÎÉÍÎŮÍ ĐĎĚŘÚĎ×ÁÔĹĚŃÍ ËĎÇÄÁ ÎÁÇŇŐÚËÁ ÔÁË ×ŮÓĎËÁ. úÁËÁŢËÉ ŇÁÚŇĹŰĹÎŮ\n" \ "×ÓĹÇÄÁ." #define MSG_OPEN_FAILURE "îĹ×ĎÚÍĎÖÎĎ ĎÔËŇŮÔŘ %s" #define MSG_OPEN_FAILURE2 "îĹ×ĎÚÍĎÖÎĎ ĎÔËŇŮÔŘ ÜÔĎÔ ĆÁĘĚ" #define MSG_STAT_FAILURE "îĹ×ĎÚÍĎÖÎĎ ĎĐŇĹÄĹĚÉÔŘ ŇÁÚÍĹŇ ĆÁĘĚÁ" #define MSG_STAT_FAILURE2 "îĹ×ĎÚÍĎÖÎ ĎĐŇĹÄĹĚÉÔŘ ÓŐÝĹÓÔ×ŐĹÔ ĚÉ ĆÁĘĚ" #define MSG_REST_TOO_LARGE_FOR_FILE "íĹÓÔĎ ×ĎÚĎÂÎĎ×ĚĹÎÉŃ %lld ÓĚÉŰËĎÍ ×ĹĚÉËĎ ÄĚŃ ĆÁĘĚÁ ŇÁÚÍĹŇĎÍ %lld." #define MSG_REST_RESET "óÍĹÝĹÎÉĹ ×ĎÚĎÂÎĎ×ĚĹÎÉŃ ŐÓÔÁÎĎ×ĚĹÎĎ × 0" #define MSG_NOT_REGULAR_FILE "÷Ů ÍĎÖĹÔĹ ŢÉÔÁÔŘ ÔĎĚŘËĎ ĎÂŮŢÎŮĹ ĆÁĘĚŮ" #define MSG_NOT_MODERATED \ "üÔĎÔ ĆÁĘĚ ÂŮĚ ÚÁËÁŢĹÎ ÁÎĎÎÉÍÎŮÍ ŔÚĹŇĎÍ. ďÎ ÎĹ ÂŮĚ ĹÝĹ ĎÄĎÂŇĹÎ\n" \ "ÄĚŃ ÓËÁŢÉ×ÁÎÉŃ ÁÄÍÉÎÉÓÔŇÁÔĎŇĎÍ ÓÁĘÔÁ." #define MSG_RATIO_DENIAL \ "éÚ×ÉÎÉÔĹ, ÎĎ ĎÔÎĎŰĹÎÉĹ ÚÁËÁŢÁÎ/ÓËÁŢÁÎĎ ŇÁ×ÎĎ %u:%u .\n" \ "÷Ů ÚÁËÁŢÁĚÉ %llu ëâ É ÓËÁŢÁĚÉ %llu ëâ. đĎÖÁĚŐĘ ×ÁÍ ÓĚĹÄŐĹÔ\n" \ "ĐĎÄĹĚÉÔŘÓŃ ŢĹÍ-ÎÉÂŐÄŘ É ÔĎĚŘËĎ ĐĎÔĎÍ ÓËÁŢÉ×ÁÔŘ." #define MSG_NO_MORE_TO_DOWNLOAD "âĎĚŘŰĹ ÎÉŢĹÇĎ ÎĹ ĎÓÔÁĚĎÓŘ ÄĚŃ ÓËÁŢÉ×ÁÎÉŃ" #define MSG_WINNER "ëĎÍĐŘŔÔĹŇ - ×ÁŰ ÄŇŐÇ. äĎ×ĹŇŃĘÔĹ ĹÍŐ" #define MSG_KBYTES_LEFT "%.1f ëâ ĎÓÔÁĚĎÓŘ" #define MSG_ABORTED "đĹŇĹËÁŢËÁ ĎÓÔÁÎĎ×ĚĹÎÁ" #define MSG_DATA_WRITE_FAILED "ďŰÉÂËÁ ĐŇÉ ĐĎĐŮÔËĹ ĐĹŇĹÄÁÔŘ ÄÁÎÎŮĹ" #define MSG_DATA_READ_FAILED "ďŰÉÂËÁ ĐŇÉ ĐĎĐŮÔËĹ ĐŇÉÎŃÔŘ ÄÁÎÎŮĹ" #define MSG_MMAP_FAILED "îĹ×ĎÚÍĎÖÎĎ ĎÔĎÂŇÁÚÉÔŘ ĆÁĘĚ × ĐÁÍŃÔŘ" #define MSG_WRITE_FAILED "ďŰÉÂËÁ ×Ď ×ŇĹÍŃ ÚÁĐÉÓÉ × ĆÁĘĚ" #define MSG_TRANSFER_RATE_M "%.3f ÓĹËŐÎÄ ĐŇĎŰĚĎ, %.2f íâ/c" #define MSG_TRANSFER_RATE_K "%.3f ÓĹËŐÎÄ ĐŇĎŰĚĎ, %.2f ëâ/Ó" #define MSG_TRANSFER_RATE_B "%.3f ÓĹËŐÎÄ ĐŇĎŰĚĎ, %.2f â/c" #define MSG_SPACE_FREE_M "%.1f íâ Ó×ĎÂĎÄÎĎÇĎ ÍĹÓÔÁ" #define MSG_SPACE_FREE_K "%f ëâ Ó×ĎÂĎÄÎĎÇĎ ÄÉÓËĎ×ĎÇĎ ĐŇĎÓÔŇÁÎÓÔ×Á" #define MSG_DOWNLOADED "ÚÁÇŇŐÚËÁ ÚÁ×ĹŇŰĹÎÁ" #define MSG_REST_NOT_NUMERIC "ËĎÍÁÎÄĹ REST ÎĹĎÂČĎÄÉÍ ŢÉÓĚĹÎÎŮĘ ĐÁŇÁÍĹÔŇ" #define MSG_REST_ASCII_STRICT "íÁŇËĹŇ ×ĎÚĎÂÎĎ×ĚĹÎÉŃ ÄĎĚÖĹÎ ÂŮÔŘ ÎŐĚĹÍ × ASCII ŇĹÖÉÍĹ" #define MSG_REST_ASCII_WORKAROUND "÷ĎÓÓÔÁÎĎ×ĚĹÎÉĹ Ó %lld. îĎ ÍŮ × ASCII ŇĹÖÉÍĹ" #define MSG_REST_SUCCESS "÷ĎÚĎÂÎĎ×ĚĹÎÉĹ Ó %lld" #define MSG_SANITY_DIRECTORY_FAILURE "úÁĐŇĹÝĹÎÎĎĹ ÉÍŃ ÄÉŇĹËÔĎŇÉÉ" #define MSG_SANITY_FILE_FAILURE "úÁĐŇĹÝĹÎÎĎĹ ÉÍŃ ĆÁĘĚÁ: %s" #define MSG_MKD_FAILURE "îĹ×ĎÚÍĎÖÎĎ ÓĎÚÄÁÔŘ ÄÉŇĹËÔĎŇÉŔ" #define MSG_MKD_SUCCESS "äÉŇĹËÔĎŇÉŃ ÂŮĚÁ ŐÓĐĹŰÎĎ ÓĎÚÄÁÎÁ" #define MSG_RMD_FAILURE "îĹ×ĎÚÍĎÖÎĎ ŐÄÁĚÉÔŘ ÄÉŇĹËÔĎŇÉŔ" #define MSG_RMD_SUCCESS "äÉŇĹËÔĎŇÉŃ ÂŮĚÁ ŐÓĐĹŰÎĎ ŐÄÁĚĹÎÁ" #define MSG_TIMESTAMP_FAILURE "îĹ×ĎÚÍĎÖÎĎ ĐĎĚŐŢÉÔŘ ÔĹËŐÝĹĹ ×ŇĹÍŃ" #define MSG_MODE_ERROR "đĎÄÄĹŇÖÉ×ÁŔÔÓŃ ÔĎĚŘËĎ ASCII É ÂÉÎÁŇÎŮĘ ŇĹÖÉÍŮ" #define MSG_CREATE_FAILURE "îĹ×ĎÚÍĎÖÎĎ ÓĎÚÄÁÔŘ ĆÁĘĚ" #define MSG_ABRT_ONLY "ëĎÍÁÎÄÁ ABRT ×ĎÚÍĎÖÎĎ ÔĎĚŘËĎ ×Ď ×ŇĹÍŃ ÚÁËÁŢËÉ" #define MSG_UPLOAD_PARTIAL "ţÁÓÔÉŢÎĎ ÚÁÇŇŐÖĹÎĎ" #define MSG_REMOVED "ŐÄÁĚĹÎĎ" #define MSG_UPLOADED "ÚÁÇŇŐÖĹÎĎ" #define MSG_GMTIME_FAILURE "îĹ×ĎÚÍĎÖÎĎ ĐĎĚŐŢÉÔŘ ÍĹÓÔÎĎĹ ×ŇĹÍŃ" #define MSG_TYPE_8BIT_FAILURE "ôĎĚŘËĎ ×ĎÓŘÍÉÂÉÔÎŮĹ ÂÁĘÔŮ ĐĎÄÄĹŇÖÉ×ÁŔÔÓŃ, ÎÁ Ä×ĎŇĹ XXI ×ĹË" #define MSG_TYPE_UNKNOWN "îĹÉÚ×ĹÓÔÎŮĘ TYPE" #define MSG_TYPE_SUCCESS "TYPE ÔĹĐĹŇŘ" #define MSG_STRU_FAILURE "đĎÄÄĹŇÖÉ×ÁĹÔÓŃ ÔĎĚŘËĎ F(ile)" #define MSG_MODE_FAILURE "đĎÖÁĚŐĘÓÔÁ ÉÓĐĎĚŘÚŐĘÔĹ ŇĹÖÉÍ S(tream)" #define MSG_RENAME_ABORT "ďÔÍĹÎÁ ĐŇĹÄŮÄŐÝĹĘ ĎĐĹŇÁĂÉÉ ĐĹŇĹÉÍĹÎĎ×ÁÎÉŃ" #define MSG_RENAME_RNFR_SUCCESS "RNFR ĐŇÉÎŃÔĎ, ĆÁĘĚ ÓŐÝĹÓÔ×ŐĹÔ, ŐËÁÖÉÔĹ ÎĎ×ĎĹ ÉÍŃ" #define MSG_FILE_DOESNT_EXIST "éÚ×ÉÎÉÔĹ, ÎĎ ÔÁËĎĘ ĆÁĘĚ ÎĹ ÓŐÝĹÓÔ×ŐĹÔ" #define MSG_RENAME_ALREADY_THERE "đĹŇĹÉÍĹÎĎ×ÁÎÉĹ ÎĹ ŐÄÁĚĎÓŘ - ĆÁĘĚ Ó ÔÁËÉÍ ÉÍĹÎĹÍ ŐÖĹ ÓŐÝĹÓÔ×ŐĹÔ" #define MSG_RENAME_NORNFR "îĹĎÂČĎÄÉÍÁ ËĎÍÁÎÄÁ RNFR ĐĹŇĹÄ RNTO" #define MSG_RENAME_FAILURE "îĹ ŐÄÁĚĎÓŘ ĐĹŇĹÉÍĹÎĎ×ÁÔŘ/ĐĹŇĹÎĹÓÔÉ" #define MSG_RENAME_SUCCESS "ćÁĘĚ ŐÄÁŢÎĎ ĐĹŇĹÉÍĹÎĎ×ÁĚ ÉĚÉ ĐĹŇĹÍĹÝĹÎ" #define MSG_NO_SUPERSERVER "đĎÖÁĚŐĘÓÔÁ ÚÁĐŐÓËÁĘÔĹ pure-ftpd ÉÚ ÓŐĐĹŇ-ÓĹŇ×ĹŇÁ (ËÁË tcpserver)" #define MSG_NO_FTP_ACCOUNT "îĹ ÎÁĘÄĹÎ ÁËËÁŐÎÔ 'ftp'" #define MSG_CONF_ERR "ďŰÉÂËÁ × ËĎÎĆÉÇŐŇÁĂÉÉ" #define MSG_NO_VIRTUAL_FILE "îĹ ŐËÁÚÁÎĎ ÉÍŃ ĆÁĘĚÁ ×ÉŇÔŐÁĚŘÎŮČ ĐĎĚŘÚĎ×ÁÔĹĚĹĘ" #define MSG_ILLEGAL_THROTTLING "îĹĐŇÁ×ÉĚŘÎĎ ÚÎÁŢĹÎÉĹ ĎÇŇÁÎÉŢĹÎÉŃ ĐŇĎĐŐÓËÎĎĘ ÓĐĎÓĎÂÎĎÓÔÉ" #define MSG_ILLEGAL_TRUSTED_GID "îĹĐŇÁ×ÉĚŘÎŮĘ ÉÄĹÎÔÉĆÉËÁÔĎŇ ÇŇŐĐĐŮ" #define MSG_ILLEGAL_USER_LIMIT "îĹĐŇÁ×ÉĚŘÎĎ ĎÇŇÁÎÉŢĹÎÉĹ ÎÁ ËĎĚÉŢĹÓÔ×Ď ĐĎĚŘÚĎ×ÁÔĹĚĹĘ" #define MSG_ILLEGAL_FACILITY "îĹĐŇÁ×ÉĚŘÎĎ ŐËÁÚÁÎ ÔÉĐ ÓĹŇ×ÉÓÁ syslog" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "îĹĐŇÁ×ÉĚŘÎŮĘ ĆÁĘĚ ËĎÎĆÉÇŐŇÁĂÉÉ LDAP" #define MSG_ILLEGAL_LOAD_LIMIT "îĹÄĎĐŐÓÔÉÍĎĹ ĎÇŇÁÎÉŢĹÎÉÉ ÎÁÇŇŐÚËÉ" #define MSG_ILLEGAL_PORTS_RANGE "îĹÄĎĐŐÓÔÉÍŮĘ ÉÎÔĹŇ×ÁĚ ĐĎŇÔĎ×" #define MSG_ILLEGAL_LS_LIMITS "îĹ×ĹŇÎŮĹ ĎÇŇÁÎÉŢĹÎÉŃ ÄĚŃ 'ls'" #define MSG_ILLEGAL_FORCE_PASSIVE "îĹĐŇÁ×ÉĚŘÎŮĘ IP ÄĚŃ ĐÁÓÓÉ×ÎŮČ ÓĎĹÄÉÎĹÎÉĘ" #define MSG_ILLEGAL_RATIO "îĹĐŇÁ×ÉĚŘÎĎ ÚÁÄÁÎĎ ĎÔÎĎŰĹÎÉĹ ÓËÁŢÁÎĎ/ÚÁËÁŢÁÎĎ" #define MSG_ILLEGAL_UID_LIMIT "îĹ×ĹŇÎĎĹ ĎÇŇÁÎÉŢĹÎÉĹ uid" #define MSG_ILLEGAL_OPTION "îĹÉÚ×ĹÓÔÎŮĘ ĐÁŇÁÍĹÔŇ" #define MSG_LDAP_MISSING_BASE "îĹ ÚÁÄÁÎĎ LDAPBaseDN × ĆÁĘĚĹ ËĎÎĆÉÇŐŇÁĂÉÉ LDAP" #define MSG_LDAP_WRONG_PARMS "îĹ×ĹŇÎŮĘ ĐÁŇÁÍĹÔŇ LDAP" #define MSG_NEW_CONNECTION "îĎ×ĎĹ ÓĎĹÄÉÎĹÎÉĹ Ó %s" #define MSG_WELCOME_TO "äĎÂŇĎ ĐĎÖÁĚĎ×ÁÔŘ ÎÁ" #define MSG_MAX_USERS "%lu ĐĎĚŘÚĎ×ÁÔĹĚĹĘ (ÜÔĎ ÍÁËÓÉÍŐÍ) ŐÖĹ ĐĎÄËĚŔŢÉĚÉÓŘ, ÉÚ×ÉÎÉÔĹ" #define MSG_NB_USERS "÷Ů ĐĎĚŘÚĎ×ÁÔĹĚŘ %u ÉÚ %u ŇÁÚŇĹŰĹÎÎŮČ" #define MSG_WELCOME_TIME "íĹÓÔÎĎĹ ×ŇĹÍŃ %02d:%02d. óĹŇ×ĹŇÎŮĘ ĐĎŇÔ: %u." #define MSG_ANONYMOUS_FTP_ONLY "÷ČĎÄ ŇÁÚŇĹŰĹÎ ÔĎĚŘËĎ ÄĚŃ ÁÎĎÎÉÍÎŮČ ĐĎĚŘÚĎ×ÁÔĹĚĹĘ" #define MSG_RATIOS_EVERYONE "óďâěŕäĺîéĺ đňďđďňăéé ďâńúáôĺěřîď äěń ÷óĺč:" #define MSG_RATIOS_ANONYMOUS "áîďîéíîůĺ đďěřúď÷áôĺěé đďä÷ěáóôîů óďďôîďűĺîéŕ úáëáţáîď/óëáţáîď:" #define MSG_RATIOS_RULE "ŢÔĎÂŮ ÓËÁŢÁÔŘ %u íâ, ÚÁËÁŢÁĘÔĹ %u íâ." #define MSG_INFO_IDLE_M "÷Ů ÂŐÄĹÔĹ ĎÔÓĎĹÄÉÎĹÎŮ ĐĎÓĚĹ %lu ÍÉÎŐÔ ÂĹÚÄĹŃÔĹĚŘÎĎÓÔÉ." #define MSG_INFO_IDLE_S "÷Ů ÂŐÄĹÔĹ ĎÔÓĎĹÄÉÎĹÎŮ ĐĎÓĚĹ %lu ÓĹËŐÎÄ ÂĹÚÄĹŃÔĹĚŘÎĎÓÔÉ." #define MSG_CANT_READ_FILE "éÚ×ÉÎÉÔĹ, ÎĹ×ĎÚÍĎÖÎĎ ĐŇĎŢÉÔÁÔŘ [%s]" #define MSG_LS_TRUNCATED "÷Ů×ĎÄ ĎÂŇĹÚÁÎ ÄĎ %u ÓĎ×ĐÁÄĹÎÉĘ" #define MSG_LS_SUCCESS "%u ÓĎ×ĐÁÄĹÎÉĘ" #define MSG_LOGOUT "ďÔÓĎĹÄÉÎĹÎÉĹ." #define MSG_AUTH_FAILED_LOG "á×ÔĎŇÉÚÁĂÉŃ ÎĹ ŐÄÁĚÁÓŘ ĐĎĚŘÚĎ×ÁÔĹĚŔ [%s]" #define MSG_ILLEGAL_UMASK "îĹ×ĹŇÎĎ ÚÁÄÁÎÁ umask" #define MSG_STANDALONE_FAILED "îĹ×ĎÚÍĎÖÎĎ ÚÁĐŐÓÔÉÔŘ standalone ÓĹŇ×ĹŇ" #define MSG_NO_ANONYMOUS_LOGIN "üÔĎ ÚÁËŇŮÔÁŃ ÓÉÓÔĹÍÁ - áÎĎÎÉÍÎŮĘ ×ČĎÄ ÎĹ ŇÁÚŇĹŰĹÎ" #define MSG_ANONYMOUS_ANY_PASSWORD "đĎÄĎĘÄĹÔ ĚŔÂĎĘ ĐÁŇĎĚŘ" #define MSG_MAX_USERS_IP "óĚÉŰËĎÍ ÍÎĎÇĎ ÓĎĹÄÉÎĹÎÉĘ (%lu) Ó ÜÔĎÇĎ IP" #define MSG_ACTIVE_DISABLED "áËÔÉ×ÎŮĘ ŇĹÖÉÍ ×ŮËĚŔŢĹÎ" #define MSG_TRANSFER_SUCCESSFUL "ćÁĘĚ ĐĹŇĹÄÁÎ ŐÄÁŢÎĎ" #define MSG_NO_DISK_SPACE "äÉÓË ĐĎĚĎÎ - ÚÁËÁŢÁĘÔĹ ĐĎÚÖĹ" #define MSG_OUT_OF_MEMORY "îĹÔ ĐÁÍŃÔÉ" #define MSG_ILLEGAL_TRUSTED_IP "îĹ×ĹŇÎĎ ÚÁÄÁÎ ĐŇĎ×ĹŇĹÎÎŮĘ IP" #define MSG_NO_ASCII_RESUME "äĎËÁŢËÁ ASCII ÎĹÎÁÄĹÖÎÁ, ÓÎÁŢÁĚÁ ŐÄÁĚÉÔĹ ĆÁĘĚ" #define MSG_UNKNOWN_ALTLOG "îĹ×ĹŇÎĎ ÚÁÄÁÎ ĆĎŇÍÁÔ ÖŐŇÎÁĚÁ" #define MSG_ACCOUNT_DISABLED "îĹ×ĎÚÍĎÖĹÎ ×ČĎÄ ËÁË [%s]: ÁËËÁŐÎÔ ĎÔËĚŔŢĹÎ" #define MSG_SQL_WRONG_PARMS "îĹ×ĹŇÎŮĹ SQL ĐÁŇÁÍĹÔŇŮ" #define MSG_ILLEGAL_CONFIG_FILE_SQL "đĚĎČĎĘ ĆÁĘĚ ËĎÎĆÉÇŐŇÁĂÉÉ SQL" #define MSG_SQL_MISSING_SERVER "îĹ ÚÁÄÁÎ ÓĹŇ×ĹŇ ĆÁĘĚĹ ËĎÎĆÉÇŐŇÁĂÉÉ SQL" #define MSG_SQL_DOWN "SQL ÓĹŇ×ĹŇ ËÁÖĹÔÓŃ ÎĹ ŇÁÂĎÔÁĹÔ" #define MSG_ILLEGAL_QUOTA "îĹĐŇÁ×ÉĚŘÎÁŃ Ë×ĎÔÁ" #define MSG_QUOTA_FILES "%llu ĆÁĘĚĎ× ÉÓĐĎĚŘÚŐĹÔÓŃ (%d%%) - ŇÁÚŇĹŰĹÎĎ: %llu ĆÁĘĚĎ×" #define MSG_QUOTA_SIZE "%llu ëâ ÉÓĐĎĚŘÚŐĹÔÓŃ (%d%%) - ŇÁÚŇĹŰĹÎĎ: %llu ëâ" #define MSG_QUOTA_EXCEEDED "đŇĹ×ŮŰĹÎÉĹ Ë×ĎÔŮ: [%s] ÎĹ ÂŐÄĹÔ ÓĎČŇÁÎĹÎ" #define MSG_AUTH_UNKNOWN "îĹÉÚ×ĹÓÔÎŮĘ ÍĹÔĎÄ Á×ÔĎŇÉÚÁĂÉÉ" #define MSG_PDB_BROKEN "îĹ×ĎÚÍĎÖÎĎ ĐŇĎŢÉÔÁÔŘ ĐŇĎÉÎÄĹËÓÉŇĎ×ÁÎÎŮĘ ĆÁĘĚ puredb (ÉĚÉ ÜÔĎ ÓÔÁŇŮĘ ĆĎŇÍÁÔ) - đĎĐŇĎÂŐĘÔĹ pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s ÜÔĎ ĐÓĹ×ÄĎÎÉÍ ÄĚŃ %s." #define MSG_ALIASES_UNKNOWN "îĹÉÚ×ĹÓÔÎŮĘ ĐÓĹ×ÄĎÎÉÍ %s." #define MSG_ALIASES_BROKEN_FILE "ňÁÚŇŐŰĹÎ ĆÁĘĚ ĐÓĹ×ÄĎÎÉÍĎ×" #define MSG_ALIASES_LIST "äĎÓÔŐĐÎŮ ÓĚĹÄŐŔÝÉĹ ĐÓĹ×ÄĎÎÉÍŮ:" #define MSG_PERUSER_MAX "îĹ×ĎÚÍĎÖÎĎ ÉÓĐĎĚŘÚĎ×ÁÔŘ ÂĎĚŘŰĹ ŢĹÍ %lu ÓĎĹÄÉÎĹÎÉĘ ĎÔ ĎÄÎĎÇĎ ĐĎĚŘÚĎ×ÁÔĹĚŃ" #define MSG_IPV6_OK "óĎĹÄÉÎĹÎÉŃ ĐĎ IPv6 ÔÁËÖĹ ĐĎÄÄĹŇÖÉ×ÁŔÔÓŃ ÎÁ ÜÔĎÍ ÓĹŇ×ĹŇĹ" #define MSG_TLS_INFO "TLS: éÓĐĎĚŘÚŐĹÔÓŃ %s Ó %s, %d-ÂÉÔÎŮĘ ÓĹËŇĹÔÎŮĘ ËĚŔŢ" #define MSG_TLS_WEAK "TLS: ëĚŔŢ ÎĹÎÁÄĹÖĹÎ" #define MSG_TLS_NEEDED "éÚ×ÉÎÉÔĹ, ÎĹÚÁÝÉÝĹÎÎŮĹ ĐĎÄËĚŔŢĹÎÉŃ ÚÁĐŇĹÝĹÎŮ ÎÁ ÓĹŇ×ĹŇĹ.\n" \ "đĎÄËĚŔŢÉÔĹÓŘ ĹÝĹ ŇÁÚ, ÉÓĐĎĚŘÚŐŃ ŰÉĆŇĎ×ÁÎÉĹ TLS." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/messages_kr.h0000644000175000017500000003140213446174132016656 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "˝Ă°Ł Ăʰú" #define MSG_CAPABILITIES "ąâ´É ŔüČŻ şŇ°Ą" #define MSG_CLIENT_CLOSED_CNX "ĹŹśóŔĚžđĆŽ°Ą Á˘źÓŔť ´ÝŔ˝" #define MSG_CLIENT_READ_ERR "ĹŹśóŔĚžđĆŽ ŔĐąâ żŔˇů" #define MSG_CANT_OPEN_CNX "żŹ°á şŇ°Ą" #define MSG_CANT_CREATE_DATA_SOCKET "ľĽŔĚĹÍ źŇÄĎŔť ¸¸ľéźö žřŔ˝" #define MSG_DEBUG_CLIENT_IS "Á˘źÓŔÚŔÇ Á֟ҴÂ" #define MSG_SYNTAX_ERROR_IP "IP ÁÖźŇ ą¸šŽżĄ šŽÁڰĄ ŔÖŔ˝" #define MSG_PORT_SUCCESSFUL "PORT ¸íˇÉ źş°ř" #define MSG_ONLY_IPV4V6 "IPv4 żÍ IPv6 ¸¸ ÁöżřÇÔ (1,2)" #define MSG_ONLY_IPV4 "IPv4 ¸¸ Áöżř (1)" #define MSG_TIMEOUT_PARSER "˝Ă°Ł Ăʰú" #define MSG_LINE_TOO_LONG "łĘšŤ ąäÁŮ" #define MSG_LOG_OVERFLOW "Á˘źÓŔÚ°Ą ¸íˇÉžî šöĆŰŔÇ overflow¸Ś ˝ĂľľÇÔ" #define MSG_GOODBYE "žČłçČ÷~ ž÷ˇÎľĺ %llu / ´ŮżîˇÎľĺ %llu kb" #define MSG_DEBUG_COMMAND "¸íˇÉžî" #define MSG_IS_YOUR_CURRENT_LOCATION "żĄ Ŕ§ÄĄÇϰí ŔÖ˝Ŕ´Ď´Ů." #define MSG_NOT_LOGGED_IN "ˇÎą×ŔÎ ÇĎÁö žĘžŇ˝Ŕ´Ď´Ů." #define MSG_AUTH_UNIMPLEMENTED "ş¸žČ ľľą¸¸Ś ťçżëÇŇźö žřŔ˝" #define MSG_NO_FILE_NAME "ĆÄŔĎ¸í žřŔ˝" #define MSG_NO_DIRECTORY_NAME "ľđˇşĹ与 Ŕ̸§ žřŔ˝" #define MSG_NO_RESTART_POINT "Ŕç˝ĂŔŰ Ŕ§ÄĄ°Ą žřŔ˝" #define MSG_ABOR_SUCCESS "ABOR °Ą źş°řÇÔ" #define MSG_MISSING_ARG "şŻźö°ŞŔĚ žřŔ˝" #define MSG_GARBAGE_FOUND "şŻźö°ŞľÚżĄ ž˛ˇšąâ °ŞŔĚ ŔÖŔ˝" #define MSG_VALUE_TOO_LARGE "şŻźö°Ą łĘšŤ Ĺ­" #define MSG_IDLE_TIME "´ëąâ ˝Ă°Ł %lu ĂʡΠźłÁ¤ľĘ" #define MSG_SITE_HELP "´ŮŔ˝ SITE ¸íˇÉžî¸Ś ŔνÄÇÔ" #define MSG_BAD_CHMOD "Ŕ߸řľČ ąÇÇŃ" #define MSG_UNKNOWN_EXTENSION "´Â ¸đ¸Ł´Â ąâ´ÉŔÓ" #define MSG_XDBG_OK "XDBG ¸íˇÉ źş°ř, ľđšöą× źöÁŘ: %d" #define MSG_UNKNOWN_COMMAND "¸đ¸Ł´Â ¸íˇÉ" #define MSG_TIMEOUT_NOOP "˝Ă°ŁĂʰú (%lu ľżžČ ŔŰľżÇĎÁö žĘŔ˝)" #define MSG_TIMEOUT_DATA "˝Ă°ŁĂʰú (%lu ĂĘ ľżžČ ťőˇÎżî ľĽŔĚĹÍ¸Ś šŢÁö ¸řÇÔ)" #define MSG_SLEEPING "žĆ~ ÁšˇÁ Zzzz..." #define MSG_ALREADY_LOGGED "ŔĚšĚ ˇÎą×ŔÎ ľÇžîŔÖ˝Ŕ´Ď´Ů." #define MSG_ANY_PASSWORD "žĆšŤ ĆĐ˝şżöľĺˇÎľľ ˇÎą×ŔÎ °Ą´ÉÇÔ" #define MSG_ANONYMOUS_LOGGED "Anonymous ŔŻŔú ˇÎą×ŔÎ" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "°Ąťó FTPżĄ Anonymous ŔŻŔú°Ą ˇÎą×ŔÎÇÔ" #define MSG_USER_OK "ŔŻŔú %s OK. žĎČŁ°Ą ÇĘżäÇŐ´Ď´Ů." #define MSG_CANT_DO_TWICE "ÇöŔç źźźÇżĄź­´Â şŇ°Ą´É ÇŐ´Ď´Ů." #define MSG_UNABLE_SECURE_ANON "žČŔüÇŃ anonymous FTP °Ą şŇ°Ą´ÉÇÔ" #define MSG_BANDWIDTH_RESTRICTED "´ëżŞĆřŔĚ ÁŚÇѾǞî ŔÖ˝Ŕ´Ď´Ů." #define MSG_NO_PASSWORD_NEEDED "žĆšŤ ĆĐ˝şżöľĺˇÎľľ ˇÎą×ŔÎ °Ą´ÉÇÔ" #define MSG_NOTRUST "ÁËźŰÇմϴٸ¸, ´ç˝ĹŔť šĎŔť źö žřąşżä." #define MSG_WHOAREYOU "´ç˝ĹŔĚ ´Šą¸˝Ĺ°Ążä?" #define MSG_AUTH_FAILED "ŔÎÁő ˝ÇĆĐ" #define MSG_AUTH_TOOMANY "šÝşšľČ ŔÎÁő ˝ÇĆĐ" #define MSG_NO_HOMEDIR "Ȩ ľđˇşĹ与°Ą Á¸ŔçÇĎÁö žĘŔ˝ - ĂëźŇ" #define MSG_NO_HOMEDIR2 "%s °Ą Á¸ŔçÇĎÁö žĘ°ĹłŞ žďźź˝ş ÇŇźö žřŔ˝" #define MSG_START_SLASH "/ żĄź­ ˝ĂŔŰÇÔ" #define MSG_USER_GROUP_ACCESS "ŔŻŔú %s ´Â ´ŮŔ˝ ą×ˇěżĄ Á˘ąŮ °Ą´É" #define MSG_FXP_SUPPORT "ŔĚ ź­šö´Â FXP ŔüźŰŔĚ ťçżë°Ą´É ÇŐ´Ď´Ů." #define MSG_RATIO "ž÷/´ŮżîˇÎľĺ (%u:%u) şńŔ˛Ŕť ÁöÄŃÁÖźźżä." #define MSG_CHROOT_FAILED "chroot() ¸Ś źłÁ¤ÇŇźö žřŔ˝" #define MSG_CURRENT_DIR_IS "ÇöŔç ľđˇşĹ与: %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "ÁŚÇŃľČ ľđˇşĹ与´Â %s" #define MSG_IS_NOW_LOGGED_IN "%s °Ą ˇÎą×ŔÎ" #define MSG_CANT_CHANGE_DIR "%s ľđˇşĹ与ˇÎ ŔĚľżÇŇźö žřŔ˝" #define MSG_PATH_TOO_LONG "ĆĐ˝ş°Ą łĘšŤ ąé´Ď´Ů." #define MSG_CANT_PASV "IPv6 Á˘źÓżĄź­ PASV ¸Ś ťçżëÇŇźö žř˝Ŕ´Ď´Ů. EPSV ¸Ś ťçżëÇĎźźżä." #define MSG_CANT_PASSIVE "Ćнúę Á˘źÓŔť ż­źö žřŔ˝" #define MSG_PORTS_BUSY "żšžŕľČ ¸đľç TCP Ć÷ĆŽ°Ą ťçżëÁßŔÔ´Ď´Ů." #define MSG_GETSOCKNAME_DATA "łťşÎ ľĽŔĚĹÍ źŇÄĎŔĚ ČŽŔÎÇŇźö žřŔ˝" #define MSG_GETPEERNAME "łťşÎ źŇÄĎŔť ČŽŔÎÇŇźö žřŔ˝" #define MSG_INVALID_IP "Ŕ߸řľČ ÁÖźŇ" #define MSG_NO_EPSV "EPSV ¸Ś ÁöżřÇĎ´Â IPv6 ĹŹśóŔĚžđĆŽ¸Ś ťçżëÇĎźźżä." #define MSG_BAD_PORT "ÁËźŰÇĎÁö¸¸, 1024 ŔĚÇĎ Ć÷ĆŽˇÎ´Â Á˘źÓÇŇźö žř˝Ŕ´Ď´Ů." #define MSG_NO_FXP "%s Ć÷ĆŽˇÎ´Â Á˘źÓÇŇźö žř˝Ŕ´Ď´Ů. (%s ¸¸ ťçżë°Ą)" #define MSG_FXP "FXP ŔüźŰ : %s - %s" #define MSG_NO_DATA_CONN "ľĽŔĚĹͰĄ žřŔ˝" #define MSG_ACCEPT_FAILED "Á˘źÓŔť šŢžĆľéŔĎźö žřžúŔ˝" #define MSG_ACCEPT_SUCCESS "ľĽŔĚĹÍ Á˘źÓŔť šŢŔ˝" #define MSG_CNX_PORT_FAILED "%d Ć÷ĆŽˇÎ Á˘źÓŔĚ şŇ°Ą´É" #define MSG_CNX_PORT "%d Ć÷ĆŽˇÎ Á˘źÓÁß" #define MSG_ANON_CANT_MKD "ÁËźŰÇŐ´Ď´Ů. anonymous ŔŻŔú´Â ľđˇşĹ与¸Ś ¸¸ľéźö žř˝Ŕ´Ď´Ů." #define MSG_ANON_CANT_RMD "ÁËźŰÇŐ´Ď´Ů. anonymous ŔŻŔú´Â ľđˇşĹ与¸Ś ťčÁŚÇŇźö žř˝Ŕ´Ď´Ů." #define MSG_ANON_CANT_RENAME "Anonymous ŔŻŔúŔÇ ĆÄŔĎŔÇ ŔĚľż, ĆÄŔĎ¸í şŻ°ćŔĚ ÁŚÇѾǞî ŔÖ˝Ŕ´Ď´Ů." #define MSG_ANON_CANT_CHANGE_PERMS "Anonymous ŔŻŔú´Â ĆŰšĚźÇ şŻ°ćŔĚ şŇ°Ą´É ÇŐ´Ď´Ů." #define MSG_GLOB_NO_MEMORY "%s ¸Ś globbing ÇĎ´řÁß ¸Ţ¸đ¸Ž Ăʰú" #define MSG_PROBABLY_DENIED "(Ŕ̰ÍŔş \"Çă°Ą °ĹşÎ\")ŔÔ´Ď´Ů." #define MSG_GLOB_READ_ERROR "%s ¸Ś globbing ÇĎ´řÁß ŔĐąâ żŔˇů šßťý" #define MSG_GLOB_NO_MATCH "ĂŁŔťźö žřŔ˝ %s / %s" #define MSG_CHMOD_FAILED "%s żĄź­ ĆŰšĚźÇ şŻ°ćŔĚ şŇ°Ą" #define MSG_CHMOD_SUCCESS "%s ˇÎ Ć̟ۚÇŔĚ şŻ°ćľČ" #define MSG_CHMOD_TOTAL_FAILURE "ĆŰšĚźÇ şŻ°ćŔĚ şŇ°Ą´ÉÇŐ´Ď´Ů." #define MSG_ANON_CANT_DELETE "Anonymous ŔŻŔú´Â ĆÄŔĎŔť ťčÁŚ ÇŇźö žř˝Ŕ´Ď´Ů." #define MSG_ANON_CANT_OVERWRITE "Anonymous ŔŻŔú´Â ľ¤žîžşżěąâ°Ą şŇ°Ą´É ÇŐ´Ď´Ů." #define MSG_DELE_FAILED "%s ¸Ś ťčÁŚÇŇźö žřŔ˝" #define MSG_DELE_SUCCESS "%s%s%s%s ťčÁŚľĘ" #define MSG_DELE_TOTAL_FAILURE "ťčÁŚľČ ĆÄŔĎ žřŔ˝" #define MSG_LOAD_TOO_HIGH \ "˝Ă˝şĹŰŔÇ şÎÇϰĄ %3.2f ŔÔ´Ď´Ů. ÇöŔç ´ŮżîˇÎľĺ´Â şŇ°Ą´ÉÇŐ´Ď´Ů.\n" \ "ž÷ˇÎľĺ´Â žđÁŚłŞ °Ą´ÉÇÔ" #define MSG_OPEN_FAILURE "%s ¸Ś ż­źö žřŔ˝" #define MSG_OPEN_FAILURE2 "ą× ĆÄŔĎŔť ż­źö žř˝Ŕ´Ď´Ů." #define MSG_STAT_FAILURE "ĆÄŔĎ ĹŠąâ¸Ś žËźö žř˝Ŕ´Ď´Ů." #define MSG_STAT_FAILURE2 "ĆÄŔĎŔÇ Á¸Ŕ翊şÎ¸Ś ČŽŔÎÇŇźö žř˝Ŕ´Ď´Ů." #define MSG_REST_TOO_LARGE_FOR_FILE "offset %lld żĄź­ Ŕç˝ĂŔŰ şŇ°Ą. ĆÄŔĎ ĹŠąâ %lld" #define MSG_REST_RESET "offset 0 şÎĹÍ Ŕç˝ĂŔŰ" #define MSG_NOT_REGULAR_FILE "ŔĎšÝŔűŔÎ ĆÄŔϸ¸ ´ŮżîˇÎľĺ ÇŇźö ŔÖ˝Ŕ´Ď´Ů." #define MSG_NOT_MODERATED \ "ŔĚ ĆÄŔĎŔş ´Ů¸Ľ anonymous°Ą ž÷ˇÎľĺÇѰÍŔ¸ˇÎ °ü¸ŽŔÚŔÇ ČŽŔÎŔť °ĹĂĞ߸¸ ´ŮżîˇÎľĺ ÇŇźö ŔÖ˝Ŕ´Ď´Ů." #define MSG_RATIO_DENIAL \ "ÁËźŰÇŐ´Ď´Ů. ´ç˝ĹŔÇ ž÷/´Ůżî şńŔ˛Ŕş %u:%u ŔÔ´Ď´Ů.\n" \ "´ç˝ĹŔş %llu Kb ¸Ś ž÷ˇÎľĺÇϰí %llu Kb¸Ś ´ŮżîˇÎľĺ ÇĎż´˝Ŕ´Ď´Ů.\n" \ "ÁÁŔş ĆÄŔĎŔť ž÷ˇÎľĺ ÇŘÁÖźźżä." #define MSG_NO_MORE_TO_DOWNLOAD "´ŮżîˇÎľĺ ÇŇ °ÍŔĚ žřŔ˝" #define MSG_WINNER "ÄÄÇťĹÍ´Â ´ç˝ĹŔÇ ÄŁą¸ŔĚ´Ď šĎžîžß¸¸ ÇŐ´Ď´Ů!" #define MSG_KBYTES_LEFT "%.1f kb ´ŮżîˇÎľĺ" #define MSG_ABORTED "ŔüźŰ ĂëźŇ" #define MSG_DATA_WRITE_FAILED "ľĽŔĚĹÍ¸Ś ž˛´ÂÁß żŔˇů šßťý" #define MSG_DATA_READ_FAILED "ľĽŔĚĹÍ¸Ś ŔĐ´ÂÁß żŔˇů šßťý" #define MSG_MMAP_FAILED "map ĆÄŔĎŔť ¸Ţ¸đ¸ŽżĄ ŔĐžîľéŔĎźö žřŔ˝" #define MSG_WRITE_FAILED "ĆÄŔĎŔť ž˛´ÂÁß żŔˇů šßťý" #define MSG_TRANSFER_RATE_M "%.3f ĂĘ, %.2f Mb/ĂĘ" #define MSG_TRANSFER_RATE_K "%.3f ĂĘ, %.2f Kb/ĂĘ" #define MSG_TRANSFER_RATE_B "%.3f ĂĘ, %.2f b/ĂĘ" #define MSG_SPACE_FREE_M "ťçżë°Ą´É ľđ˝şĹŠ żëˇŽ %.1f Mb" #define MSG_SPACE_FREE_K "ťçżë°Ą´É ľđ˝şĹŠ żëˇŽ %f Kb" #define MSG_DOWNLOADED "´ŮżîˇÎľĺ Ážˇá" #define MSG_REST_NOT_NUMERIC "REST´Â źýŔÚ şŻźö¸Ś ÇĘżäˇÎ ÇÔ" #define MSG_REST_ASCII_STRICT "ASCII ¸đľĺżĄź­´Â Reply marker °Ą 0 żŠžßÇÔ" #define MSG_REST_ASCII_WORKAROUND "%lld şÎĹÍ Ŕç˝ĂŔŰ. ą×ˇŻłŞ ASCII ¸đľĺŔÓ" #define MSG_REST_SUCCESS "%lld şÎĹÍ Ŕç˝ĂŔŰ" #define MSG_SANITY_DIRECTORY_FAILURE "ťçżë şŇ°Ą´ÉÇŃ ľđˇşĹ与¸í" #define MSG_SANITY_FILE_FAILURE "ťçżë şŇ°Ą´ÉÇŃ ĆÄŔĎ Ŕ̸§: %s" #define MSG_MKD_FAILURE "ľđˇşĹ与¸Ś ¸¸ľéźö žřŔ˝" #define MSG_MKD_SUCCESS "ľđˇşĹ与¸Ś źş°řŔűŔ¸ˇÎ ¸¸ľë" #define MSG_RMD_FAILURE "ľđˇşĹ与¸Ś ťčÁŚÇŇźö žřŔ˝" #define MSG_RMD_SUCCESS "ľđˇşĹ与°Ą źş°řŔűŔ¸ˇÎ ťčÁŚľĘ" #define MSG_TIMESTAMP_FAILURE "time stamp¸Ś ŔĐÁö ¸řÇÔ" #define MSG_MODE_ERROR "ASCII°ú šŮŔĚłĘ¸Ž ¸đľĺ¸¸Ŕť ÁöżřÇÔ" #define MSG_CREATE_FAILURE "ĆÄŔĎ ťýźş şŇ°Ą" #define MSG_ABRT_ONLY "ABRT ¸íˇÉŔş ž÷ˇÎľĺś§¸¸ ťçżëÇŇźö ŔÖ˝Ŕ´Ď´Ů." #define MSG_UPLOAD_PARTIAL "ŔϺκи¸ ž÷ˇÎľĺľĘ" #define MSG_REMOVED "ťčÁŚľĘ" #define MSG_UPLOADED "ž÷ˇÎľĺľĘ" #define MSG_GMTIME_FAILURE "ÇöŔç ˝Ă°ŁŔť žËźö žřŔ˝" #define MSG_TYPE_8BIT_FAILURE "8-bit bytes¸¸Ŕť ÁöżřÇŐ´Ď´Ů. ÁöąÝŔş 10łâŔüŔĚ žĆ´ĎŔݞƿä?" #define MSG_TYPE_UNKNOWN "žËźö žř´Â TYPE" #define MSG_TYPE_SUCCESS "ÇöŔç TYPE Ŕş" #define MSG_STRU_FAILURE "F(ile) ¸¸Ŕť ÁöżřÇÔ" #define MSG_MODE_FAILURE "S(tream) ¸đľĺ¸Ś ťçżëÇĎźźżä" #define MSG_RENAME_ABORT "Ŕ̸§ şŻ°ć ŔŰž÷Ŕť ĂëźŇÇÔ" #define MSG_RENAME_RNFR_SUCCESS "RNFR ÇăżëľĘ - ĆÄŔĎ Á¸Ŕç, ŔüźŰ ÁŘşńľĘ" #define MSG_FILE_DOESNT_EXIST "ÁËźŰÇմϴٸ¸, ĆÄŔĎŔĚ žř˝Ŕ´Ď´Ů." #define MSG_RENAME_ALREADY_THERE "RENAME ˝ÇĆĐ - ĆÄŔĎŔĚ ŔĚšĚ Á¸ŔçÇŐ´Ď´Ů." #define MSG_RENAME_NORNFR "RNFR ČÄżĄ RNTO ťçżë" #define MSG_RENAME_FAILURE "Ŕ̸§şŻ°ć/ŔĚľż ˝ÇĆĐ" #define MSG_RENAME_SUCCESS "ĆÄŔĎŔĚ źş°řŔűŔ¸ˇÎ şŻ°ć/ŔĚľżľĘ" #define MSG_NO_SUPERSERVER "pure-ftpd¸Ś super-server (tcpserverżÍ °°Ŕş)ˇÎ ˝ÇÇŕÇĎźźżä." #define MSG_NO_FTP_ACCOUNT "'ftp' °čÁ¤ŔĚ Á¸ŔçÇĎÁö žĘŔ˝" #define MSG_CONF_ERR "źłÁ¤ żŔˇů" #define MSG_NO_VIRTUAL_FILE "°Ąťó ŔŻŔú ĆÄŔĎ Ŕ̸§ŔĚ žřŔ˝" #define MSG_ILLEGAL_THROTTLING "Ŕ߸řľČ ŔüźŰ źÓľľ°Ş" #define MSG_ILLEGAL_TRUSTED_GID "chroot¸Ś Ŕ§ÇŃ gid °ŞŔĚ Ŕ߸řľĘ" #define MSG_ILLEGAL_USER_LIMIT "Ŕ߸řľČ ĂÖ´ë ŔŻŔúźö°Ş" #define MSG_ILLEGAL_FACILITY "¸đ¸Ł´Â facility Ŕ̸§" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Ŕ߸řľČ LDAP źłÁ¤ ĆÄŔĎ" #define MSG_ILLEGAL_LOAD_LIMIT "Ŕ߸řľČ ź­šöşÎÇĎ ÁŚÇѰŞ" #define MSG_ILLEGAL_PORTS_RANGE "Ŕ߸řľČ Ć÷ĆŽ šüŔ§" #define MSG_ILLEGAL_LS_LIMITS "Ŕ߸řľČ 'ls' ÁŚÇŃ" #define MSG_ILLEGAL_FORCE_PASSIVE "ĆĐ˝Ăşę żŹ°áŔť Ŕ§ÇŃ IP °ŞŔĚ źłÁ¤żĄ šŽÁڰĄ ŔÖŔ˝" #define MSG_ILLEGAL_RATIO "ž÷/´Ůżî şńŔ˛°ŞŔĚ Ŕ߸řľĘ" #define MSG_ILLEGAL_UID_LIMIT "uid ÁŚÇѰŞŔĚ Ŕ߸řľĘ" #define MSG_ILLEGAL_OPTION "žËźö žř´Â ˝ÇÇŕ żÉźÇ" #define MSG_LDAP_MISSING_BASE "LDAP źłÁ¤ĆÄŔĎżĄ LDAPBaseDN °ŞŔĚ žřŔ˝" #define MSG_LDAP_WRONG_PARMS "Ŕ߸řľČ LDAP źłÁ¤" #define MSG_NEW_CONNECTION "%s şÎĹÍ ťőˇÎżî żŹ°á" #define MSG_WELCOME_TO "žîź­żŔźźżä!~" #define MSG_MAX_USERS "%lu ¸í (ĂÖ´ë ľż˝Ă Á˘źÓ ÁŚÇŃ)ŔĚ ŔĚšĚ Á˘źÓÇŘ ŔÖ˝Ŕ´Ď´Ů. ÁËźŰÇŐ´Ď´Ů." #define MSG_NB_USERS "´ç˝ĹŔş %u šř°ˇÎ Á˘źÓÁßŔÔ´Ď´Ů. ĂÖ´ë %u ¸í" #define MSG_WELCOME_TIME "ÇöŔç ˝Ă°˘Ŕş %02d:%02d, ťçżëÁßŔÎ Ć÷ĆŽ´Â %u ŔÔ´Ď´Ů." #define MSG_ANONYMOUS_FTP_ONLY "anonymous ŔŻŔú¸¸ Á˘źÓ °Ą´ÉÇŐ´Ď´Ů." #define MSG_RATIOS_EVERYONE "¸đľç ŔŻŔúżĄ°Ô ž÷/´Ůżî şńŔ˛ŔĚ ŔűżëľĘ :" #define MSG_RATIOS_ANONYMOUS "anonymous ŔŻŔú´Â ž÷/´Ůżî şńŔ˛ŔĚ ŔűżëľĘ :" #define MSG_RATIOS_RULE "´ŮżîˇÎľĺ %u Mb, ž÷ˇÎľĺ %u Mb" #define MSG_INFO_IDLE_M "%lu şĐ ľżžČ žĆšŤ°Íľľ ÇĎÁö žĘŔ¸¸é Á˘źÓŔĚ ˛÷žîÁý´Ď´Ů." #define MSG_INFO_IDLE_S "%lu ĂĘ ľżžČ žĆšŤ°Íľľ ÇĎÁö žĘŔ¸¸é Á˘źÓŔĚ ˛÷žîÁý´Ď´Ů." #define MSG_CANT_READ_FILE "[%s] ĆÄŔĎŔť ŔĐŔťźö žř˝Ŕ´Ď´Ů." #define MSG_LS_TRUNCATED "%u °łŔÇ °á°ú ÇĽ˝Ă" #define MSG_LS_SUCCESS "%u °Ą ŔĎÄĄľĘ" #define MSG_LOGOUT "ˇÎą×žĆżô." #define MSG_AUTH_FAILED_LOG "[%s] ŔŻŔú ŔÎÁő ˝ÇĆĐ" #define MSG_ILLEGAL_UMASK "Ŕ߸řľČ umask" #define MSG_STANDALONE_FAILED "standalone ¸đľĺˇÎ ź­šö¸Ś ˝ĂŔŰÇŇźö žř˝Ŕ´Ď´Ů." #define MSG_NO_ANONYMOUS_LOGIN "anonymous Á˘źÓŔş ÇăżëÇĎÁö žĘ˝Ŕ´Ď´Ů." #define MSG_ANONYMOUS_ANY_PASSWORD "žĆšŤ ĆĐ˝şżöľĺłŞ ÇăżëľĘ" #define MSG_MAX_USERS_IP "(%lu) ˇÎ şÎĹÍ ĂʰúľČ Á˘źÓźö" #define MSG_ACTIVE_DISABLED "Active ¸đľĺ´Â ťçżë şŇ°ĄľĘ" #define MSG_TRANSFER_SUCCESSFUL "ĆÄŔĎŔĚ źş°řŔűŔ¸ˇÎ ŔüźŰľĘ" #define MSG_NO_DISK_SPACE "ľđ˝şĹŠ żëˇŽ şÎÁˇ - łŞÁßżĄ ž÷ˇÎľĺ ÇŘÁÖźźżä" #define MSG_OUT_OF_MEMORY "¸Ţ¸đ¸Ž Ăʰú" #define MSG_ILLEGAL_TRUSTED_IP "Ŕ߸řľČ ˝ĹˇÚľÇ´Â IP ÁÖźŇ" #define MSG_NO_ASCII_RESUME "ASCII ¸đľĺˇÎ ŔçŔüźŰŔş žČŔüÇĎÁö žĘŔ¸´Ď, ¸ŐŔú ĆÄŔĎŔť ťčÁŚ ÇĎźźżä." #define MSG_UNKNOWN_ALTLOG "Ŕ߸řľČ ˇÎą× ÇüĹÂ" #define MSG_ACCOUNT_DISABLED "[%s] ˇÎ ˇÎą×ŔÎ şŇ°Ą : °čÁ¤ ťçżëşŇ°Ą" #define MSG_SQL_WRONG_PARMS "Ŕ߸řľČ SQL şŻźö" #define MSG_ILLEGAL_CONFIG_FILE_SQL "SQL źłÁ¤ ĆÄŔĎżĄ šŽÁڰĄ ŔÖŔ˝" #define MSG_SQL_MISSING_SERVER "SQL źłÁ¤ ĆÄŔĎżĄ ź­šö°Ą žřŔ˝" #define MSG_SQL_DOWN "SQL °Ą ŔŰľżľÇÁö žĘ´Â°Í °°˝Ŕ´Ď´Ů." #define MSG_ILLEGAL_QUOTA "Ŕ߸řľČ ÄőŸ źłÁ¤" #define MSG_QUOTA_FILES "%llu °łŔÇ ĆÄŔĎ (%d%%) - ĂÖ´ë: %llu files" #define MSG_QUOTA_SIZE "%llu Kbytes ťçżëÁß (%d%%) - ĂÖ´ë: %llu Kb" #define MSG_QUOTA_EXCEEDED "ÄőŸ°Ą ĂʰúľÇžúŔ˝ : [%s] ´Â ŔúŔĺľÇÁö žĘžŇŔ˝" #define MSG_AUTH_UNKNOWN "Ŕ߸řľČ ŔÎÁő šć˝Ä" #define MSG_PDB_BROKEN "puredb ŔÎľŚ˝ş ĆÄŔĎŔť ŔĐŔťźö žřŔ˝ (śÇ´Â ŔĚŔü Ć÷¸ËŔť ŔνÄÇĎÁö ¸řÇÔ) - pure-pw mkdb ¸Ś ˝ĂľľÇŘ şź°Í" #define MSG_ALIASES_ALIAS "%sŔş %sŔÇ ş°ÄŞ." #define MSG_ALIASES_UNKNOWN "žË źö žř´Â ş°ÄŞ %s." #define MSG_ALIASES_BROKEN_FILE "źŐťóľČ ş°ÄŞ ĆÄŔĎ" #define MSG_ALIASES_LIST "´ŮŔ˝ŔÇ ş°ÄŞŔĚ ŔÖŔ˝ :" #define MSG_PERUSER_MAX "°°Ŕş ŔŻŔúˇÎ %lu šř ŔĚťóŔÇ żŹ°áŔť ÇăżëÇĎÁö žĘ˝Ŕ´Ď´Ů." #define MSG_IPV6_OK "ŔĚ ź­šö´Â IPv6 żŹ°áľľ ÇăżëÇŐ´Ď´Ů." #define MSG_TLS_INFO "TLS: Enabled %s with %s, %d secret bits cipher" #define MSG_TLS_WEAK "TLS: Cipher too weak" #define MSG_TLS_NEEDED "Sorry, cleartext sessions are not accepted on this server.\n" \ "Please reconnect using TLS security mechanisms." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/messages_sv.h0000644000175000017500000003350013446174132016673 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Timeout" #define MSG_CAPABILITIES "Oförmögen att ändra möjligheter" #define MSG_CLIENT_CLOSED_CNX "Klienten avbröt anslutningen" #define MSG_CLIENT_READ_ERR "Läsfel frĺn klienten" #define MSG_CANT_OPEN_CNX "Kan ej ansluta" #define MSG_CANT_CREATE_DATA_SOCKET "Kan ej skapa data socket" #define MSG_DEBUG_CLIENT_IS "Klientens adress är" #define MSG_SYNTAX_ERROR_IP "Syntax error i IP adress" #define MSG_PORT_SUCCESSFUL "PORT kommando lyckades" #define MSG_ONLY_IPV4V6 "Endast stöd för IPv4 och IPv6 (1,2)" #define MSG_ONLY_IPV4 "Endast stöd för IPv4 (1)" #define MSG_TIMEOUT_PARSER "Timeout - försök att skriva snabbare nästa gĺng" #define MSG_LINE_TOO_LONG "Raden är för lĺng" #define MSG_LOG_OVERFLOW "Klienten försökte fylla kommandoradsbufferten" #define MSG_GOODBYE "Adjö. Du har laddat upp %llu och laddat ned %llu kbytes." #define MSG_DEBUG_COMMAND "Kommando" #define MSG_IS_YOUR_CURRENT_LOCATION "är din nuvarande plats" #define MSG_NOT_LOGGED_IN "Du är inte inloggad" #define MSG_AUTH_UNIMPLEMENTED "Säkerhetsfunktionen är ej installerad" #define MSG_NO_FILE_NAME "Filnamn saknas" #define MSG_NO_DIRECTORY_NAME "Biblioteksnamn saknas" #define MSG_NO_RESTART_POINT "Omstartsplats saknas" #define MSG_ABOR_SUCCESS "Eftersom du ser det här mĺste ABOR lyckats" #define MSG_MISSING_ARG "Argument saknas" #define MSG_GARBAGE_FOUND "Skräp efter värde" #define MSG_VALUE_TOO_LARGE "Värdet är för stort" #define MSG_IDLE_TIME "Idle time är %lu sekunder" #define MSG_SITE_HELP "Följande SITE kommandon känns igen" #define MSG_BAD_CHMOD "Felaktig behörighet" #define MSG_UNKNOWN_EXTENSION "är en okänd extension" #define MSG_XDBG_OK "XDBG kommando lyckades, debug nivĺ är nu %d" #define MSG_UNKNOWN_COMMAND "Okänt kommando" #define MSG_TIMEOUT_NOOP "Timeout (ingen inmatning under %lu sekunder)" #define MSG_TIMEOUT_DATA "Timeout (inga nya data under %lu sekunder)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "Du är redan inloggad" #define MSG_ANY_PASSWORD "Vilket lösenord som helst fungerar" #define MSG_ANONYMOUS_LOGGED "Anonym användare är inloggad" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Anonym användare loggade in i virtuell FTP" #define MSG_USER_OK "Användare %s OK. Lösenord krävs" #define MSG_CANT_DO_TWICE "Vi kan inte göra det i denna session" #define MSG_UNABLE_SECURE_ANON "Oförmögen att starta säker anonym FTP" #define MSG_BANDWIDTH_RESTRICTED "Din bandbredd är begränsad" #define MSG_NO_PASSWORD_NEEDED "Vilket lösenord som helst fungerar" #define MSG_NOTRUST "Jag kan tyärr inte lita pĺ Dig" #define MSG_WHOAREYOU "Var vänlig och tala om vem Du är" #define MSG_AUTH_FAILED "Behörighetskontroll misslyckades" #define MSG_AUTH_TOOMANY "För mĺnga behörighetskontroller har misslyckats" #define MSG_NO_HOMEDIR "Hembibliotek är inte tillgängligt - avbryter" #define MSG_NO_HOMEDIR2 "%s existerar inte eller kan ej nĺs" #define MSG_START_SLASH "Startar i /" #define MSG_USER_GROUP_ACCESS "Användare %s har grupptillhörighet" #define MSG_FXP_SUPPORT "Denna server stödjer FXP överföringar" #define MSG_RATIO "Du mĺste respektera en %u:%u (UL/DL) kvot" #define MSG_CHROOT_FAILED "Oförmögen att starta ett säkert chroot() skal" #define MSG_CURRENT_DIR_IS "OK. Nuvarande bibliotek är %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Nuvarande begränsade bibliotek är %s" #define MSG_IS_NOW_LOGGED_IN "%s har loggat in" #define MSG_CANT_CHANGE_DIR "Kan ej ändra bibliotek till %s" #define MSG_PATH_TOO_LONG "Sökvägen är för lĺng" #define MSG_CANT_PASV "Du kan ej använda PASV pĺ IPv6 anslutningar. Använd EPSV istället." #define MSG_CANT_PASSIVE "Kan ej öppna en passiv anslutning" #define MSG_PORTS_BUSY "Alla reserverade TCP portar är upptagna" #define MSG_GETSOCKNAME_DATA "Kan ej identifiera lokal data socket" #define MSG_GETPEERNAME "Kan ej identifiera lokal socket" #define MSG_INVALID_IP "Felaktig adress" #define MSG_NO_EPSV "Var vänlig och använd en IPv6 klient med EPSV stöd" #define MSG_BAD_PORT "Jag ansluter ej till portar < 1024" #define MSG_NO_FXP "Jag öppnar ej en anslutning till %s (endast till %s)" #define MSG_FXP "FXP överföring: frĺn %s till %s" #define MSG_NO_DATA_CONN "Ingen dataförbindelse" #define MSG_ACCEPT_FAILED "Anslutningen kunde ej accepteras" #define MSG_ACCEPT_SUCCESS "Dataförbindelsen accepteras" #define MSG_CNX_PORT_FAILED "Kan ej öppna dataförbindelse till port %d" #define MSG_CNX_PORT "Ansluter till port %d" #define MSG_ANON_CANT_MKD "Anonyma användare har inte behörighet att skapa bibliotek" #define MSG_ANON_CANT_RMD "Anonyma användare har inte behörighet att radera bibliotek" #define MSG_ANON_CANT_RENAME "Anonyma användare har inte behörighet att flytta eller byta namn pĺ filer" #define MSG_ANON_CANT_CHANGE_PERMS "Anonyma användare kan inte ändra rättigheter" #define MSG_GLOB_NO_MEMORY "Minnet är slut pga globbing av %s" #define MSG_PROBABLY_DENIED "(Detta betyder antagligen \"Ĺtkomst nekad\")" #define MSG_GLOB_READ_ERROR "Läsfel under globbing av %s" #define MSG_GLOB_NO_MATCH "Ingen träff för %s i %s" #define MSG_CHMOD_FAILED "Kan ej ändra rättigheter pĺ %s" #define MSG_CHMOD_SUCCESS "Rättigheter ändrade pĺ %s" #define MSG_CHMOD_TOTAL_FAILURE "Jag kunde inte ändra nĺgon rättighet" #define MSG_ANON_CANT_DELETE "Anonyma användare kan inte radera filer" #define MSG_ANON_CANT_OVERWRITE "Anonyma användare kan inte skriva över existerande filer" #define MSG_DELE_FAILED "Kan ej radera %s" #define MSG_DELE_SUCCESS "Raderade %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "Ingen fil är raderad" #define MSG_LOAD_TOO_HIGH \ "Belastningen var %3.2f när du upprättade förbindelse. Vi tillĺter ej nedladdningar\n" \ "av anonyma användare när belastningen är sĺpass hög. Uppladdningar är alltid\n" \ "tillĺtna." #define MSG_OPEN_FAILURE "Kan ej öppna %s" #define MSG_OPEN_FAILURE2 "Kan ej öppna den filen" #define MSG_STAT_FAILURE "Kan ej finna filstorleken" #define MSG_STAT_FAILURE2 "Kan ej kontrollera filens existens" #define MSG_REST_TOO_LARGE_FOR_FILE "Omstart offset %lld är för stor för filstorlek %lld." #define MSG_REST_RESET "Omstart offset är satt till 0" #define MSG_NOT_REGULAR_FILE "Jag kan bara hämta normala filer" #define MSG_NOT_MODERATED \ "Denna fil har laddats upp av en anonym användare. Den har ännu\n" \ "inte blivit godkänd för nedladdning av systemadministratör." #define MSG_RATIO_DENIAL \ "Uppladdning/nedladdningskvoten är %u:%u .\n" \ "Du har laddat upp %llu Kb och laddat ned %llu Kb.\n" \ "Vänligen ladda upp litet goa grejer och försök suga senare." #define MSG_NO_MORE_TO_DOWNLOAD "Inget kvar att ladda ned" #define MSG_WINNER "Datorn är Din vän. Lita pĺ datorn" #define MSG_KBYTES_LEFT "%.1f kbytes att ladda ned" #define MSG_ABORTED "Överföring avbruten" #define MSG_DATA_WRITE_FAILED "Fel under write to data anslutning" #define MSG_DATA_READ_FAILED "Fel under read from data anslutning" #define MSG_MMAP_FAILED "Oförmögen att lägga filen i minnet" #define MSG_WRITE_FAILED "Fel dĺ data skrivs till fil" #define MSG_TRANSFER_RATE_M "%.3f sekunder (uppmätt här), %.2f Mbytes per sekund" #define MSG_TRANSFER_RATE_K "%.3f sekunder (uppmätt här), %.2f Kbytes per sekund" #define MSG_TRANSFER_RATE_B "%.3f sekunder (uppmätt här), %.2f bytes per sekund" #define MSG_SPACE_FREE_M "%.1f Mbytes ledigt diskutrymme" #define MSG_SPACE_FREE_K "%f Kbytes ledigt diskutrymme" #define MSG_DOWNLOADED "nedladdad" #define MSG_REST_NOT_NUMERIC "REST behöver numerisk parameter" #define MSG_REST_ASCII_STRICT "Svarsmarkör mĺste vara 0 i ASCII mode" #define MSG_REST_ASCII_WORKAROUND "Startar om vid %lld. Men vi är i ASCII mode" #define MSG_REST_SUCCESS "Startar om vid %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Biblioteksnamnet är ej tillĺtet" #define MSG_SANITY_FILE_FAILURE "Filnamnet %s är ej tillĺtet" #define MSG_MKD_FAILURE "Kan ej skapa bibliotek" #define MSG_MKD_SUCCESS "Biblioteket har skapats" #define MSG_RMD_FAILURE "Kan ej radera biblioteket" #define MSG_RMD_SUCCESS "Biblioteket har raderats" #define MSG_TIMESTAMP_FAILURE "Kan ej erhĺlla time stamp" #define MSG_MODE_ERROR "Endast stöd för ASCII och binary modes" #define MSG_CREATE_FAILURE "Kan ej skapa fil" #define MSG_ABRT_ONLY "ABRT är det enda tillĺtna kommandot vid uppladdning" #define MSG_UPLOAD_PARTIAL "delvis uppladdad" #define MSG_REMOVED "raderad" #define MSG_UPLOADED "uppladdad" #define MSG_GMTIME_FAILURE "Kunde ej erhĺlla lokal tid" #define MSG_TYPE_8BIT_FAILURE "Endast stöd för 8-bit bytes , Hallĺ - vakna!" #define MSG_TYPE_UNKNOWN "Okänd TYPE" #define MSG_TYPE_SUCCESS "TYPE är nu" #define MSG_STRU_FAILURE "Endast stöd för F(ile)" #define MSG_MODE_FAILURE "Använd S(tream) mode" #define MSG_RENAME_ABORT "Avbryter tidigare namnbytesoperation" #define MSG_RENAME_RNFR_SUCCESS "RNFR accepteras - filen existerar, redo för destination" #define MSG_FILE_DOESNT_EXIST "Filen existerar ej" #define MSG_RENAME_ALREADY_THERE "RENAME misslyckades - destinationsfilen finns redan" #define MSG_RENAME_NORNFR "Behöver RNFR före RNTO" #define MSG_RENAME_FAILURE "Byt namn/flytta misslyckades" #define MSG_RENAME_SUCCESS "Filen har bytt namn eller flyttats" #define MSG_NO_SUPERSERVER "Kör pure-ftpd i en super-server (t ex tcpserver)" #define MSG_NO_FTP_ACCOUNT "Kan ej hitta 'ftp' kontot" #define MSG_CONF_ERR "Konfigurationsfel" #define MSG_NO_VIRTUAL_FILE "Virtuella användares filnamn saknas" #define MSG_ILLEGAL_THROTTLING "Illegalt värde för throttling" #define MSG_ILLEGAL_TRUSTED_GID "Illegal betrodd gid för chroot" #define MSG_ILLEGAL_USER_LIMIT "Illegal användargräns" #define MSG_ILLEGAL_FACILITY "Okänt namn" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Felaktig LDAP konfigurationsfil" #define MSG_ILLEGAL_LOAD_LIMIT "Illegal belastningsgräns" #define MSG_ILLEGAL_PORTS_RANGE "Illegalt portspann" #define MSG_ILLEGAL_LS_LIMITS "Illegal 'ls' begränsning" #define MSG_ILLEGAL_FORCE_PASSIVE "Illegal tvingad IP för passiva anslutningar" #define MSG_ILLEGAL_RATIO "Illegal upp-/nedladdningskvot" #define MSG_ILLEGAL_UID_LIMIT "Illegal uid begränsning" #define MSG_ILLEGAL_OPTION "Okänt körningsval" #define MSG_LDAP_MISSING_BASE "LDAPBaseDN saknas i LDAP konfigurationsfil" #define MSG_LDAP_WRONG_PARMS "Felaktiga LDAP parametrar" #define MSG_NEW_CONNECTION "Nyanslutning frĺn %s" #define MSG_WELCOME_TO "Välkommen till" #define MSG_MAX_USERS "%lu användare (maximala antalet) är redan inloggade" #define MSG_NB_USERS "Du är användare nummer %u av %u tillĺtna" #define MSG_WELCOME_TIME "Lokal tid är nu %02d:%02d. Server port: %u." #define MSG_ANONYMOUS_FTP_ONLY "Endast anonym FTP är tillĺten" #define MSG_RATIOS_EVERYONE "RATIOS är aktiverat för ALLA:" #define MSG_RATIOS_ANONYMOUS "ANONYMA användare utsätts för en UL/DL kvot:" #define MSG_RATIOS_RULE "för att ladda ned %u Mb, är det nödvändigt att ladda upp %u Mb." #define MSG_INFO_IDLE_M "Du kommer att kopplas ned efter %lu minuters inaktivitet." #define MSG_INFO_IDLE_S "Du kommer att kopplas ned efter %lu sekunders inaktivitet." #define MSG_CANT_READ_FILE "Kan ej läsa [%s]" #define MSG_LS_TRUNCATED "Utdata trunkeras till %u träffar" #define MSG_LS_SUCCESS "%u träffar totalt" #define MSG_LOGOUT "Logout." #define MSG_AUTH_FAILED_LOG "Behörighetskontroll misslyckas för användare [%s]" #define MSG_ILLEGAL_UMASK "Ogiltig umask" #define MSG_STANDALONE_FAILED "Kan ej starta standalone server" #define MSG_NO_ANONYMOUS_LOGIN "Detta är ett privat system - Ingen anonym login" #define MSG_ANONYMOUS_ANY_PASSWORD "Vilket lösenord som helst fungerar" #define MSG_MAX_USERS_IP "För mĺnga anslutningar (%lu) frĺn denna IP" #define MSG_ACTIVE_DISABLED "Aktiv mode är avstängd" #define MSG_TRANSFER_SUCCESSFUL "Filen har öveförts" #define MSG_NO_DISK_SPACE "Disken är full - Vänligen ladda upp senare" #define MSG_OUT_OF_MEMORY "Minnet är slut" #define MSG_ILLEGAL_TRUSTED_IP "Ogiltig betrodd IP adress" #define MSG_NO_ASCII_RESUME "ASCII resume är osäker, radera filen först" #define MSG_UNKNOWN_ALTLOG "Okänt loggningsformat" #define MSG_ACCOUNT_DISABLED "Kan ej logga in som [%s]: kontot är avstängt" #define MSG_SQL_WRONG_PARMS "Fel SQL parametrar" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Felaktig SQL konfigurationsfil" #define MSG_SQL_MISSING_SERVER "Server saknas i SQL konfigurationsfil" #define MSG_SQL_DOWN "SQL servern förefaller vara nere" #define MSG_ILLEGAL_QUOTA "Ogiltig kvot" #define MSG_QUOTA_FILES "%llu filer använda (%d%%) - authorized: %llu files" #define MSG_QUOTA_SIZE "%llu Kbytes använda (%d%%) - Tillĺtet: %llu Kb" #define MSG_QUOTA_EXCEEDED "Kvoten överskriden: [%s] kommer inte att sparas" #define MSG_AUTH_UNKNOWN "Okänd behörighetskontroll" #define MSG_PDB_BROKEN "Kan ej läsa den indexerade puredb filen (eller gammalt format) - Försök med pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s är ett alias för %s." #define MSG_ALIASES_UNKNOWN "Okänt alias %s." #define MSG_ALIASES_BROKEN_FILE "Skadad alias fil" #define MSG_ALIASES_LIST "Följande alias är tillgängliga :" #define MSG_PERUSER_MAX "Jag kan inte acceptera fler än %lu anslutningar frĺn en och samma användare" #define MSG_IPV6_OK "IPv6 anslutningar är ocksĺ välkomna till denna server" #define MSG_TLS_INFO "TLS: Använder %s med %s, %d bitars kryptering" #define MSG_TLS_WEAK "TLS: Krypteringen är för svag" #define MSG_TLS_NEEDED "Tyvärr är sessioner i klartext inte tillĺtna pĺ denna server.\n" \ "Vänligen ĺteranslut och använd TLS för ökad säkerhet." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/log_ldap.c0000644000175000017500000004544213450665410016137 0ustar rackeracke /* LDAP posixAccount handler for Pure-FTPd */ #include #ifdef WITH_LDAP # include "ftpd.h" # include "parser.h" # include "log_ldap_p.h" # include "log_ldap.h" # include "messages.h" # include "crypto.h" # include "utils.h" # ifdef HAVE_LIBSODIUM # include # endif # ifdef WITH_DMALLOC # include # endif void pw_ldap_parse(const char * const file) { if (generic_parser(file, ldap_config_keywords) != 0) { illegal_config: die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_CONFIG_FILE_LDAP ": %s" , file == NULL ? "-" : file); } if (ldap_scheme == NULL) { if ((ldap_scheme = strdup(LDAP_DEFAULT_SCHEME)) == NULL) { die_mem(); } } if (ldap_host == NULL) { if ((ldap_host = strdup(LDAP_DEFAULT_SERVER)) == NULL) { die_mem(); } } if (port_s == NULL) { port = LDAP_DEFAULT_PORT; } else { port = atoi(port_s); if (port <= 0 || port > 65535) { port = LDAP_DEFAULT_PORT; } free(port_s); port_s = NULL; } if (ldap_filter == NULL) { if ((ldap_filter = strdup(LDAP_DEFAULT_FILTER)) == NULL) { die_mem(); } } { char *t; if (strchr(ldap_filter, '%') != NULL) { goto illegal_config; } if ((t = strchr(ldap_filter, '\\')) != NULL) { if (t[1] != 'L') { goto illegal_config; } *t++ = '%'; *t = 's'; } } if (ldap_homedirectory == NULL) { if ((ldap_homedirectory = strdup(LDAP_HOMEDIRECTORY)) == NULL) { die_mem(); } } if (ldap_version_s != NULL) { ldap_version = atoi(ldap_version_s); free(ldap_version_s); ldap_version_s = NULL; } else { ldap_version = LDAP_DEFAULT_VERSION; } if (default_uid_s != NULL) { default_uid = (uid_t) strtoul(default_uid_s, NULL, 10); free(default_uid_s); default_uid_s = NULL; } if (default_gid_s != NULL) { default_gid = (gid_t) strtoul(default_gid_s, NULL, 10); free(default_gid_s); default_gid_s = NULL; } if (force_default_uid_s != NULL) { if (strcasecmp(force_default_uid_s, "True") == 0) { force_default_uid = 1; } free(force_default_uid_s); force_default_uid_s = NULL; } if (force_default_gid_s != NULL) { if (strcasecmp(force_default_gid_s, "True") == 0) { force_default_gid = 1; } free(force_default_gid_s); force_default_gid_s = NULL; } use_tls = 0; if (use_tls_s != NULL) { if (strcasecmp(use_tls_s, "True") == 0) { use_tls = 1; } free(use_tls_s); use_tls_s = NULL; } /* Build ldap URI string */ ldap_uri = NULL; { const size_t sizeof_ldap_uri = strlen(ldap_scheme) + sizeof URI_SCHEME_SEPARATOR - 1U + sizeof URI_AUTHORITY_LEADER - 1U + strlen(ldap_host) + sizeof URI_PORT_LEADER - 1U + 5U + /* string representation of port; 5 digits at most */ 1U; /* null byte */ if ((ldap_uri = malloc(sizeof_ldap_uri)) == NULL) { die_mem(); } snprintf(ldap_uri, sizeof_ldap_uri, "%s%s%s%s%s%d", ldap_scheme, URI_SCHEME_SEPARATOR, URI_AUTHORITY_LEADER, ldap_host, URI_PORT_LEADER, port); } /* Default to auth method bind, but for backward compatibility, if a binddn * is supplied, default to password checking. */ if (binddn == NULL) { use_ldap_bind_method = 1; } else { use_ldap_bind_method = 0; } if (ldap_auth_method_s != NULL) { if (strcasecmp(ldap_auth_method_s, "bind") == 0) { use_ldap_bind_method = 1; } else if (strcasecmp(ldap_auth_method_s, "password") == 0) { use_ldap_bind_method = 0; } else { die(421, LOG_ERR, MSG_LDAP_INVALID_AUTH_METHOD); } free(ldap_auth_method_s); ldap_auth_method_s = NULL; } if (base == NULL) { die(421, LOG_ERR, MSG_LDAP_MISSING_BASE); } if (binddn == NULL) { pwd = NULL; } } void pw_ldap_exit(void) { free((void *) ldap_scheme); ldap_scheme = NULL; free((void *) ldap_uri); ldap_uri = NULL; free((void *) ldap_host); ldap_host = NULL; free((void *) port_s); port_s = NULL; port = -1; free((void *) binddn); binddn = NULL; free((void *) pwd); pwd = NULL; free((void *) base); base = NULL; free((void *) ldap_filter); free((void *) ldap_homedirectory); free((void *) default_uid_s); default_uid_s = NULL; free((void *) default_gid_s); default_gid_s = NULL; free((void *) use_tls_s); use_tls_s = NULL; free((void *) ldap_auth_method_s); ldap_auth_method_s = NULL; free((void *) ldap_default_home_directory); ldap_default_home_directory = NULL; } static LDAP *pw_ldap_connect(const char *dn, const char *password) { LDAP *ld; # ifdef LDAP_OPT_PROTOCOL_VERSION int version = ldap_version; # endif if (ldap_uri == NULL) { return NULL; } if (ldap_initialize(&ld, ldap_uri) != LDAP_SUCCESS) { return NULL; } # ifdef LDAP_OPT_PROTOCOL_VERSION if (ldap_set_option(ld, LDAP_OPT_PROTOCOL_VERSION, &version) != LDAP_SUCCESS) { return NULL; } # endif if (use_tls > 0 && ldap_start_tls_s(ld, NULL, NULL) != LDAP_SUCCESS) { return NULL; } if (ldap_bind_s(ld, dn, password, LDAP_AUTH_SIMPLE) != LDAP_SUCCESS) { return NULL; } return ld; } static LDAPMessage *pw_ldap_uid_search(LDAP * const ld, const char *uid, char *attrs[]) { char *alloca_filter; size_t uid_size; size_t filter_size; int rc; LDAPMessage *res; if (uid == NULL || *uid == 0) { return NULL; } uid_size = strlen(uid); if (uid_size > MAX_LDAP_UID_LENGTH) { return NULL; } filter_size = strlen(ldap_filter) + uid_size + (size_t) 1U; if ((alloca_filter = ALLOCA(filter_size)) == NULL) { return NULL; } if (SNCHECK(snprintf(alloca_filter, filter_size, ldap_filter, uid), filter_size)) { ALLOCA_FREE(alloca_filter); return NULL; } rc = ldap_search_s(ld, base, LDAP_SCOPE_SUBTREE, alloca_filter, attrs, 0, &res); ALLOCA_FREE(alloca_filter); if (rc != LDAP_SUCCESS) { return NULL; } return res; } static char *pw_ldap_getvalue(LDAP * const ld, LDAPMessage * const res, const char * const attribute) { char **vals; char *ret; if ((vals = ldap_get_values(ld, res, attribute)) == NULL || vals[0] == NULL) { return NULL; } ret = strdup(vals[0]); ldap_value_free(vals); return ret; } static void pw_ldap_getpwnam_freefields(struct passwd * const p) { free(p->pw_passwd); p->pw_passwd = NULL; free(p->pw_dir); p->pw_dir = NULL; free(p->pw_shell); p->pw_shell = NULL; } static int pw_ldap_validate_name(const char *name) { if (name == NULL || *name == 0) { return -1; } do { if (!((*name >= 'a' && *name <= 'z') || (*name >= 'A' && *name <= 'Z') || (*name >= '0' && *name <= '9') || *name == ' ' || *name == '-' || *name == '@' || *name == '_' || *name == '\'' || *name == '.')) { return -1; } name++; } while (*name != 0); return 0; } static struct passwd *pw_ldap_getpwnam(const char *name, AuthResult * const result) { static struct passwd pwret; LDAP *ld; LDAPMessage *res; char *attrs[] = { /* OpenLDAP forgot a 'const' ... */ LDAP_HOMEDIRECTORY, LDAP_UIDNUMBER, LDAP_FTPUID, LDAP_GIDNUMBER, LDAP_FTPGID, LDAP_USERPASSWORD, LDAP_LOGINSHELL, LDAP_FTPSTATUS, # ifdef QUOTAS LDAP_QUOTAFILES, LDAP_QUOTAMBYTES, # endif # ifdef RATIOS LDAP_DOWNLOADRATIO, LDAP_UPLOADRATIO, # endif # ifdef THROTTLING LDAP_DOWNLOADBANDWIDTH, LDAP_UPLOADBANDWIDTH, # endif NULL }; const char *pw_uid_s = NULL; const char *pw_gid_s = NULL; const char *pw_passwd_ldap = NULL; const char *pw_enabled = NULL; # ifdef QUOTAS const char *quota_files = NULL; const char *quota_mbytes = NULL; # endif # ifdef RATIOS const char *ratio_ul = NULL; const char *ratio_dl = NULL; # endif # ifdef THROTTLING const char *bandwidth_ul = NULL; const char *bandwidth_dl = NULL; # endif memset(&pwret, 0, sizeof pwret); pwret.pw_name = pwret.pw_passwd = pwret.pw_gecos = pwret.pw_dir = pwret.pw_shell = NULL; pwret.pw_uid = (uid_t) 0; pwret.pw_gid = (gid_t) 0; if (pw_ldap_validate_name(name) != 0) { return NULL; } if ((ld = pw_ldap_connect(binddn, pwd)) == NULL) { return NULL; } attrs[0] = ldap_homedirectory; if ((res = pw_ldap_uid_search(ld, name, attrs)) == NULL) { goto error; } pw_ldap_getpwnam_freefields(&pwret); pwret.pw_name = (char *) name; pw_enabled = pw_ldap_getvalue(ld, res, LDAP_FTPSTATUS); if (pw_enabled != NULL && strcasecmp(pw_enabled, "enabled") != 0 && strcasecmp(pw_enabled, "TRUE") != 0) { goto error; } free((void *) pw_enabled); pw_enabled = NULL; # ifdef QUOTAS if ((quota_files = pw_ldap_getvalue(ld, res, LDAP_QUOTAFILES)) != NULL) { const unsigned long long q = strtoull(quota_files, NULL, 10); if (q > 0ULL) { result->user_quota_files = q; result->quota_files_changed = 1; } } if ((quota_mbytes = pw_ldap_getvalue(ld, res, LDAP_QUOTAMBYTES)) != NULL) { const unsigned long long q = strtoull(quota_mbytes, NULL, 10); if (q > 0ULL) { result->user_quota_size = q * (1024UL * 1024UL); result->quota_size_changed = 1; } } # endif # ifdef RATIOS if ((ratio_dl = pw_ldap_getvalue(ld, res, LDAP_DOWNLOADRATIO)) != NULL) { const unsigned int q = strtoul(ratio_dl, NULL, 10); if (q > 0U) { result->ratio_download = q; result->ratio_dl_changed = 1; } } if ((ratio_ul = pw_ldap_getvalue(ld, res, LDAP_UPLOADRATIO)) != NULL) { const unsigned int q = strtoul(ratio_ul, NULL, 10); if (q > 0U) { result->ratio_upload = q; result->ratio_ul_changed = 1; } } # endif # ifdef THROTTLING if ((bandwidth_dl = pw_ldap_getvalue(ld, res, LDAP_DOWNLOADBANDWIDTH)) != NULL) { const unsigned long q = (unsigned long) strtoul(bandwidth_dl, NULL, 10); if (q > 0UL) { result->throttling_bandwidth_dl = q * 1024UL; result->throttling_dl_changed = 1; } } if ((bandwidth_ul = pw_ldap_getvalue(ld, res, LDAP_UPLOADBANDWIDTH)) != NULL) { const unsigned long q = (unsigned long) strtoul(bandwidth_ul, NULL, 10); if (q > 0UL) { result->throttling_bandwidth_ul = q * 1024UL; result->throttling_ul_changed = 1; } } # endif if (use_ldap_bind_method == 0) { if ((pw_passwd_ldap = pw_ldap_getvalue(ld, res, LDAP_USERPASSWORD)) == NULL) { /* The LDAP userPassword is empty, this happens when binding to LDAP without sufficient privileges. */ logfile(LOG_WARNING, MSG_WARN_LDAP_USERPASS_EMPTY); goto error; } pwret.pw_passwd = strdup(pw_passwd_ldap); free((void *) pw_passwd_ldap); pw_passwd_ldap = NULL; } else { pwret.pw_passwd = strdup(""); } if (pwret.pw_passwd == NULL) { logfile(LOG_ERR, MSG_OUT_OF_MEMORY); goto error; } /* only force the uid if default_uid has been set */ if (force_default_uid != 0 && default_uid > (uid_t) 0) { pwret.pw_uid = default_uid; } else { if ((pw_uid_s = pw_ldap_getvalue(ld, res, LDAP_FTPUID)) == NULL || *pw_uid_s == 0 || (pwret.pw_uid = (uid_t) strtoul(pw_uid_s, NULL, 10)) <= (uid_t) 0) { free((void *) pw_uid_s); pw_uid_s = NULL; if ((pw_uid_s = pw_ldap_getvalue(ld, res, LDAP_UIDNUMBER)) == NULL || *pw_uid_s == 0 || (pwret.pw_uid = (uid_t) strtoul(pw_uid_s, NULL, 10)) <= (uid_t) 0) { pwret.pw_uid = default_uid; } } } free((void *) pw_uid_s); pw_uid_s = NULL; /* only force the gid if default_gid has been set */ if (force_default_gid != 0 && default_gid > (gid_t) 0) { pwret.pw_gid = default_gid; } else { if ((pw_gid_s = pw_ldap_getvalue(ld, res, LDAP_FTPGID)) == NULL || *pw_gid_s == 0 || (pwret.pw_gid = (gid_t) strtoul(pw_gid_s, NULL, 10)) <= (gid_t) 0) { free((void *) pw_gid_s); pw_gid_s = NULL; if ((pw_gid_s = pw_ldap_getvalue(ld, res, LDAP_GIDNUMBER)) == NULL || *pw_gid_s == 0 || (pwret.pw_gid = (gid_t) strtoul(pw_gid_s, NULL, 10)) <= (gid_t) 0) { pwret.pw_gid = default_gid; } } } free((void *) pw_gid_s); pw_gid_s = NULL; if ((pwret.pw_dir = pw_ldap_getvalue(ld, res, ldap_homedirectory)) == NULL || *pwret.pw_dir == 0) { if (ldap_default_home_directory == NULL || *ldap_default_home_directory == 0) { goto error; } if ((pwret.pw_dir = strdup(ldap_default_home_directory)) == NULL) { die_mem(); } } if ((pwret.pw_shell = pw_ldap_getvalue(ld, res, LDAP_LOGINSHELL)) == NULL) { pwret.pw_shell = strdup(DEFAULT_SHELL); } result->backend_data = ldap_get_dn(ld, res); ldap_msgfree(res); ldap_unbind(ld); return &pwret; error: if (res != NULL) { ldap_msgfree(res); } ldap_unbind(ld); pw_ldap_getpwnam_freefields(&pwret); free((void *) pw_uid_s); free((void *) pw_gid_s); free((void *) pw_passwd_ldap); free((void *) pw_enabled); # ifdef QUOTAS free((void *) quota_files); free((void *) quota_mbytes); # endif # ifdef RATIOS free((void *) ratio_ul); free((void *) ratio_dl); # endif # ifdef THROTTLING free((void *) bandwidth_ul); free((void *) bandwidth_dl); # endif return NULL; } void pw_ldap_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer) { struct passwd *pw; const char *spwd; /* Stored pwd */ const char *cpwd = NULL; /* Computed pwd */ signed char nocase = 0; /* Insensitive strcmp */ (void) sa; (void) peer; result->auth_ok = 0; if (account == NULL || *account == 0 || password == NULL || (pw = pw_ldap_getpwnam(account, result)) == NULL) { return; } result->auth_ok--; /* -1 */ if (use_ldap_bind_method == 1 && result->backend_data != NULL) { LDAP *ld; char *dn = (char *) result->backend_data; int ok = 0; /* Verify password by binding to LDAP */ if (password != NULL && *password != 0 && (ld = pw_ldap_connect(dn, password)) != NULL) { ldap_unbind(ld); ok = 1; } free(result->backend_data); result->backend_data = NULL; if (ok <= 0) { return; } } else { free(result->backend_data); result->backend_data = NULL; spwd = pw->pw_passwd; # ifdef crypto_pwhash_STRPREFIX if (strncasecmp(spwd, PASSWD_LDAP_ARGON2_PREFIX, sizeof PASSWD_LDAP_ARGON2_PREFIX - 1U) == 0) { spwd += (sizeof PASSWD_LDAP_ARGON2_PREFIX - 1U); if (crypto_pwhash_str_verify(spwd, password, strlen(password)) == 0) { goto pwd_ok; } return; } else # endif # ifdef crypto_pwhash_scryptsalsa208sha256_STRPREFIX if (strncasecmp(spwd, PASSWD_LDAP_SCRYPT_PREFIX, sizeof PASSWD_LDAP_SCRYPT_PREFIX - 1U) == 0) { spwd += (sizeof PASSWD_LDAP_SCRYPT_PREFIX - 1U); if (crypto_pwhash_scryptsalsa208sha256_str_verify (spwd, password, strlen(password)) == 0) { goto pwd_ok; } return; } else # endif if (strncasecmp(spwd, PASSWD_LDAP_MD5_PREFIX, sizeof PASSWD_LDAP_MD5_PREFIX - 1U) == 0) { spwd += (sizeof PASSWD_LDAP_MD5_PREFIX - 1U); if (strlen(spwd) >= 32U) { nocase++; } cpwd = crypto_hash_md5(password, nocase); } else if (strncasecmp(spwd, PASSWD_LDAP_SHA_PREFIX, sizeof PASSWD_LDAP_SHA_PREFIX - 1U) == 0) { spwd += (sizeof PASSWD_LDAP_SHA_PREFIX - 1U); if (strlen(spwd) >= 40U) { nocase++; } cpwd = crypto_hash_sha1(password, nocase); } else if (strncasecmp(spwd, PASSWD_LDAP_SSHA_PREFIX, sizeof PASSWD_LDAP_SSHA_PREFIX - 1U) == 0) { spwd += (sizeof PASSWD_LDAP_SSHA_PREFIX - 1U); cpwd = crypto_hash_ssha1(password, spwd); } else if (strncasecmp(spwd, PASSWD_LDAP_SMD5_PREFIX, sizeof PASSWD_LDAP_SMD5_PREFIX - 1U) == 0) { spwd += (sizeof PASSWD_LDAP_SMD5_PREFIX - 1U); cpwd = crypto_hash_smd5(password, spwd); } else if (strncasecmp(spwd, PASSWD_LDAP_CRYPT_PREFIX, sizeof PASSWD_LDAP_CRYPT_PREFIX - 1U) == 0) { spwd += (sizeof PASSWD_LDAP_CRYPT_PREFIX - 1U); cpwd = (const char *) crypt(password, spwd); } else if (*password != 0) { cpwd = password; /* Cleartext */ } else { return; /* Refuse null passwords */ } if (cpwd == NULL) { return; } if (nocase != 0) { if (strcasecmp(cpwd, spwd) != 0) { return; } } if (pure_strcmp(cpwd, spwd) != 0) { return; } } pwd_ok: result->uid = pw->pw_uid; result->gid = pw->pw_gid; if (result->uid <= (uid_t) 0 || result->gid <= (gid_t) 0) { return; } if ((result->dir = strdup(pw->pw_dir)) == NULL) { return; } result->slow_tilde_expansion = 1; result->auth_ok = 1; /* User found, authentication ok */ } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/simpleconf_ftpd.h0000644000175000017500000001121413446174132017526 0ustar rackeracke#ifndef __SIMPLECONF_FTPD_H__ #define __SIMPLECONF_FTPD_H__ 1 #include "simpleconf.h" static const SimpleConfEntry simpleconf_options[] = { {"AllowAnonymousFXP? ", "--allowanonymousfxp"}, {"AllowDotFiles? ", "--allowdotfiles"}, {"AllowUserFXP? ", "--allowuserfxp"}, {"AltLog ()", "--altlog=$0"}, {"AnonymousBandwidth () ()", "--anonymousbandwidth=$0:$1"}, {"AnonymousBandwidth ()", "--anonymousbandwidth=$0"}, {"AnonymousCanCreateDirs? ", "--anonymouscancreatedirs"}, {"AnonymousCantUpload? ", "--anonymouscantupload"}, {"AnonymousOnly? ", "--anonymousonly"}, {"AnonymousRatio () ()", "--anonymousratio=$0:$1"}, {"AntiWarez? ", "--antiwarez"}, {"AutoRename? ", "--autorename"}, {"Bind ()", "--bind=$0"}, {"BrokenClientsCompatibility? ", "--brokenclientscompatibility"}, {"CertFileAndKey () ()", "--certfile=$0,$1"}, {"CertFile ()", "--certfile=$0"}, {"ChrootEveryone? ", "--chrooteveryone"}, {"CreateHomeDir? ", "--createhomedir"}, {"CustomerProof? ", "--customerproof"}, {"Daemonize? ", "--daemonize"}, {"DisplayDotFiles? ", "--displaydotfiles"}, {"DontResolve? ", "--dontresolve"}, {"ExtCert ()", "--extcert=$0"}, {"ForcePassiveIP ()", "--forcepassiveip=$0"}, {"FortunesFile ()", "--fortunesfile=$0"}, {"IPV4Only? ", "--ipv4only"}, {"IPV6Only? ", "--ipv6only"}, {"KeepAllFiles? ", "--keepallfiles"}, {"LimitRecursion () ()", "--limitrecursion=$0:$1"}, {"ExtAuth ()", "--login=extauth:$0"}, {"LDAPConfigFile ()", "--login=ldap:$0"}, {"MySQLConfigFile ()", "--login=mysql:$0"}, {"PAMAuthentication? ", "--login=pam"}, {"PGSQLConfigFile ()", "--login=pgsql:$0"}, {"PureDB ()", "--login=puredb:$0"}, {"UnixAuthentication? ", "--login=unix"}, {"LogPID? ", "--logpid"}, {"MaxClientsNumber ()", "--maxclientsnumber=$0"}, {"MaxClientsPerIP ()", "--maxclientsperip=$0"}, {"MaxDiskUsage ()", "--maxdiskusagepct=$0"}, {"MaxIdleTime ()", "--maxidletime=$0"}, {"MaxLoad ()", "--maxload=$0"}, {"MinUID ()", "--minuid=$0"}, {"NATmode? ", "--natmode"}, {"NoAnonymous? ", "--noanonymous"}, {"NoChmod? ", "--nochmod"}, {"NoRename? ", "--norename"}, {"NoTruncate? ", "--notruncate"}, {"PassivePortRange () ()", "--passiveportrange=$0:$1"}, {"PerUserLimits ():()", "--peruserlimits=$0:$1"}, {"PIDFile ()", "--pidfile=$0"}, {"ProhibitDotFilesWrite? ", "--prohibitdotfileswrite"}, {"ProhibitDotFilesRead? ", "--prohibitdotfilesread"}, {"Quota ():()", "--quota=$0:$1"}, {"SyslogFacility ()", "--syslogfacility=$0"}, {"TLSCipherSuite ()", "--tlsciphersuite=$0"}, {"TLS ()", "--tls=$0"}, {"TrustedGID ()", "--trustedgid=$0"}, {"TrustedIP ()", "--trustedip=$0"}, {"Umask ():()", "--umask=$0:$1"}, {"CallUploadScript? ", "--uploadscript"}, {"UserBandwidth () ()", "--userbandwidth=$0:$1"}, {"UserBandwidth ()", "--userbandwidth=$0"}, {"UserRatio () ()", "--userratio=$0:$1"}, {"VerboseLog? ", "--verboselog"} }; #endif pure-ftpd-1.0.49.orig/src/syslognames.h0000644000175000017500000000313613350542502016714 0ustar rackeracke#ifndef __SYSLOGNAMES_H__ #define __SYSLOGNAMES_H__ 1 #ifdef SYSLOG_NAMES struct { const char *c_name; int c_val; } facilitynames[] = { # ifdef LOG_AUTH { "auth", LOG_AUTH }, # endif # ifdef LOG_AUTHPRIV { "authpriv", LOG_AUTHPRIV }, # endif # ifdef LOG_CRON { "cron", LOG_CRON }, # endif # ifdef LOG_DAEMON { "daemon", LOG_DAEMON }, # endif # ifdef LOG_FTP { "ftp", LOG_FTP }, # endif # ifdef LOG_KERN { "kern", LOG_KERN }, # endif # ifdef LOG_LPR { "lpr", LOG_LPR }, # endif # ifdef LOG_MAIL { "mail", LOG_MAIL }, # endif # ifdef INTERNAL_MARK { "mark", INTERNAL_MARK }, /* INTERNAL */ # endif # ifdef LOG_NEWS { "news", LOG_NEWS }, # endif # ifdef LOG_AUTH { "security", LOG_AUTH }, /* DEPRECATED */ # endif # ifdef LOG_SYSLOG { "syslog", LOG_SYSLOG }, # endif # ifdef LOG_USER { "user", LOG_USER }, # endif # ifdef LOG_UUCP { "uucp", LOG_UUCP }, # endif # ifdef LOG_LOCAL0 { "local0", LOG_LOCAL0 }, # endif # ifdef LOG_LOCAL1 { "local1", LOG_LOCAL1 }, # endif # ifdef LOG_LOCAL2 { "local2", LOG_LOCAL2 }, # endif # ifdef LOG_LOCAL3 { "local3", LOG_LOCAL3 }, # endif # ifdef LOG_LOCAL4 { "local4", LOG_LOCAL4 }, # endif # ifdef LOG_LOCAL5 { "local5", LOG_LOCAL5 }, # endif # ifdef LOG_LOCAL6 { "local6", LOG_LOCAL6 }, # endif # ifdef LOG_LOCAL7 { "local7", LOG_LOCAL7 }, # endif # ifdef LOG_LOCAL8 { "local8", LOG_LOCAL8 }, # endif # ifdef LOG_LOCAL9 { "local9", LOG_LOCAL9 }, # endif { NULL, -1 } }; #else extern struct { const char *c_name; int c_val; } facilitynames[]; #endif #endif pure-ftpd-1.0.49.orig/src/getloadavg.c0000644000175000017500000000046713450665410016471 0ustar rackeracke#ifdef HAVE_CONFIG_H # include #endif #ifndef HAVE_GETLOADAVG int getloadavg(double loadavg[], int nelem) { if (nelem <= 0) { return 0; } do { nelem--; loadavg[nelem] = 0.0; } while (nelem != 0); return nelem; } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/log_pgsql.c0000644000175000017500000005526313450665410016347 0ustar rackeracke#include /* PostgreSQL backend, by Cindy Marasco */ #ifdef WITH_PGSQL # include "ftpd.h" # include "parser.h" # include "log_pgsql_p.h" # include "log_pgsql.h" # include "messages.h" # include "crypto.h" # include "alt_arc4random.h" # include "utils.h" # ifdef HAVE_LIBSODIUM # include # endif # ifdef WITH_DMALLOC # include # endif static int pw_pgsql_validate_name(const char *name) { if (name == NULL || *name == 0) { return -1; } do { if ((*name >= 'a' && *name <= 'z') || (*name >= 'A' && *name <= 'Z') || (*name >= '0' && *name <= '9') || *name == ' ' || *name == '-' || *name == '_' || *name == '\'' || *name == '.' || *name == ':' || *name == '@' || *name == '+') { /* God bless the Ruby 'unless' keyword */ } else { return -1; } name++; } while (*name != 0); return 0; } static char *pw_pgsql_escape_string(PGconn * const id_sql_server, const char *from) { size_t from_len; size_t to_len; char *to; size_t tolen; unsigned int t; unsigned char t1, t2; int error; if (from == NULL) { return NULL; } from_len = strlen(from); to_len = from_len * 2U + (size_t) 1U; if ((to = malloc(to_len + (size_t) 2U)) == NULL) { return NULL; } t = zrand(); t1 = t & 0xff; t2 = (t >> 8) & 0xff; to[to_len] = (char) t1; to[to_len + 1] = (char) t2; /* * I really hate giving a buffer without any size to a 3rd party function. * The "to" buffer is allocated on the heap, not on the stack, if * PQescapeStringConn() is buggy, the stack shouldn't be already * smashed at this point, but data from other malloc can be corrupted and * bad things can happen. It make sense to wipe this area as soon as * possible instead of doing anything with the heap. We'll end up with * a segmentation violation, but without any possible exploit. */ tolen = PQescapeStringConn(id_sql_server, to, from, from_len, &error); if (tolen >= to_len || (unsigned char) to[to_len] != t1 || (unsigned char) to[to_len + 1] != t2) { for (;;) { *to++ = 0; } } to[tolen] = 0; if (error != 0) { return NULL; } return to; } /* * Substitute digraphs for SQL requests. * orig_str is the original string, from the configuration file * full of \L, \I, \P, \R and \D. * query is a buffer to handle the result. * query_len is the size of the buffer. * returns the buffer @ if successful, NULL otherwise. -frank. */ static char *sqlsubst(const char *orig_str, char * const query, size_t query_len, const char * const user, const char * const ip, const char * const port, const char * const peer_ip, const char * const decimal_ip) { char *query_pnt = query; const char *orig_str_scan = orig_str; const size_t user_len = (user == NULL ? (size_t) 0U : strlen(user)); const size_t ip_len = (ip == NULL ? (size_t) 0U : strlen(ip)); const size_t port_len = (port == NULL ? (size_t) 0U : strlen(port)); const size_t peer_ip_len = (peer_ip == NULL ? (size_t) 0U : strlen(peer_ip)); const size_t decimal_ip_len = (decimal_ip == NULL ? (size_t) 0U : strlen(decimal_ip)); while (*orig_str_scan != 0) { if (*orig_str_scan == '\\' && orig_str_scan[1] != 0) { orig_str_scan++; switch(tolower((unsigned char) *orig_str_scan)) { case 'l' : if (user_len >= query_len) { return NULL; } if (user_len <= (size_t) 0U) { goto nextone; } memcpy(query_pnt, user, user_len); query_pnt += user_len; query_len -= user_len; goto nextone; case 'i' : if (ip_len >= query_len) { return NULL; } if (ip_len <= (size_t) 0U) { goto nextone; } memcpy(query_pnt, ip, ip_len); query_pnt += ip_len; query_len -= ip_len; goto nextone; case 'p' : if (port_len >= query_len) { return NULL; } if (port_len <= (size_t) 0U) { goto nextone; } memcpy(query_pnt, port, port_len); query_pnt += port_len; query_len -= port_len; goto nextone; case 'r' : if (peer_ip_len >= query_len) { return NULL; } if (peer_ip_len <= (size_t) 0U) { goto nextone; } memcpy(query_pnt, peer_ip, peer_ip_len); query_pnt += peer_ip_len; query_len -= peer_ip_len; goto nextone; case 'd' : if (decimal_ip_len >= query_len) { return NULL; } if (decimal_ip_len <= (size_t) 0U) { goto nextone; } memcpy(query_pnt, decimal_ip, decimal_ip_len); query_pnt += decimal_ip_len; query_len -= decimal_ip_len; goto nextone; default : if (--query_len <= (size_t) 0U) { return NULL; } *query_pnt++ = '\\'; } } if (ISCTRLCODE(*orig_str_scan)) { goto nextone; } if (--query_len <= (size_t) 0U) { return NULL; } *query_pnt++ = *orig_str_scan; nextone: orig_str_scan++; } *query_pnt = 0; return query; } static size_t pw_pgsql_escape_conninfo_(char * const to, const char * const from, const size_t length) { const char *source = from; char *target = to; size_t remaining = length; while (remaining > (size_t) 0U) { switch (*source) { case 0: remaining = (size_t) 1U; break; case '\r': *target++ = '\\'; *target++ = 'r'; break; case '\n': *target++ = '\\'; *target++ = 'n'; break; case '\b': *target++ = '\\'; *target++ = 'b'; break; case '\'': *target++ = '\''; *target++ = '\''; break; case '\\': case '"': *target++ = '\\'; default: *target++ = *source; } source++; remaining--; } *target = 0; return (size_t) (target - to); } static char *pw_pgsql_escape_conninfo(const char *from) { size_t from_len; size_t to_len; char *to; size_t tolen; if (from == NULL) { return NULL; } from_len = strlen(from); to_len = from_len * 2U + (size_t) 1U; if ((to = malloc(to_len)) == NULL) { return NULL; } tolen = pw_pgsql_escape_conninfo_(to, from, from_len); if (tolen >= to_len) { for (;;) { *to++ = 0; } } to[tolen] = 0; return to; } static int pw_pgsql_connect(PGconn ** const id_sql_server) { char *conninfo = NULL; size_t sizeof_conninfo; char *escaped_server = NULL; char *escaped_db = NULL; char *escaped_user = NULL; char *escaped_pw = NULL; int ret = -1; *id_sql_server = NULL; if ((escaped_server = pw_pgsql_escape_conninfo(server)) == NULL || (escaped_db = pw_pgsql_escape_conninfo(db)) == NULL || (escaped_user = pw_pgsql_escape_conninfo(user)) == NULL || (escaped_pw = pw_pgsql_escape_conninfo(pw)) == NULL) { goto bye; } #define PGSQL_CONNECT_FMTSTRING \ "host='%s' port='%d' dbname='%s' user='%s' password='%s'" sizeof_conninfo = sizeof PGSQL_CONNECT_FMTSTRING + strlen(escaped_server) + (size_t) 5U + strlen(escaped_db) + strlen(escaped_user) + strlen(escaped_pw); if ((conninfo = malloc(sizeof_conninfo)) == NULL) { goto bye; } if (SNCHECK(snprintf(conninfo, sizeof_conninfo, PGSQL_CONNECT_FMTSTRING, server, port, db, user, pw), sizeof_conninfo)) { goto bye; } if ((*id_sql_server = PQconnectdb(conninfo)) == NULL || PQstatus(*id_sql_server) == CONNECTION_BAD) { if (server_down == 0) { server_down++; logfile(LOG_ERR, MSG_SQL_DOWN); } goto bye; } server_down = 0; ret = 0; bye: free(conninfo); free(escaped_server); free(escaped_db); free(escaped_user); free(escaped_pw); return ret; } static int pw_pgsql_simplequery(PGconn * const id_sql_server, const char * const query) { PGresult *result; if ((result = PQexec(id_sql_server, query)) == NULL) { return -1; } if (PQresultStatus(result) != PGRES_COMMAND_OK) { PQclear(result); return -1; } PQclear(result); return 0; } static char *pw_pgsql_getquery(PGconn * const id_sql_server, const char * const orig_query, const char * const account, const char * const ip, const char * const port, const char * const peer_ip, const char * const decimal_ip) { PGresult *qresult = NULL; size_t length; char *answer = NULL; char query[PGSQL_MAX_REQUEST_LENGTH]; if (orig_query == NULL || *orig_query == 0) { goto bye; } if (sqlsubst(orig_query, query, sizeof query, account, ip, port, peer_ip, decimal_ip) == NULL) { goto bye; } if ((qresult = PQexec(id_sql_server, query)) == NULL) { logfile(LOG_WARNING, MSG_SQL_WRONG_PARMS " : [%s]", query); goto bye; } if (PQresultStatus(qresult) != PGRES_TUPLES_OK || PQnfields(qresult) != 1 || PQntuples(qresult) != 1 || PQgetisnull(qresult, 0, 0)) { goto bye; } if ((length = (size_t) PQgetlength(qresult, 0, 0) + (size_t) 1U) <= (size_t) 1U || (answer = malloc(length)) == NULL) { goto bye; } strncpy(answer, PQgetvalue(qresult, 0, 0), length - (size_t) 1U); answer[length - (size_t) 1U] = 0; bye: if (qresult != NULL) { PQclear(qresult); } return answer; } void pw_pgsql_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer) { PGconn *id_sql_server = NULL; const char *spwd = NULL; /* stored password */ const char *uid = sql_default_uid; /* stored system login/uid */ const char *gid = sql_default_gid; /* stored system group/gid */ const char *dir = NULL; /* stored home directory */ #ifdef QUOTAS const char *sqta_fs = NULL; /* stored quota files */ const char *sqta_sz = NULL; /* stored quota size */ #endif #ifdef RATIOS const char *ratio_ul = NULL; /* stored ratio UL */ const char *ratio_dl = NULL; /* stored ratio DL */ #endif #ifdef THROTTLING const char *bandwidth_ul = NULL; /* stored bandwidth UL */ const char *bandwidth_dl = NULL; /* stored bandwidth DL */ #endif char *escaped_account = NULL; char *escaped_ip = NULL; char *escaped_port = NULL; char *escaped_peer_ip = NULL; char *escaped_decimal_ip = NULL; char *scrambled_password = NULL; int committed = 1; int crypto_argon2 = 0, crypto_scrypt = 0, crypto_crypt = 0, crypto_md5 = 0, crypto_sha1 = 0, crypto_plain = 0; unsigned long decimal_ip_num = 0UL; char decimal_ip[42]; char hbuf[NI_MAXHOST]; char pbuf[NI_MAXSERV]; char phbuf[NI_MAXHOST]; result->auth_ok = 0; if (pw_pgsql_validate_name(account) != 0) { goto bye; } if (getnameinfo((const struct sockaddr *) sa, STORAGE_LEN(*sa), hbuf, sizeof hbuf, pbuf, sizeof pbuf, NI_NUMERICHOST | NI_NUMERICSERV) != 0 || getnameinfo((const struct sockaddr *) peer, STORAGE_LEN(*peer), phbuf, sizeof phbuf, NULL, (size_t) 0U, NI_NUMERICHOST) != 0) { goto bye; } *decimal_ip = 0; if (STORAGE_FAMILY(*peer) == AF_INET) { const unsigned char *decimal_ip_raw = (const unsigned char *) &(STORAGE_SIN_ADDR(*peer)); decimal_ip_num = ((unsigned long) decimal_ip_raw[0] << 24) | ((unsigned long) decimal_ip_raw[1] << 16) | (decimal_ip_raw[2] << 8) | decimal_ip_raw[3]; if (SNCHECK(snprintf(decimal_ip, sizeof decimal_ip, "%lu", decimal_ip_num), sizeof decimal_ip)) { goto bye; } } if (pw_pgsql_connect(&id_sql_server) != 0) { goto bye; } if ((escaped_account = pw_pgsql_escape_string(id_sql_server, account)) == NULL) { goto bye; } if ((escaped_ip = pw_pgsql_escape_string(id_sql_server, hbuf)) == NULL) { goto bye; } if ((escaped_port = pw_pgsql_escape_string(id_sql_server, pbuf)) == NULL) { goto bye; } if ((escaped_peer_ip = pw_pgsql_escape_string(id_sql_server, phbuf)) == NULL) { goto bye; } if ((escaped_decimal_ip = pw_pgsql_escape_string(id_sql_server, decimal_ip)) == NULL) { goto bye; } if (pw_pgsql_simplequery(id_sql_server, PGSQL_TRANSACTION_START) == 0) { committed = 0; } if ((spwd = pw_pgsql_getquery(id_sql_server, sqlreq_getpw, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) == NULL) { goto bye; } if (uid == NULL) { uid = pw_pgsql_getquery(id_sql_server, sqlreq_getuid, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip); } if (uid == NULL) { goto bye; } if (gid == NULL) { gid = pw_pgsql_getquery(id_sql_server, sqlreq_getgid, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip); } if (gid == NULL) { goto bye; } if ((dir = pw_pgsql_getquery(id_sql_server, sqlreq_getdir, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) == NULL) { goto bye; } result->auth_ok--; /* -1 */ if (strcasecmp(crypto, PASSWD_SQL_ANY) == 0) { crypto_argon2++; crypto_scrypt++; crypto_crypt++; crypto_md5++; crypto_sha1++; } else if (strcasecmp(crypto, PASSWD_SQL_ARGON2) == 0) { crypto_argon2++; } else if (strcasecmp(crypto, PASSWD_SQL_SCRYPT) == 0) { crypto_scrypt++; } else if (strcasecmp(crypto, PASSWD_SQL_CRYPT) == 0) { crypto_crypt++; } else if (strcasecmp(crypto, PASSWD_SQL_MD5) == 0) { crypto_md5++; } else if (strcasecmp(crypto, PASSWD_SQL_SHA1) == 0) { crypto_sha1++; } else { /* default to plaintext */ crypto_plain++; } #ifdef crypto_pwhash_STRPREFIX if (crypto_argon2 != 0) { if (crypto_pwhash_str_verify(spwd, password, strlen(password)) == 0) { goto auth_ok; } } #endif #ifdef crypto_pwhash_scryptsalsa208sha256_STRPREFIX if (crypto_scrypt != 0) { if (crypto_pwhash_scryptsalsa208sha256_str_verify (spwd, password, strlen(password)) == 0) { goto auth_ok; } } #endif if (crypto_crypt != 0) { const char *crypted; if ((crypted = (const char *) crypt(password, spwd)) != NULL && pure_strcmp(crypted, spwd) == 0) { goto auth_ok; } } if (crypto_md5 != 0) { const char *crypted; if ((crypted = (const char *) crypto_hash_md5(password, 1)) != NULL && pure_strcmp(crypted, spwd) == 0) { goto auth_ok; } } if (crypto_sha1 != 0) { const char *crypted; if ((crypted = (const char *) crypto_hash_sha1(password, 1)) != NULL && pure_strcmp(crypted, spwd) == 0) { goto auth_ok; } } if (crypto_plain != 0) { if (*password != 0 && /* refuse null cleartext passwords */ pure_strcmp(password, spwd) == 0) { goto auth_ok; } } goto bye; auth_ok: /* * do *NOT* accept root uid/gid - if the database is compromized, the FTP * server could also be rooted. */ result->uid = (uid_t) strtoul(uid, NULL, 10); if (result->uid <= (uid_t) 0) { struct passwd *pw; if ((pw = getpwnam(uid)) == NULL || pw->pw_uid <= (uid_t) 0) { goto bye; } result->uid = pw->pw_uid; } result->gid = (gid_t) strtoul(gid, NULL, 10); if (result->gid <= (gid_t) 0) { struct group *gr; if ((gr = getgrnam(gid)) == NULL || gr->gr_gid <= (gid_t) 0) { goto bye; } result->gid = gr->gr_gid; } result->dir = dir; dir = NULL; #ifdef QUOTAS if ((sqta_fs = pw_pgsql_getquery(id_sql_server, sqlreq_getqta_fs, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned long long q = strtoull(sqta_fs, NULL, 10); if (q > 0ULL) { result->user_quota_files = q; result->quota_files_changed = 1; } } if ((sqta_sz = pw_pgsql_getquery(id_sql_server, sqlreq_getqta_sz, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned long long q = strtoull(sqta_sz, NULL, 10); if (q > 0ULL) { result->user_quota_size = q * (1024UL * 1024UL); result->quota_size_changed = 1; } } #endif #ifdef RATIOS if ((ratio_ul = pw_pgsql_getquery(id_sql_server, sqlreq_getratio_ul, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned int q = (unsigned int) strtoul(ratio_ul, NULL, 10); if (q > 0U) { result->ratio_upload = q; result->ratio_ul_changed = 1; } } if ((ratio_dl = pw_pgsql_getquery(id_sql_server, sqlreq_getratio_dl, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned int q = (unsigned int) strtoul(ratio_dl, NULL, 10); if (q > 0U) { result->ratio_download = q; result->ratio_dl_changed = 1; } } #endif #ifdef THROTTLING if ((bandwidth_ul = pw_pgsql_getquery(id_sql_server, sqlreq_getbandwidth_ul, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned long q = (unsigned long) strtoul(bandwidth_ul, NULL, 10); if (q > 0UL) { result->throttling_bandwidth_ul = q * 1024UL; result->throttling_ul_changed = 1; } } if ((bandwidth_dl = pw_pgsql_getquery(id_sql_server, sqlreq_getbandwidth_dl, escaped_account, escaped_ip, escaped_port, escaped_peer_ip, escaped_decimal_ip)) != NULL) { const unsigned long q = (unsigned long) strtoul(bandwidth_dl, NULL, 10); if (q > 0UL) { result->throttling_bandwidth_dl = q * 1024UL; result->throttling_dl_changed = 1; } } #endif result->slow_tilde_expansion = 1; result->auth_ok = -result->auth_ok; bye: if (committed == 0) { (void) pw_pgsql_simplequery(id_sql_server, PGSQL_TRANSACTION_END); } if (id_sql_server != NULL) { PQfinish(id_sql_server); } free((void *) spwd); if (uid != sql_default_uid) { free((void *) uid); } if (gid != sql_default_gid) { free((void *) gid); } free((void *) dir); free(scrambled_password); #ifdef QUOTAS free((void *) sqta_fs); free((void *) sqta_sz); #endif #ifdef RATIOS free((void *) ratio_ul); free((void *) ratio_dl); #endif #ifdef THROTTLING free((void *) bandwidth_ul); free((void *) bandwidth_dl); #endif free((void *) escaped_account); free((void *) escaped_ip); free((void *) escaped_port); free((void *) escaped_peer_ip); free((void *) escaped_decimal_ip); } void pw_pgsql_parse(const char * const file) { if (generic_parser(file, pgsql_config_keywords) != 0) { die(421, LOG_ERR, MSG_CONF_ERR ": " MSG_ILLEGAL_CONFIG_FILE_SQL ": %s" , file); } if (server == NULL ) { die(421, LOG_ERR, MSG_SQL_MISSING_SERVER); } if (port_s != NULL) { port = atoi(port_s); if (port <= 0 || port > 65535) { port = PGSQL_DEFAULT_PORT; } free(port_s); port_s = NULL; } } #define ZFREE(X) do { free(X); (X) = NULL; } while (0) void pw_pgsql_exit(void) { ZFREE(server); ZFREE(port_s); port = -1; ZFREE(user); ZFREE(pw); ZFREE(db); ZFREE(crypto); ZFREE(sqlreq_getpw); ZFREE(sqlreq_getuid); ZFREE(sql_default_uid); ZFREE(sqlreq_getgid); ZFREE(sql_default_gid); ZFREE(sqlreq_getdir); #ifdef QUOTAS ZFREE(sqlreq_getqta_fs); ZFREE(sqlreq_getqta_sz); #endif #ifdef RATIOS ZFREE(sqlreq_getratio_ul); ZFREE(sqlreq_getratio_dl); #endif #ifdef THROTTLING ZFREE(sqlreq_getbandwidth_ul); ZFREE(sqlreq_getbandwidth_dl); #endif } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/ftpd_p.h0000644000175000017500000002110613446174132015627 0ustar rackeracke#ifndef __FTPD_P_H__ #define __FTPD_P_H__ 1 #include "ftpd.h" #include "log_unix.h" #ifdef USE_PAM # include "log_pam.h" #endif #ifdef WITH_LDAP # include "log_ldap.h" #endif #ifdef WITH_MYSQL # include "log_mysql.h" #endif #ifdef WITH_PGSQL # include "log_pgsql.h" #endif #ifdef WITH_PUREDB # include "log_puredb.h" #endif #ifdef WITH_EXTAUTH # include "log_extauth.h" #endif #ifndef HAVE_GETOPT_LONG # include "bsd-getopt_long.h" #else # include #endif #ifdef HAVE_SYS_WAIT_H # include #endif #define DEFAULT_BACKLOG 42 #define DEFAULT_BACKLOG_DATA 8 #define NICE_VALUE 10 #define THROTTLING_UNIT 10000UL #define MAX_GROUPS 256 #define MAX_PASSWD_TRIES 5 /* Abort after 5 authentication failures */ #define PASSWD_FAILURE_DELAY (3UL*1000000UL) /* Delay after each failure */ #define MAX_DIRSCAN_TRIES 50 /* Abort after 50 chdir failures */ #define DIRSCAN_FAILURE_DELAY (100000UL) /* Delay after each chdir failure */ #define ASCII_CHUNKSIZE 65536U #define BANNER_MAXLINES 100 #define MAX_SERVER_REPLY_LEN (PATH_MAX + (size_t) 50U) #ifndef NO_STANDALONE static volatile sig_atomic_t stop_server; static const char *standalone_port = DEFAULT_FTP_PORT_S; static const char *standalone_ip; static volatile unsigned int nb_children; static volatile int listenfd = -1; static volatile int listenfd6 = -1; #endif struct reply { struct reply *next; char line[1]; }; static const char *GETOPT_OPTIONS = "0146" "Aa:bc:" #ifndef NO_STANDALONE "BC:" #endif "dDeEf:" #ifdef COOKIE "F:" #endif #ifndef NO_STANDALONE "g:" #endif "GhHiI:jk:Kl:L:Mm:N" #ifdef QUOTAS "n:" #endif #if defined(WITH_UPLOAD_SCRIPT) "o" #endif #ifdef WITH_ALTLOG "O:" #endif "p:P:" #ifdef RATIOS "q:Q:" #endif "rRs" #ifndef NO_STANDALONE "S:" #endif #ifdef THROTTLING "t:T:" #endif "u:U:V:wWxX" #ifdef WITH_OSX_BONJOUR "v:" #endif #ifdef PER_USER_LIMITS "y:" #endif #ifdef WITH_TLS "2:3:Y:J:" #endif "zZ"; #ifndef NO_GETOPT_LONG static struct option long_options[] = { { "notruncate", 0, NULL, '0' }, { "logpid", 0, NULL, '1' }, # ifdef WITH_TLS { "certfile", 1, NULL, '2' }, { "extcert", 1, NULL, '3' }, # endif { "ipv4only", 0, NULL, '4' }, { "ipv6only", 0, NULL, '6' }, { "chrooteveryone", 0, NULL, 'A' }, { "trustedgid", 1, NULL, 'a' }, { "brokenclientscompatibility", 0, NULL, 'b' }, # ifndef NO_STANDALONE { "daemonize", 0, NULL, 'B' }, { "maxclientsperip", 1, NULL, 'C' }, # endif { "maxclientsnumber", 1, NULL, 'c' }, { "verboselog", 0, NULL, 'd' }, { "displaydotfiles", 0, NULL, 'D' }, { "anonymousonly", 0, NULL, 'e' }, { "noanonymous", 0, NULL, 'E' }, { "syslogfacility", 1, NULL, 'f' }, # ifdef COOKIE { "fortunesfile", 1, NULL, 'F' }, # endif # ifndef NO_STANDALONE { "pidfile", 1, NULL, 'g' }, # endif { "norename", 0, NULL, 'G' }, { "help", 0, NULL, 'h' }, { "dontresolve", 0, NULL, 'H' }, { "maxidletime", 1, NULL, 'I' }, { "anonymouscantupload", 0, NULL, 'i' }, { "createhomedir", 0, NULL, 'j' }, { "keepallfiles", 0, NULL, 'K' }, { "maxdiskusagepct", 1, NULL, 'k' }, { "login", 1, NULL, 'l' }, { "limitrecursion", 1, NULL, 'L' }, { "anonymouscancreatedirs", 0, NULL, 'M' }, { "maxload", 1, NULL, 'm' }, { "natmode", 0, NULL, 'N' }, # ifdef QUOTAS { "quota", 1, NULL, 'n' }, # endif # if defined(WITH_UPLOAD_SCRIPT) { "uploadscript", 0, NULL, 'o' }, # endif # ifdef WITH_ALTLOG { "altlog", 1, NULL, 'O' }, # endif { "passiveportrange", 1, NULL, 'p' }, { "forcepassiveip", 1, NULL, 'P' }, # ifdef RATIOS { "anonymousratio", 1, NULL, 'q' }, { "userratio", 1, NULL, 'Q' }, # endif { "autorename", 0, NULL, 'r' }, { "nochmod", 0, NULL, 'R' }, { "antiwarez", 0, NULL, 's' }, # ifndef NO_STANDALONE { "bind", 1, NULL, 'S' }, # endif { "anonymousbandwidth", 1, NULL, 't' }, { "userbandwidth", 1, NULL, 'T' }, { "umask", 1, NULL, 'U' }, { "minuid", 1, NULL, 'u' }, { "trustedip", 1, NULL, 'V' }, #ifdef WITH_OSX_BONJOUR { "bonjour", 1, NULL, 'v' }, #endif { "allowuserfxp", 0, NULL, 'w' }, { "allowanonymousfxp", 0, NULL, 'W' }, { "prohibitdotfileswrite", 0, NULL, 'x' }, { "prohibitdotfilesread", 0, NULL, 'X' }, # ifdef PER_USER_LIMITS { "peruserlimits", 1, NULL, 'y' }, # endif # ifdef WITH_TLS { "tls", 1, NULL, 'Y' }, { "tlsciphersuite", 1, NULL, 'J' }, # endif { "allowdotfiles", 0, NULL, 'z' }, { "customerproof", 0, NULL, 'Z' }, { NULL, 0, NULL, 0 } }; #endif #ifdef WITH_ALTLOG static const AltLogPrefixes altlogprefixes[] = { { "clf", ALTLOG_CLF }, { "stats", ALTLOG_STATS }, { "w3c", ALTLOG_W3C }, { "xferlog", ALTLOG_XFERLOG }, { NULL, ALTLOG_NONE } }; # define ALTLOG_DELIMITER ':' # define ALTLOG_DEFAULT ALTLOG_CLF #endif #ifndef WITHOUT_PRIVSEP # define VERSION_PRIVSEP " [privsep]" #else # define VERSION_PRIVSEP "" #endif #ifdef WITH_TLS # define VERSION_TLS " [TLS]" #else # define VERSION_TLS "" #endif static sigset_t old_sigmask; #ifndef NO_PROCNAME_CHANGE # if defined(__linux__) && !defined(HAVE_SETPROCTITLE) static char **argv0; static size_t argv_lth; # endif #endif /* * An authentication handler has three functions: * - One - parse() - is called with an optional file name, that contains a * configuration file, or whatever is passed in the -l command-line switch * for this authentication. * - Another one, check() is called when the user has entered his password. * It should fill an AuthResult structure. * - The last one - exit() - is called when the session is closed, and * should free all internal allocated structures. */ typedef struct Authentication_ { const char * name; void (* parse)(const char * const file); void (* check)(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer); void (* exit)(void); } Authentication; static Authentication auth_list[] = { { "unix", pw_unix_parse, pw_unix_check, pw_unix_exit }, /* 0 */ #ifdef USE_PAM { "pam", pw_pam_parse, pw_pam_check, pw_pam_exit }, /* 1 */ #endif #ifdef WITH_MYSQL { "mysql", pw_mysql_parse, pw_mysql_check, pw_mysql_exit }, /* 2 */ #endif #ifdef WITH_PGSQL { "pgsql", pw_pgsql_parse, pw_pgsql_check, pw_pgsql_exit }, /* 3 */ #endif #ifdef WITH_LDAP { "ldap", pw_ldap_parse, pw_ldap_check, pw_ldap_exit }, /* 4 */ #endif #ifdef WITH_PUREDB { "puredb", pw_puredb_parse, pw_puredb_check, pw_puredb_exit }, /* 5 */ #endif #ifdef WITH_EXTAUTH { "extauth", pw_extauth_parse, pw_extauth_check, pw_extauth_exit }, /* 6 */ #endif { NULL, NULL, NULL, NULL } }; #ifdef USE_PAM # define DEFAULT_AUTHENTICATION (&auth_list[1]) /* pam */ #else # define DEFAULT_AUTHENTICATION (&auth_list[0]) /* unix */ #endif typedef struct Authentications_ { const Authentication *auth; char *conf_file; struct Authentications_ *next; } Authentications; static Authentications *first_authentications, *last_authentications; typedef struct DLHandler_ { int clientfd; void *tls_clientfd; int xferfd; int f; void *tls_fd; off_t file_size; size_t dlmap_size; off_t cur_pos; off_t chunk_size; off_t min_chunk_size; off_t default_chunk_size; off_t max_chunk_size; off_t dlmap_pos; off_t dlmap_fdpos; off_t total_downloaded; size_t sizeof_map; unsigned char *map; unsigned char *map_data; int ascii_mode; double min_sleep; double max_sleep; unsigned long bandwidth; struct pollfd pfds_f_in; } DLHandler; typedef struct ULHandler_ { unsigned char *buf; size_t sizeof_buf; int clientfd; void *tls_clientfd; int xferfd; void *tls_fd; int f; off_t cur_pos; off_t chunk_size; off_t min_chunk_size; off_t default_chunk_size; off_t max_chunk_size; off_t total_uploaded; int ascii_mode; double min_sleep; double max_sleep; unsigned long bandwidth; off_t max_filesize; unsigned long idletime; struct pollfd pfds[2]; struct pollfd pfds_command; } ULHandler; #define PFD_DATA 0 #define PFD_COMMANDS 1 #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined (__CYGWIN__) static struct passwd *fakegetpwnam(const char * const name); # define getpwnam(A) fakegetpwnam(A) # define getpwuid(A) fakegetpwnam(NULL) #endif #define NON_ROOT_ANON_DIR "/ftp" #ifdef PROBE_RANDOM_AT_RUNTIME static const char *random_device; #endif static struct reply *firstreply; static struct reply *lastreply; #endif pure-ftpd-1.0.49.orig/src/log_pam.c0000644000175000017500000001331113450665410015762 0ustar rackeracke/* * Changed qmail-pop3 to pure-ftpd ... * * Program: Pluggable Authentication Modules login services * * Author: Michael K. Johnson * Red Hat Software * Internet: johnsonm@redhat.com * * * This majority of this code was lifted from the src.rpm for imap * in the RedHat-4.2 updates directory * by Kelley Lingerfelt redhat@cococo.net */ #include #ifdef USE_PAM # include "ftpd.h" # include "log_pam.h" # ifdef HAVE_SECURITY_PAM_MISC_H # include # endif # ifdef HAVE_SECURITY_PAM_APPL_H # include # endif # ifdef HAVE_SECURITY_PAM_MODULES_H # include # endif # ifdef HAVE_SECURITY_PAM_FILTER_H # include # endif # ifdef HAVE_PAM_PAM_MISC_H # include # endif # ifdef HAVE_PAM_PAM_APPL_H # include # endif # ifdef HAVE_PAM_PAM_MODULES_H # include # endif # ifdef HAVE_PAM_PAM_FILTER_H # include # endif # ifdef WITH_DMALLOC # include # endif #ifndef FTPD_PAM_SERVICE_NAME # define FTPD_PAM_SERVICE_NAME "pure-ftpd" #endif /* Static variables used to communicate between the conversation function * and the server_login function */ static const char *PAM_username; static const char *PAM_password; static int PAM_error; /* for compatibility with older pam stuff, before the stupid transposition */ #ifndef PAM_CRED_ESTABLISH # define PAM_CRED_ESTABLISH 0x0002U #endif /* PAM conversation function * Here we assume (for now, at least) that echo on means login name, and * echo off means password. */ #define GET_MEM \ size += sizeof(struct pam_response); \ if ((reply = realloc(reply, size)) == NULL) { \ PAM_error = 1; \ return PAM_CONV_ERR; \ } static int PAM_conv(int num_msg, const struct pam_message **msg, struct pam_response **resp, void *appdata_ptr) { int count = 0; unsigned int replies = 0U; struct pam_response *reply = NULL; size_t size = (size_t) 0U; (void) appdata_ptr; *resp = NULL; for (count = 0; count < num_msg; count++) { switch (msg[count]->msg_style) { case PAM_PROMPT_ECHO_ON: GET_MEM; memset(&reply[replies], 0, sizeof reply[replies]); if ((reply[replies].resp = strdup(PAM_username)) == NULL) { #ifdef PAM_BUF_ERR reply[replies].resp_retcode = PAM_BUF_ERR; #endif PAM_error = 1; return PAM_CONV_ERR; } reply[replies++].resp_retcode = PAM_SUCCESS; /* PAM frees resp */ break; case PAM_PROMPT_ECHO_OFF: GET_MEM; memset(&reply[replies], 0, sizeof reply[replies]); if ((reply[replies].resp = strdup(PAM_password)) == NULL) { #ifdef PAM_BUF_ERR reply[replies].resp_retcode = PAM_BUF_ERR; #endif PAM_error = 1; return PAM_CONV_ERR; } reply[replies++].resp_retcode = PAM_SUCCESS; /* PAM frees resp */ break; case PAM_TEXT_INFO: /* ignore it... */ break; case PAM_ERROR_MSG: default: /* Must be an error of some sort... */ free(reply); PAM_error = 1; return PAM_CONV_ERR; } } *resp = reply; return PAM_SUCCESS; } /* Solaris throws warning about incompatible pointer types, it does not include const on pam_message */ static struct pam_conv PAM_conversation = { &PAM_conv, NULL }; #define PAM_BAIL \ if (PAM_error != 0 || pam_error != PAM_SUCCESS) { \ goto bye; \ } /* Pure-FTPd authentication module */ void pw_pam_check(AuthResult * const result, const char *user, const char *pass, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer) { pam_handle_t *pamh; int pam_error; struct passwd pw, *pw_; char *dir = NULL; (void) sa; (void) peer; result->auth_ok = 0; PAM_password = pass; PAM_username = user; pam_error = pam_start(FTPD_PAM_SERVICE_NAME, user, &PAM_conversation, &pamh); PAM_BAIL; # ifdef PAM_TTY (void) pam_set_item(pamh, PAM_TTY, "pure-ftpd"); # endif # ifdef PAM_RUSER (void) pam_set_item(pamh, PAM_RUSER, user); # endif /* * PAM doesn't make any distinction between "user not found" and * "bad password". So we assume user not found to fallback to other * authentication mechanisms. This is the most logical behavior. */ pam_error = pam_authenticate(pamh, 0); PAM_BAIL; pam_error = pam_acct_mgmt(pamh, 0); PAM_BAIL; /* If this point is reached, the user has been authenticated. */ if ((pw_ = getpwnam(user)) == NULL) { goto bye; } pw = *pw_; if ((dir = strdup(pw.pw_dir)) == NULL) { goto bye; } result->auth_ok--; /* -1 */ # ifdef HAVE_INITGROUPS (void) initgroups(pw.pw_name, pw.pw_gid); # endif pam_error = pam_setcred(pamh, PAM_CRED_ESTABLISH); PAM_BAIL; /* * Handle session entries. PAM is instructed to shut up for now. * 20010530 */ #ifndef WITHOUT_PAM_SESSION (void) pam_open_session(pamh, PAM_SILENT); (void) pam_close_session(pamh, PAM_SILENT); /* It doesn't matter if it fails */ #endif result->dir = dir; dir = NULL; result->uid = pw.pw_uid; result->gid = pw.pw_gid; result->slow_tilde_expansion = 0; result->auth_ok = -result->auth_ok; /* 1 */ bye: (void) pam_end(pamh, result->auth_ok == 0 ? 0 : PAM_SUCCESS); } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/Makefile.am0000644000175000017500000001024313446174132016236 0ustar rackerackenoinst_LIBRARIES = libpureftpd.a sbin_PROGRAMS = \ pure-authd \ pure-certd \ pure-ftpd \ pure-ftpwho \ pure-mrtginfo \ pure-quotacheck \ pure-uploadscript bin_PROGRAMS = \ pure-statsdecode \ pure-pw \ pure-pwconvert noinst_PROGRAMS = \ ptracetest libpureftpd_a_CFLAGS = -DINCLUDE_IO_WRAPPERS=1 libpureftpd_a_DEPENDS = \ ../puredb/src/libpuredb_read.a libpureftpd_a_SOURCES = \ altlog.c \ altlog.h \ alt_arc4random.c \ alt_arc4random.h \ bonjour.h \ bonjour.c \ bsd-glob.c \ bsd-glob.h \ bsd-realpath.h \ bsd-realpath.c \ bsd-getopt_long.c \ bsd-getopt_long.h \ caps.c \ caps_p.h \ caps.h \ crypto.c \ crypto.h \ crypto-md5.c \ crypto-md5.h \ crypto-sha1.c \ crypto-sha1.h \ daemons.c \ diraliases.h \ diraliases.c \ dynamic.c \ dynamic.h \ fakesnprintf.h \ fakesnprintf.c \ fakechroot.h \ fakechroot.c \ ftp_parser.c \ ftpd.c \ ftpd_p.h \ ftpd.h \ ftpwho-update.c \ ftpwho-update.h \ ftpwho-update_p.h \ ftpwho-read.h \ ftpwho-read.c \ getloadavg.h \ getloadavg.c \ globals.h \ ipstack.c \ ipstack.h \ log_unix.c \ log_unix.h \ log_mysql.c \ log_mysql.h \ log_mysql_p.h \ log_pgsql.c \ log_pgsql.h \ log_pgsql_p.h \ log_pam.c \ log_pam.h \ log_ldap.c \ log_ldap.h \ log_ldap_p.h \ log_puredb.c \ log_puredb.h \ log_extauth.c \ log_extauth.h \ log_extauth_p.h \ ls.c \ ls_p.h \ messages.h \ messages_cs_cz.h \ messages_da.h \ messages_de.h \ messages_en.h \ messages_es.h \ messages_fr.h \ messages_fr_funny.h \ messages_hu.h \ messages_it.h \ messages_kr.h \ messages_nl.h \ messages_pl.h \ messages_pt_br.h \ messages_ro.h \ messages_sk.h \ messages_sq.h \ messages_sv.h \ messages_no.h \ messages_ru.h \ messages_tr.h \ messages_zh_cn.h \ messages_zh_tw.h \ mysnprintf.c \ mysnprintf.h \ parser.c \ parser_p.h \ parser.h \ privsep.h \ privsep_p.h \ privsep.c \ quotas.h \ quotas.c \ safe_rw.h \ safe_rw.c \ simpleconf.h \ simpleconf_ftpd.h \ simpleconf.c \ syslognames.h \ tls.h \ tls_extcert.h \ tls_extcert_p.h \ tls_extcert.c \ tls.c \ upload-pipe.c \ upload-pipe.h \ utils.c \ utils.h pure_ftpd_DEPENDS = \ libpureftpd.a \ ../puredb/src/libpuredb_read.a pure_ftpd_LDADD = \ libpureftpd.a \ ../puredb/src/libpuredb_read.a \ @LDAP_SSL_LIBS@ @GETLOADAVG_LIBS@ @BONJOUR_LDADD@ pure_ftpd_SOURCES = \ main.c pure_mrtginfo_CFLAGS = -DIN_PURE_MRTGINFO=1 pure_mrtginfo_SOURCES = \ daemons.c \ fakesnprintf.h \ fakesnprintf.c \ messages.h \ pure-mrtginfo.c \ mysnprintf.c \ mysnprintf.h pure_ftpwho_SOURCES = \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ ftpwho-update.h \ ipstack.c \ ipstack.h \ mysnprintf.c \ mysnprintf.h \ pure-ftpwho.c \ syslognames.h pure_uploadscript_SOURCES = \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ ftpwho-update.h \ mysnprintf.c \ mysnprintf.h \ pure-uploadscript.c \ pure-uploadscript_p.h \ safe_rw.c \ safe_rw.h \ syslognames.h pure_statsdecode_SOURCES = \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-statsdecode.c pure_quotacheck_SOURCES = \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-quotacheck.c \ safe_rw.c \ safe_rw.h pure_pw_DEPENDS = \ ../puredb/src/libpuredb_write.a pure_pw_LDADD = \ ../puredb/src/libpuredb_write.a pure_pw_SOURCES = \ alt_arc4random.c \ alt_arc4random.h \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-pw.c \ pure-pw.h \ safe_rw.c \ safe_rw.h \ utils.c \ utils.h pure_pwconvert_SOURCES = \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-pwconvert.c pure_authd_SOURCES = \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-authd.c \ pure-authd_p.h \ safe_rw.c \ safe_rw.h pure_certd_SOURCES = \ bsd-getopt_long.c \ bsd-getopt_long.h \ fakesnprintf.h \ fakesnprintf.c \ ftpd.h \ mysnprintf.c \ mysnprintf.h \ pure-certd.c \ pure-certd_p.h \ safe_rw.c \ safe_rw.h ptracetest_SOURCES = \ ptracetest.c pure-ftpd-1.0.49.orig/src/log_pgsql_p.h0000644000175000017500000000302013350542502016646 0ustar rackeracke#ifndef __LOG_PGSQL_P_H__ #define __LOG_PGSQL_P_H__ 1 #include static char *server; static char *port_s; static int port; static char *user; static char *pw; static char *db; static char *crypto; static char *sqlreq_getpw; static char *sqlreq_getuid; static char *sqlreq_getgid; static char *sqlreq_getdir; static char *sql_default_uid; static char *sql_default_gid; #ifdef QUOTAS static char *sqlreq_getqta_sz; static char *sqlreq_getqta_fs; #endif #ifdef RATIOS static char *sqlreq_getratio_ul; static char *sqlreq_getratio_dl; #endif #ifdef THROTTLING static char *sqlreq_getbandwidth_ul; static char *sqlreq_getbandwidth_dl; #endif static signed char server_down; static ConfigKeywords pgsql_config_keywords[] = { { "PGSQLServer", &server }, { "PGSQLPort", &port_s }, { "PGSQLUser", &user }, { "PGSQLPassword", &pw }, { "PGSQLDatabase", &db }, { "PGSQLCrypt", &crypto }, { "PGSQLGetPW", &sqlreq_getpw }, { "PGSQLGetUID", &sqlreq_getuid }, { "PGSQLDefaultUID", &sql_default_uid }, { "PGSQLGetGID", &sqlreq_getgid }, { "PGSQLDefaultGID", &sql_default_gid }, { "PGSQLGetDir", &sqlreq_getdir }, #ifdef QUOTAS { "PGSQLGetQTAFS", &sqlreq_getqta_fs }, { "PGSQLGetQTASZ", &sqlreq_getqta_sz }, #endif #ifdef RATIOS { "PGSQLGetRatioUL", &sqlreq_getratio_ul }, { "PGSQLGetRatioDL", &sqlreq_getratio_dl }, #endif #ifdef THROTTLING { "PGSQLGetBandwidthUL", &sqlreq_getbandwidth_ul }, { "PGSQLGetBandwidthDL", &sqlreq_getbandwidth_dl }, #endif { NULL, NULL } }; #endif pure-ftpd-1.0.49.orig/src/privsep.h0000644000175000017500000000047313350542502016041 0ustar rackeracke#ifndef __PRIVSEP_H__ #define __PRIVSEP_H__ 1 #ifndef WITHOUT_PRIVSEP int privsep_sendfd(const int psfd, const int fd); int privsep_recvfd(const int psfd); int privsep_init(void); int privsep_removeftpwhoentry(void); int privsep_bindresport(const int protocol, const struct sockaddr_storage ss); #endif #endif pure-ftpd-1.0.49.orig/src/crypto.h0000644000175000017500000000071713446174132015700 0ustar rackeracke#ifndef __CRYPTO_H__ #define __CRYPTO_H__ 1 #include #include char *crypto_hash_sha1(const char *string, const int hex); char *crypto_hash_ssha1(const char *string, const char *stored); char *crypto_hash_md5(const char *string, const int hex); char *crypto_hash_smd5(const char *string, const char *stored); char *hexify(char * const result, const unsigned char *digest, const size_t size_result, size_t size_digest); #endif pure-ftpd-1.0.49.orig/src/quotas.h0000644000175000017500000000062213350542502015661 0ustar rackeracke#ifndef __QUOTAS_H__ #define __QUOTAS_H__ 1 #ifndef QUOTA_FILE # define QUOTA_FILE ".ftpquota" #endif typedef struct Quota_ { unsigned long long files; unsigned long long size; } Quota; int quota_update(Quota *quota, const long long files_add, const long long size_add, int *overflow); void displayquota(Quota * const quota_); int hasquota(void); #endif pure-ftpd-1.0.49.orig/src/tls_extcert.h0000644000175000017500000000155713446174132016723 0ustar rackeracke#ifndef __TLS_EXTCERT_H__ #define __TLS_EXTCERT_H__ 1 #ifdef WITH_TLS typedef enum CertAction { CERT_ACTION_DENY, /* -- */ CERT_ACTION_DEFAULT, CERT_ACTION_FALLBACK, CERT_ACTION_STRICT } CertAction; typedef struct CertResult { char *cert_file; char *key_file; CertAction action; int cert_ok; } CertResult; void tls_extcert_parse(const char * const file); void tls_extcert_get(CertResult * const result, const char *sni_name); void tls_extcert_exit(void); #define EXTCERT_KEYWORD_SEP ":" #define EXTCERT_CLIENT_SNI_NAME "sni_name" EXTCERT_KEYWORD_SEP #define EXTCERT_CLIENT_END "end" #define EXTCERT_REPLY_ACTION "action" EXTCERT_KEYWORD_SEP #define EXTCERT_REPLY_CERT_FILE "cert_file" EXTCERT_KEYWORD_SEP #define EXTCERT_REPLY_KEY_FILE "key_file" EXTCERT_KEYWORD_SEP #define EXTCERT_REPLY_END "end" #endif #endif pure-ftpd-1.0.49.orig/src/messages_tr.h0000644000175000017500000003304013446174132016667 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Invalid TLSCipherSuite specified '%s'" #define MSG_TIMEOUT "Zaman Aţýmý" #define MSG_CAPABILITIES "Anahtar destekleri yapýlamýyor" #define MSG_CLIENT_CLOSED_CNX "Kullanýcý bađlantýyý kapattý" #define MSG_CLIENT_READ_ERR "Kullanýcýdan okuma hatasý" #define MSG_CANT_OPEN_CNX "Bađlantý açýlamýyor" #define MSG_CANT_CREATE_DATA_SOCKET "Data kapýsý oluţturulamadý" #define MSG_DEBUG_CLIENT_IS "Kullanýcý IP adresi" #define MSG_SYNTAX_ERROR_IP "IP adresinde sýralama hatasý" #define MSG_PORT_SUCCESSFUL "PORT komutu gerçekleţti" #define MSG_ONLY_IPV4V6 "Sadece IPv4 ve IPv6 desteklenmektedir (1,2)" #define MSG_ONLY_IPV4 "Sadece IPv4 desteklenmektedir (1)" #define MSG_TIMEOUT_PARSER "Zaman Aţýmý - bi sonraki sefere daha hýzlý yazýp deneyiniz" #define MSG_LINE_TOO_LONG "Satýr çok uzun" #define MSG_LOG_OVERFLOW "Kullanýcý güvenli komut satýrý taţmasýna sebep oldu" #define MSG_GOODBYE "Hoţçakalýn. Güncellemeleriniz %llu ve indirdikleriniz %llu kbytes." #define MSG_DEBUG_COMMAND "Komut" #define MSG_IS_YOUR_CURRENT_LOCATION "ţuanki yeriniz" #define MSG_NOT_LOGGED_IN "Giriţ yapamadýnýz" #define MSG_AUTH_UNIMPLEMENTED "Güvenlik eklentileri tamamlanamadý" #define MSG_NO_FILE_NAME "Dosya adý yok" #define MSG_NO_DIRECTORY_NAME "Klasör adý yok" #define MSG_NO_RESTART_POINT "Yeniden baţlatma noktasý yok" #define MSG_ABOR_SUCCESS "ABOR dan önce gördükleriniz baţarý ile tamamlandý" #define MSG_MISSING_ARG "Eksik girdi" #define MSG_GARBAGE_FOUND "Deđerden sonra gereksizlik bulundu" #define MSG_VALUE_TOO_LARGE "Deđer çok uzun" #define MSG_IDLE_TIME "Haraketsiz bekleme süresi %lu saniye" #define MSG_SITE_HELP "Belirtilen SITE komutu onaylandý" #define MSG_BAD_CHMOD "Yanlýţ eriţim" #define MSG_UNKNOWN_EXTENSION "bilinmeyen uzantý" #define MSG_XDBG_OK "XDBG komutu baţarýlý, yeni debug düzeyi %d" #define MSG_UNKNOWN_COMMAND "Bilinmeyen komut" #define MSG_TIMEOUT_NOOP "Zaman Aţýmý (%lu saniyedir hareket olmadý)" #define MSG_TIMEOUT_DATA "Zaman Aţýmý (%lu saniyedir yeni data yok)" #define MSG_SLEEPING "Zzz..." #define MSG_ALREADY_LOGGED "Zaten giriţ yaptýnýz" #define MSG_ANY_PASSWORD "Ţifre yok" #define MSG_ANONYMOUS_LOGGED "Misafir kullanýcý giriţ yaptý" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Sanal FTP olarak misafir kullanýcý giriţ yaptý" #define MSG_USER_OK "Kullanýcý %s OK. Ţifreyi giriniz" #define MSG_CANT_DO_TWICE "Bu oturumda yapýlamýyor" #define MSG_UNABLE_SECURE_ANON "Güvenli Misafir FTP ayarlanmadý" #define MSG_BANDWIDTH_RESTRICTED "Trafik kullanýmýnýz sýnýrlý" #define MSG_NO_PASSWORD_NEEDED "Ţifre yok" #define MSG_NOTRUST "Üzgünüz, güven sađlayamadýnýz" #define MSG_WHOAREYOU "Lütfen kim olduđunuzu soyleyiniz." #define MSG_AUTH_FAILED "Yetkiniz hatalý, üzgünüz" #define MSG_AUTH_TOOMANY "Çok fazla yetki isteđi hatasý" #define MSG_NO_HOMEDIR "Ana klasörünüz bulunamadý - çýkýlýyor" #define MSG_NO_HOMEDIR2 "%s bulunamadý veya okunamýyor" #define MSG_START_SLASH "Baţlangýç /" #define MSG_USER_GROUP_ACCESS "Kullanýcý %s grup eriţim sađladý" #define MSG_FXP_SUPPORT "Bu sunucu FXP transferini desteklemektedir" #define MSG_RATIO "Bakým oraný %u:%u (GÜN/ÝND)" #define MSG_CHROOT_FAILED "Güvenli chroot() ayarlanamadý" #define MSG_CURRENT_DIR_IS "OK. Ţuanki klasör %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Ţuanki sýnýrlý klasör %s" #define MSG_IS_NOW_LOGGED_IN "%s giriţ yaptý" #define MSG_CANT_CHANGE_DIR "Klasör deđiţtirilemedi %s" #define MSG_PATH_TOO_LONG "Yol çok uzun" #define MSG_CANT_PASV "PASV komutunu IPv6 bađlantýsýnda kullanamazsýnýz.Yerine EPSV kullanýnýz." #define MSG_CANT_PASSIVE "Pasif bađlantý açýlamýyor" #define MSG_PORTS_BUSY "Tüm ayrýlmýţ TCP kapýlarý meţgul" #define MSG_GETSOCKNAME_DATA "Lokal data giriţi tanýnamadý" #define MSG_GETPEERNAME "Lokal giriţ tanýnamadý" #define MSG_INVALID_IP "Üzgünüz, yanlýţ adres belirlenmiţ" #define MSG_NO_EPSV "Lütfen EPSV destekli bir IPv6-conformant kullanýcý kullanýnýz" #define MSG_BAD_PORT "Üzgünüz, 1024 den küçük portlarla bađalanamayýz " #define MSG_NO_FXP "%s bađlantýsý açýlamýyor(sadece %s)" #define MSG_FXP "FXP transfer: %s den %s 'ye" #define MSG_NO_DATA_CONN "Data bađlantýsý yok" #define MSG_ACCEPT_FAILED "Bađlantý kabul edilmedi" #define MSG_ACCEPT_SUCCESS "Data bađlantý kabul edildi" #define MSG_CNX_PORT_FAILED "%d kapýsýndan data bađlantýsý açýlamýyor" #define MSG_CNX_PORT "%d bađlantýsýndan bađlanýyor" #define MSG_ANON_CANT_MKD "Üzgünüz, misafir kullanýcýsýnýn klasör oluţturma yetkisi yok" #define MSG_ANON_CANT_RMD "Üzgünüz, misafir kullanýcýsýnýn klasör silme yetkisi yok" #define MSG_ANON_CANT_RENAME "Misafir kullanýcýsýnýn dosya taţýma/isim deđiţtirme yetkisi yok" #define MSG_ANON_CANT_CHANGE_PERMS "Misafir kullanýcýsýnýn izinleri deđiţtirme yetkisi yok" #define MSG_GLOB_NO_MEMORY "%s esnasýnda bellek taţmasý oluţtu" #define MSG_PROBABLY_DENIED "(Bu yöntem muhtelemen \"Ýzin engellendi\")" #define MSG_GLOB_READ_ERROR "%s esnasýnda okuma hatasý" #define MSG_GLOB_NO_MATCH "%s içinde %s bulunamadý" #define MSG_CHMOD_FAILED "%s için izinler deđiţtirilemedi" #define MSG_CHMOD_SUCCESS "%s için izinler deđiţtirildi" #define MSG_CHMOD_TOTAL_FAILURE "Üzgünüz, izinler deđiţtirilemedi" #define MSG_ANON_CANT_DELETE "Misafir kullanýcý dosyalarý silimez" #define MSG_ANON_CANT_OVERWRITE "Misafir kullanýcý varolan dosya üzerine yazamaz" #define MSG_DELE_FAILED "%s silinemiyor" #define MSG_DELE_SUCCESS "%s%s%s%s silindi" #define MSG_DELE_TOTAL_FAILURE "Silinen dosya yok" #define MSG_LOAD_TOO_HIGH \ "Bađlantýnýzdan sonra yük %3.2f . Aţýrý yüklenme esnasýnda misafir Ýndirmelere izin veremiyoruz.\n" \ "Bu durmda sadece gönderim izinlidir.\n" #define MSG_OPEN_FAILURE "%s açýlmadý" #define MSG_OPEN_FAILURE2 "Dosya açýlamadý" #define MSG_STAT_FAILURE "Dosya boyutu bulunamadý" #define MSG_STAT_FAILURE2 "Dosya oluţturma kontrol edilemedi" #define MSG_REST_TOO_LARGE_FOR_FILE "%lld için yeniden baţlayýn %lld den dosya büyüklülüđü çok büyük ." #define MSG_REST_RESET "Yeniden baţlayýn yenileme 0" #define MSG_NOT_REGULAR_FILE "Sadece düzgün dosyalar geri alabiliriz" #define MSG_NOT_MODERATED \ "Bu dosya misafir kullanýcý tarafýndan yüklendi. Sistem Yöneticisi\n" \ "bunun inidirilmesi için henüz onay vermedi" #define MSG_RATIO_DENIAL \ "Üzgünüz, gönderme/indirme oraný %u:%u .\n" \ "Ţuanki göndermeniz %llu Kb ve indirmeniz %llu Kb.\n" \ "Lütfen daha sonra tekrar deneyiniz." #define MSG_NO_MORE_TO_DOWNLOAD "Ýndirme kalmadý" #define MSG_WINNER "Bilgisayar arkadaţýnýz. Bilgisayara güvenin." #define MSG_KBYTES_LEFT "%.1f kbytes indirme" #define MSG_ABORTED "Transferden vazgeçildi" #define MSG_DATA_WRITE_FAILED "Data bađlantýsýnda yazma sýrasýnda hata" #define MSG_DATA_READ_FAILED "Data bađlantýsýnda okuma sýrasýnda hata" #define MSG_MMAP_FAILED "Dosyadanýn hafýzadaki yeri açýlamadý" #define MSG_WRITE_FAILED "Dosyaya yazma sýrasýnda hata" #define MSG_TRANSFER_RATE_M "%.3f saniye (burdaki ölçü), saniyede %.2f Mbytes " #define MSG_TRANSFER_RATE_K "%.3f saniye (burdaki ölçü), saniyede %.2f Kbytes " #define MSG_TRANSFER_RATE_B "%.3f saniye (burdaki ölçü), saniyede %.2f bytes " #define MSG_SPACE_FREE_M "Boţ disk alaný %.1f Mbytes " #define MSG_SPACE_FREE_K "Boţ disk alaný %f Kbytes " #define MSG_DOWNLOADED "indirildi" #define MSG_REST_NOT_NUMERIC "REST de rakamsal paremetre gerekli" #define MSG_REST_ASCII_STRICT "Ýţareti ASCII modda 0 ile cevaplayýnýz " #define MSG_REST_ASCII_WORKAROUND "%lld Yeniden baţlatýlýyor. ASCII mod içinde" #define MSG_REST_SUCCESS "%lld yeniden baţlatýlýyor" #define MSG_SANITY_DIRECTORY_FAILURE "Yasak klasör adý" #define MSG_SANITY_FILE_FAILURE "Yasak dosya adý: %s" #define MSG_MKD_FAILURE "Klasör oluţturalamadý" #define MSG_MKD_SUCCESS "Klasör baţarýyla oluţturuldu" #define MSG_RMD_FAILURE "Klasör kaldýrýlamadý" #define MSG_RMD_SUCCESS "Klasör baţarýyla kaldýrýldý" #define MSG_TIMESTAMP_FAILURE "Zaman biçimi alýnamadý" #define MSG_MODE_ERROR "Sadece ASCII ve binary mod desteklenmektedir" #define MSG_CREATE_FAILURE "Dosya oluţturulamadý" #define MSG_ABRT_ONLY "ABRT sadece güncelleme süresinde kullanýlýr" #define MSG_UPLOAD_PARTIAL "kýsmen güncelendi" #define MSG_REMOVED "kaldýrýldý" #define MSG_UPLOADED "güncellendi" #define MSG_GMTIME_FAILURE "Lokal zaman alýnamadý" #define MSG_TYPE_8BIT_FAILURE "Sadece 8-bit bytelar desteklenir, 10 yaţýnda deđilim ki." #define MSG_TYPE_UNKNOWN "Bilinmeyen TYPE" #define MSG_TYPE_SUCCESS "TYPE ţuan" #define MSG_STRU_FAILURE "Sadece D(osya) desteklenmektedir" #define MSG_MODE_FAILURE "Lütfen S(tream) mod kullanýn" #define MSG_RENAME_ABORT "Önceki isim deđiţtirmeden vazgeçiliyor" #define MSG_RENAME_RNFR_SUCCESS "RNFR kabul edildi - belirtilen yerde dosya var, " #define MSG_FILE_DOESNT_EXIST "Üzgünüz, dosya bulunamadý" #define MSG_RENAME_ALREADY_THERE "RENAME Hatalý - belirtilen dosya adý zaten var" #define MSG_RENAME_NORNFR "RNTO önce RNFR gerekli" #define MSG_RENAME_FAILURE "Ýsim Deđiţtirme/Taţýma hatalý" #define MSG_RENAME_SUCCESS "Dosya ismi deđiţtirme/taţýma baţarýlý" #define MSG_NO_SUPERSERVER "Lütfen pure-ftpd yi super-server ile çalýţtýrýnýz (tcpserver gerekli)" #define MSG_NO_FTP_ACCOUNT "'ftp' hesabý bulunamadý" #define MSG_CONF_ERR "Konfigürasyon hatasý" #define MSG_NO_VIRTUAL_FILE "Sanal kullanýcý dosyasý eksik" #define MSG_ILLEGAL_THROTTLING "Azaltma için geçersiz deđer" #define MSG_ILLEGAL_TRUSTED_GID "chroot için geçersiz gid" #define MSG_ILLEGAL_USER_LIMIT "Geçersiz kullanýcý limiti" #define MSG_ILLEGAL_FACILITY "Bilinmeyen olanak adý" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "Bilinmeyen LDAP konfigürasyon dosyasý" #define MSG_ILLEGAL_LOAD_LIMIT "Geçersiz yükleme limiti" #define MSG_ILLEGAL_PORTS_RANGE "Geçersiz kapý sýrasý" #define MSG_ILLEGAL_LS_LIMITS "Geçersiz 'ls' limiti" #define MSG_ILLEGAL_FORCE_PASSIVE "Pasif bađlantý için geçersiz zorunlu IP " #define MSG_ILLEGAL_RATIO "Geçersiz güncelleme/indirme oraný" #define MSG_ILLEGAL_UID_LIMIT "Geçersiz uid limiti" #define MSG_ILLEGAL_OPTION "Bilinmeyen gerçek zamanlý seçim" #define MSG_LDAP_MISSING_BASE "LDAP konfigürasyon dosyasýnda LDAPBaseDN eksik" #define MSG_LDAP_WRONG_PARMS "Yanlýţ LDAP parametresi" #define MSG_NEW_CONNECTION "%s den yeni bađlantý" #define MSG_WELCOME_TO "Hoţgeldiniz" #define MSG_MAX_USERS "%lu kullanýcý (maksimum) zaten giriţ yaptý, üzgünüz" #define MSG_NB_USERS "Kullanýcý numaranýz %u den %u kabul edildi." #define MSG_WELCOME_TIME "Lokal zaman ţuan %02d:%02d. Sunucu kapýsý: %u." #define MSG_ANONYMOUS_FTP_ONLY "Sadece Misafir FTP kabul edilir" #define MSG_RATIOS_EVERYONE "HERKES ÝÇÝN ORAN AÇIK:" #define MSG_RATIOS_ANONYMOUS "MÝSAFÝR KULLANICIYA BAĐLI GUN/IND ORANI:" #define MSG_RATIOS_RULE "indirme %u Mb, güncelleme %u Mb zorunlu." #define MSG_INFO_IDLE_M "%lu dakikadan sonra hareket olmazsa bađlantý kapanýr." #define MSG_INFO_IDLE_S "%lu saniyeden sonra hareket olmazsa bađlantý kapanýr." #define MSG_CANT_READ_FILE "Üzgünüz, [%s] okunamadý" #define MSG_LS_TRUNCATED "Çýktý kýsaltmasý %u uygun" #define MSG_LS_SUCCESS "Uygun toplamý %u" #define MSG_LOGOUT "Çýkýţ." #define MSG_AUTH_FAILED_LOG "[%s] kullanýcýsý için giriţ hatalý" #define MSG_ILLEGAL_UMASK "Geçersiz umask" #define MSG_STANDALONE_FAILED "Standalone sunucu baţlatýlamadý" #define MSG_NO_ANONYMOUS_LOGIN "Bu özel sistem - Misafir giriţi olamaz" #define MSG_ANONYMOUS_ANY_PASSWORD "Ţifre boţ" #define MSG_MAX_USERS_IP "Bu (%lu) IP den çok fazla bađlantý" #define MSG_ACTIVE_DISABLED "Aktif mod kapalý" #define MSG_TRANSFER_SUCCESSFUL "Dosya baţarý ile transfer edildi" #define MSG_NO_DISK_SPACE "Disk dolu - lütfen daha sonra güncelleyiniz" #define MSG_OUT_OF_MEMORY "Hafýza Taţmasý" #define MSG_ILLEGAL_TRUSTED_IP "Geçersiz IP adresi" #define MSG_NO_ASCII_RESUME "ASCII yenilenmesi güvensiz, lütfen daha önce dosyayý siliniz" #define MSG_UNKNOWN_ALTLOG "Bilinmeyen log biçimi" #define MSG_ACCOUNT_DISABLED "[%s] giriţine izin yok: hesap kapalý" #define MSG_SQL_WRONG_PARMS "Yanlýţ SQL parametresi" #define MSG_ILLEGAL_CONFIG_FILE_SQL "Yanlýţ SQL konfigürasyon dosyasý" #define MSG_SQL_MISSING_SERVER "SQL konfigürasyon dosyasý içinde sunucu eksik" #define MSG_SQL_DOWN "SQL sunucusu kapalý görünüyor" #define MSG_ILLEGAL_QUOTA "Geçersiz kota" #define MSG_QUOTA_FILES "%llu dosya kullaným (%d%%) - yetki: %llu dosya" #define MSG_QUOTA_SIZE "%llu Kbytes kullaným (%d%%) - yetki: %llu Kb" #define MSG_QUOTA_EXCEEDED "Kota aţýmý: [%s] kaydedilemedi" #define MSG_AUTH_UNKNOWN "Bilinmeyen yetkilendirme metodu" #define MSG_PDB_BROKEN "puredb dosyasýndan indexlenme okunamadý (veya eski biçim algýlandý) - pure-pw mkdb yi deneyiniz" #define MSG_ALIASES_ALIAS "%s takma adý %s ." #define MSG_ALIASES_UNKNOWN "Bilinmeyen takmaad %s." #define MSG_ALIASES_BROKEN_FILE "Hasarlý takma ad dosyasý" #define MSG_ALIASES_LIST "Belirtilen takma ad kullanýlabilir :" #define MSG_PERUSER_MAX "%lu den ayný kullanýcý kabul edemiyoruz" #define MSG_IPV6_OK "IPv6 bađlantýsý kabul edildi, Hoţgeldiniz." #define MSG_TLS_INFO "TLS: Enabled %s with %s, %d secret bits cipher" #define MSG_TLS_WEAK "TLS: Cipher too weak" #define MSG_TLS_NEEDED "Sorry, cleartext sessions are not accepted on this server.\n" \ "Please reconnect using TLS security mechanisms." #define MSG_ILLEGAL_CHARSET "Illegal charset" #define MSG_TLS_NO_CTX "TLS: Context not found. Exiting." #define MSG_PROT_OK "Data protection level set to \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Data connection cannot be opened with this PROT setting." #define MSG_PROT_UNKNOWN_LEVEL "Protection level %s not understood. Fallback to \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT must be preceded by a successful PBSZ command" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP returned no userPassword attribute, check LDAP access rights." #define MSG_LDAP_INVALID_AUTH_METHOD "Invalid LDAPAuthMethod in the configuration file. Should be 'bind' or 'password'." #define MSG_INVALID_ARGUMENT "Invalid argument: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/log_unix.h0000644000175000017500000000053013350542502016167 0ustar rackeracke#ifndef __LOG_UNIX_H__ #define __LOG_UNIX_H__ 1 void pw_unix_check(AuthResult * const result, const char *account, const char *password, const struct sockaddr_storage * const sa, const struct sockaddr_storage * const peer); #define pw_unix_parse NULL #define pw_unix_exit NULL #endif pure-ftpd-1.0.49.orig/src/pure-statsdecode.c0000644000175000017500000000366213450665410017627 0ustar rackeracke#include #include "ftpd.h" #ifdef WITH_DMALLOC # include #endif static void usage(void) { puts("Usage: pure-statsdecode [stats log file] [-]"); } int main(int argc, char *argv[]) { int instamp = 0; int c; const char *file; FILE *fp; time_t date; struct tm *tm; char timestamp[42]; if (argc != 2) { usage(); return 1; } #ifdef HAVE_SETLOCALE # ifdef LC_MESSAGES (void) setlocale(LC_MESSAGES, ""); # endif # ifdef LC_CTYPE (void) setlocale(LC_CTYPE, ""); # endif # ifdef LC_COLLATE (void) setlocale(LC_COLLATE, ""); # endif #endif file = argv[1]; if (*file == '-' && file[1] == 0) { fp = stdin; } else { if ((fp = fopen(file, "r")) == NULL) { perror("Can't open file: "); return -1; } } while ((c = getc(fp)) != EOF) { if (instamp >= 0) { if (isdigit(c)) { if (instamp < (int) (sizeof timestamp - 1U)) { timestamp[instamp] = (char) c; instamp++; } } else { timestamp[instamp] = 0; instamp = -1; date = (time_t) strtoul(timestamp, NULL, 10); tm = localtime(&date); if (tm == NULL) { printf("- - "); } else{ printf("%d/%02d/%02d %02d:%02d:%02d ", tm->tm_year + 1900, tm->tm_mon + 1, tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec); } } } else { if (c == '\n' || !ISCTRLCODE(c)) { putchar(c); } } if (c == '\n') { fflush(fp); instamp = 0; } } fclose(fp); return 0; } pure-ftpd-1.0.49.orig/src/tls_extcert_p.h0000644000175000017500000000224013446174132017230 0ustar rackeracke#ifndef __TLS_EXTCERT_P_H__ #define __TLS_EXTCERT_P_H__ 1 #ifdef WITH_TLS #include #ifndef SUN_LEN # define SUN_LEN(ptr) ((size_t) (((struct sockaddr_un *) NULL)->sun_path) \ + strlen((ptr)->sun_path)) #endif #ifndef EXTCERT_MAX_CONNECT_TRIES # define EXTCERT_MAX_CONNECT_TRIES 10 #endif #ifndef EXTCERT_MAX_CONNECT_DELAY # define EXTCERT_MAX_CONNECT_DELAY 1 #endif typedef struct ExtcertCallBack_ { const char *keyword; void (*func)(const char *str, CertResult * const result); } ExtcertCallBack; static void callback_reply_action(const char *str, CertResult * const result); static void callback_reply_cert_file(const char *str, CertResult * const result); static void callback_reply_key_file(const char *str, CertResult * const result); static void callback_reply_end(const char *str, CertResult * const result); static ExtcertCallBack extcert_callbacks[] = { { EXTCERT_REPLY_ACTION, callback_reply_action }, { EXTCERT_REPLY_CERT_FILE, callback_reply_cert_file }, { EXTCERT_REPLY_KEY_FILE, callback_reply_key_file }, { EXTCERT_REPLY_END, callback_reply_end }, { NULL, callback_reply_end } }; #endif #endif pure-ftpd-1.0.49.orig/src/crypto-md5.c0000644000175000017500000002455713450665407016373 0ustar rackeracke/* 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. */ #include #if defined(WITH_LDAP) || defined(WITH_MYSQL) || defined(WITH_PGSQL) && !defined(USE_SYSTEM_CRYPT_MD5) #include "ftpd.h" #include "crypto.h" #include "crypto-md5.h" #include "utils.h" #ifdef WITH_DMALLOC # include #endif /* 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(uint32_t[4], const unsigned char[64]); #ifndef WORDS_BIGENDIAN # define Encode memcpy # define Decode memcpy #else static void Encode(unsigned char *, const uint32_t *, size_t); static void Decode(uint32_t *, const unsigned char *, size_t); #endif 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) + (uint32_t)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define GG(a, b, c, d, x, s, ac) { \ (a) += G ((b), (c), (d)) + (x) + (uint32_t)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define HH(a, b, c, d, x, s, ac) { \ (a) += H ((b), (c), (d)) + (x) + (uint32_t)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } #define II(a, b, c, d, x, s, ac) { \ (a) += I ((b), (c), (d)) + (x) + (uint32_t)(ac); \ (a) = ROTATE_LEFT ((a), (s)); \ (a) += (b); \ } /* MD5 initialization. Begins an MD5 operation, writing a new context. */ void MD5Init(MD5_CTX * 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. */ void MD5Update(MD5_CTX * context, const unsigned char *input, size_t inputLen) { size_t i, index, partLen; /* Compute number of bytes mod 64 */ index = (size_t) ((context->count[0] >> 3) & 0x3F); /* Update number of bits */ if ((context->count[0] += ((uint32_t) inputLen << 3)) < ((uint32_t) inputLen << 3)) { context->count[1]++; } context->count[1] += ((uint32_t) inputLen >> 29); partLen = 64 - index; /* Transform as many times as possible. */ if (inputLen >= partLen) { memcpy ((void *) &context->buffer[index], (const void *) 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 */ memcpy ((void *) &context->buffer[index], (const void *) &input[i], inputLen - i); } /* MD5 finalization. Ends an MD5 message-digest operation, writing the the message digest and zeroizing the context. */ void MD5Final(unsigned char digest[16], MD5_CTX * context) { unsigned char bits[8]; size_t index, padLen; /* Save number of bits */ Encode(bits, context->count, 8); /* Pad out to 56 mod 64. */ index = (size_t) ((context->count[0] >> 3) & 0x3f); padLen = (index < 56) ? (56 - index) : (120 - index); MD5Update(context, PADDING, padLen); /* Append length (before padding) */ MD5Update(context, bits, 8); if (digest != NULL) { /* Bill Simpson's padding */ /* store state in digest */ Encode(digest, context->state, 16); /* Zeroize sensitive information. */ pure_memzero(context, sizeof (*context)); } } /* MD5 basic transformation. Transforms state based on block. */ static void MD5Transform(uint32_t state[4], const unsigned char block[64]) { uint32_t 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. */ pure_memzero(x, sizeof x); } #ifdef WORDS_BIGENDIAN /* Encodes input (uint32_t) into output (unsigned char). Assumes len is a multiple of 4. */ static void Encode(unsigned char *output, const uint32_t * input, size_t len) { size_t 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 (uint32_t). Assumes len is a multiple of 4. */ static void Decode(uint32_t * output, const unsigned char *input, size_t len) { size_t i, j; for (i = 0, j = 0; j < len; i++, j += 4) { output[i] = ((uint32_t) input[j]) | (((uint32_t) input[j + 1]) << 8) | (((uint32_t) input[j + 2]) << 16) | (((uint32_t) input[j + 3]) << 24); } } #endif #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/pure-quotacheck.c0000644000175000017500000002411013450665410017443 0ustar rackeracke#include #include "ftpd.h" #include "quotas.h" #include "safe_rw.h" #ifndef HAVE_GETOPT_LONG # include "bsd-getopt_long.h" #else # include #endif #ifdef WITH_DMALLOC # include #endif static uid_t uid; static gid_t gid; static const char *startpath; static unsigned long long total_size; static unsigned long long total_files; static signed char isroot; static char default_tz_for_putenv[] = "TZ=UTC+00:00"; /* * To avoid races/loop attacks, we keep track of inode and * device numbers of every directory to avoid scanning them * twice. It's stupidly paranoid and slow. But it's safe. */ typedef struct Node_ { ino_t inode; dev_t device; } Node; static Node *nodes; static size_t nodes_size; static void oom(void) { fputs("Out of memory error!\n", stderr); exit(EXIT_FAILURE); } static int init_tz(void) { char stbuf[10]; struct tm *tm; time_t now; #ifdef HAVE_TZSET tzset(); #endif #ifdef HAVE_PUTENV time(&now); if ((tm = localtime(&now)) == NULL || strftime(stbuf, sizeof stbuf, "%z", tm) != (size_t) 5U) { return -1; } snprintf(default_tz_for_putenv, sizeof default_tz_for_putenv, "TZ=UTC%c%c%c:%c%c", (*stbuf == '-' ? '+' : '-'), stbuf[1], stbuf[2], stbuf[3], stbuf[4]); putenv(default_tz_for_putenv); #endif return 0; } static int traverse(const char * const s) { DIR *d; struct dirent *de; struct stat st; size_t slen; Node *nodes_pnt = nodes; Node *found_node; size_t nodes_sizeleft = nodes_size; int fd; char *path = NULL; size_t sizeof_path = (size_t) 0U; if ((fd = open(s, O_RDONLY | O_DIRECTORY | O_NONBLOCK)) == -1) { if (errno != EACCES) { return -1; } if (fstat(fd, &st) != 0 || !S_ISDIR(st.st_mode) || st.st_uid != uid) { close(fd); return -1; } (void) fchmod(fd, st.st_mode | 0500); close(fd); if ((fd = open(s, O_RDONLY | O_DIRECTORY | O_NONBLOCK)) == -1) { return -1; } } if (fstat(fd, &st) != 0 || !S_ISDIR(st.st_mode)) { close(fd); return -1; } if ((st.st_mode & 0500) != 0500 && st.st_uid == uid) { (void) fchmod(fd, (mode_t) (st.st_mode | 0500)); /* if it fails, try anyway */ } close(fd); while (nodes_sizeleft > (size_t) 0U) { if (nodes_pnt->inode == st.st_ino && nodes_pnt->device == st.st_dev) { return -1; } nodes_pnt++; nodes_sizeleft -= sizeof *nodes_pnt; } if (nodes == NULL) { if ((nodes = malloc(sizeof *nodes)) == NULL) { oom(); } } else { Node *new_nodes; if ((new_nodes = realloc(nodes, nodes_size + sizeof *nodes_pnt)) == NULL) { oom(); } nodes = new_nodes; } found_node = (Node *) (void *) (((unsigned char *) nodes) + nodes_size); found_node->inode = st.st_ino; found_node->device = st.st_dev; nodes_size += sizeof *nodes_pnt; if ((d = opendir(s)) == NULL) { return -1; } slen = strlen(s) + (size_t) 2U; while ((de = readdir(d)) != NULL) { size_t wanted_sizeof_path; if ((de->d_name[0] == '.' && de->d_name[1] == 0) || (de->d_name[0] == '.' && de->d_name[1] == '.' && de->d_name[2] == 0)) { continue; } if (strcmp(de->d_name, QUOTA_FILE) == 0) { continue; } wanted_sizeof_path = slen + strlen(de->d_name); if (wanted_sizeof_path > sizeof_path) { if ((path = realloc(path, wanted_sizeof_path)) == NULL) { oom(); } sizeof_path = wanted_sizeof_path; } snprintf(path, sizeof_path, "%s/%s", s, de->d_name); if (stat(path, &st) == 0) { if (S_ISDIR(st.st_mode)) { if (traverse(path) == 0) { total_files++; } } else if (S_ISREG(st.st_mode)) { total_size += (unsigned long long) st.st_size; total_files++; } } } free(path); closedir(d); return 0; } static void help(void) { puts("\nUsage:\n\n" "pure-quotacheck -u -d [-g ]\n\n" "-d : start from this directory\n" "-g : scan the directory under this gid\n" "-h: help\n" "-u : scan the directory under this uid\n"); exit(EXIT_SUCCESS); } static int doinitsupgroups(const char *user, const uid_t uid, const gid_t gid) { #ifndef NON_ROOT_FTP # ifdef HAVE_SETGROUPS if (setgroups(1U, &gid) != 0) { return -1; } # else (void) gid; # endif # ifdef HAVE_INITGROUPS if (user == NULL) { const struct passwd * const lpwd = getpwuid(uid); if (lpwd != NULL && lpwd->pw_name != NULL) { user = lpwd->pw_name; } else { return -1; } } initgroups(user, gid); # else (void) user; (void) uid; # endif #else (void) user; (void) uid; (void) gid; #endif return 0; } static int changeuidgid(void) { if (setgid(gid) || setegid(gid) || setuid(uid) || seteuid(uid) || chdir("/")) { return -1; } return 0; } static int writequota(const char * const quota_file) { int err = -1; int fd; struct flock lock; ssize_t towrite; struct stat st; char buf[84]; const char *bufpnt = buf; if ((fd = open("/", O_RDONLY | O_DIRECTORY | O_NONBLOCK)) == -1) { return -1; } if (fstat(fd, &st) != 0 || !S_ISDIR(st.st_mode)) { close(fd); return -1; } if ((st.st_mode & 0700) != 0700 && st.st_uid == uid) { (void) fchmod(fd, st.st_mode | 0700); } close(fd); if ((fd = open(quota_file, O_RDWR | O_CREAT | O_NOFOLLOW, (mode_t) 0600)) == -1) { return -1; } lock.l_whence = SEEK_SET; lock.l_start = (off_t) 0; lock.l_len = (off_t) 0; lock.l_pid = getpid(); lock.l_type = F_WRLCK; while (fcntl(fd, F_SETLKW, &lock) < 0) { if (errno != EINTR) { goto byenounlock; } } if (SNCHECK(snprintf(buf, sizeof buf, "%llu %llu\n", total_files, total_size), sizeof buf) || ftruncate(fd, (off_t) 0) != 0) { goto bye; } towrite = (ssize_t) strlen(buf); err = - (safe_write(fd, bufpnt, towrite, -1) != (ssize_t) towrite); bye: lock.l_type = F_UNLCK; while (fcntl(fd, F_SETLK, &lock) < 0 && errno == EINTR); byenounlock: close(fd); return err; } int main(int argc, char *argv[]) { int fodder; if (geteuid() == (uid_t) 0) { isroot = 1; } else { uid = geteuid(); gid = getegid(); } if (argc < 0) { return -1; } if (argc < 2) { help(); } #ifdef HAVE_SETLOCALE # ifdef LC_MESSAGES (void) setlocale(LC_MESSAGES, ""); # endif # ifdef LC_CTYPE (void) setlocale(LC_CTYPE, ""); # endif # ifdef LC_COLLATE (void) setlocale(LC_COLLATE, ""); # endif #endif init_tz(); while ((fodder = getopt(argc, argv, "d:g:u:h")) != -1) { switch(fodder) { case 'h': help(); /* doesn't return */ case 'd': if (startpath != NULL) { fprintf(stderr, "Already one startpath: [%s]\n", startpath); return -1; } startpath = strdup(optarg); if (startpath == NULL) { oom(); } break; case 'g': { struct group *gr; if (gid > (gid_t) 0) { fprintf(stderr, "You already gave a gid\n"); return -1; } if ((gr = getgrnam(optarg)) != NULL) { gid = gr->gr_gid; } else { gid = (gid_t) strtoul(optarg, NULL, 10); } } break; case 'u': { struct passwd *pw; if ((pw = getpwnam(optarg)) != NULL) { uid = pw->pw_uid; if (gid == (gid_t) 0) { gid = pw->pw_gid; } } else { uid = (uid_t) strtoul(optarg, NULL, 10); } } break; case '?': help(); } } if (startpath == NULL) { fprintf(stderr, "Missing path\n"); return -1; } if (uid <= (uid_t) 0) { fprintf(stderr, "Invalid/insecure/missing uid - must be > 0\n"); return -2; } if (gid <= (gid_t) 0) { fprintf(stderr, "Invalid/insecure/missing gid - must be > 0\n"); return -2; } if (isroot != 0) { if (doinitsupgroups(NULL, uid, gid) #if defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__CYGWIN__) & 0 #endif != 0 || chdir(startpath) != 0 || chroot(startpath) != 0 || chdir("/") != 0) { fprintf(stderr, "Can't chroot to [%s]: [%s]\n", startpath, strerror(errno)); return -3; } if (changeuidgid() < 0) { fprintf(stderr, "Can't switch uid/gid: [%s]\n", strerror(errno)); return -3; } } else if (chdir(startpath) != 0) { fprintf(stderr, "Can't enter directory [%s]: [%s]\n", startpath, strerror(errno)); return -3; } if (traverse(isroot != 0 ? "/" : "./") < 0) { fprintf(stderr, "Unable to traverse [%s]: [%s]\n", startpath, strerror(errno)); free(nodes); return -4; } free(nodes); if (isroot != 0) { if (writequota("/" QUOTA_FILE) < 0) { err_writequota: fprintf(stderr, "Unable to update the quota file (" QUOTA_FILE "): [%s]\n", strerror(errno)); return -5; } } else if (chdir(startpath) != 0 || writequota(QUOTA_FILE) < 0) { goto err_writequota; } return 0; } pure-ftpd-1.0.49.orig/src/utils.h0000644000175000017500000000063613350542502015512 0ustar rackeracke#ifndef __UTILS_H__ #define __UTILS_H__ 1 #ifdef HAVE_LIBSODIUM # include # define pure_memzero(P, L) sodium_memzero((P), (L)) # define pure_memcmp(A, B, L) sodium_memcmp((A), (B), (L)) #else void pure_memzero(void * const pnt, const size_t len); int pure_memcmp(const void * const b1_, const void * const b2_, size_t len); #endif int pure_strcmp(const char * const s1, const char * const s2); #endif pure-ftpd-1.0.49.orig/src/messages_sq.h0000644000175000017500000003520413446174132016671 0ustar rackeracke#define MSG_TLS_CIPHER_FAILED "TLS: Keni specifikuar gabim TLSCipherSuite '%s'" #define MSG_TIMEOUT "Jashte Kohe" #define MSG_CAPABILITIES "Nuk mund te shkembehen aftesite" #define MSG_CLIENT_CLOSED_CNX "Klienti e mbylli lidhjen" #define MSG_CLIENT_READ_ERR "Gabim leximi nga klienti" #define MSG_CANT_OPEN_CNX "Nuk mund te hapet lidhja" #define MSG_CANT_CREATE_DATA_SOCKET "Nuk krijoj dot data socket" #define MSG_DEBUG_CLIENT_IS "Adresa e klientit eshte" #define MSG_SYNTAX_ERROR_IP "Gabim shkrimi ne adresen IP" #define MSG_PORT_SUCCESSFUL "Komanda PORT doli me sukses" #define MSG_ONLY_IPV4V6 "Vetem IPv4 dhe IPv6 jane te suportuara (1,2)" #define MSG_ONLY_IPV4 "Vetem IPv4 eshte i suportuar(1)" #define MSG_TIMEOUT_PARSER "Jashte Kohe - shkruaj me shpejt heres tjeter" #define MSG_LINE_TOO_LONG "Vija eshte shume e gjate" #define MSG_LOG_OVERFLOW "Klienti kerkoi te mbingarkoje buffer te vijes se komandes" #define MSG_GOODBYE "Mirupafshim. Ju ngarkuat %llu dhe shkarkuar %llu kBytes." #define MSG_DEBUG_COMMAND "Komand" #define MSG_IS_YOUR_CURRENT_LOCATION "eshte vendodhja juaj aktuale" #define MSG_NOT_LOGGED_IN "Ju nuk jeni i loguar" #define MSG_AUTH_UNIMPLEMENTED "Kjo skeme sigurie nuk eshte e zhvilluar" #define MSG_NO_FILE_NAME "Nuk ka emer file" #define MSG_NO_DIRECTORY_NAME "Nuk ka emer direktorie" #define MSG_NO_RESTART_POINT "Nuk ka pike rinisje" #define MSG_ABOR_SUCCESS "Duke qene se shikoni kete ABOR ka dale me sukses" #define MSG_MISSING_ARG "Mungon argumenti" #define MSG_GARBAGE_FOUND "Mbeturina u gjenden pas vleres" #define MSG_VALUE_TOO_LARGE "Vlera eshte shume e madhe" #define MSG_IDLE_TIME "Koha boshe eshte %lu sekonda" #define MSG_SITE_HELP "Komandat SITE ne vijim jane te njohura" #define MSG_BAD_CHMOD "Te drejta te gabuara" #define MSG_UNKNOWN_EXTENSION "eshte nje prapashtese e panjohur" #define MSG_XDBG_OK "Komanda XDBG e suksesshme, niveli debug eshte %d" #define MSG_UNKNOWN_COMMAND "Komande e panjohur" #define MSG_TIMEOUT_NOOP "Jashte Kohe (pa veprime per for %lu sekonda)" #define MSG_TIMEOUT_DATA "Jashte Kohe (pa te dhena te reja per %lu sekonda)" #define MSG_SLEEPING "Po fle gjum..." #define MSG_ALREADY_LOGGED "Je loguar nje here or mik" #define MSG_ANY_PASSWORD "C'do password ben pune" #define MSG_ANONYMOUS_LOGGED "Perdorues anonim i loguar" #define MSG_ANONYMOUS_LOGGED_VIRTUAL "Perdorues anonim i loguar ne virtual FTP" #define MSG_USER_OK "Perdoruesi %s OK. Duhet dhe passwordi" #define MSG_CANT_DO_TWICE "Nuk mund ta bejme ne kete sesion" #define MSG_UNABLE_SECURE_ANON "E pamundur te ngrihet FTP anonime dhe e sigurte" #define MSG_BANDWIDTH_RESTRICTED "Gjeresia brezit tuaj eshte e kufizuar" #define MSG_NO_PASSWORD_NEEDED "C'do password ben pune" #define MSG_NOTRUST "Me fal po nuk te besoj dot" #define MSG_WHOAREYOU "Me thuaj kush je" #define MSG_AUTH_FAILED "Njohja ne hyrje deshtoi" #define MSG_AUTH_TOOMANY "Shume deshtime ne hyrje" #define MSG_NO_HOMEDIR "Direktoria baze nuk gjendet - po e mbyll" #define MSG_NO_HOMEDIR2 "%s nuk ekziston ose e paarriteshme" #define MSG_START_SLASH "Fillon ne /" #define MSG_USER_GROUP_ACCESS "Perdoruesi %s ka akses grupi ne" #define MSG_FXP_SUPPORT "Ky server mundeson transferime FXP" #define MSG_RATIO "Duhet te respektoni nje raport %u:%u (UL/DL)" #define MSG_CHROOT_FAILED "E pamunduer te sigurohet nje chroot() burgosje" #define MSG_CURRENT_DIR_IS "OK. Direktoria aktuale eshte %s" #define MSG_CURRENT_RESTRICTED_DIR_IS "OK. Direktoria aktuale e kufizuar eshte %s" #define MSG_IS_NOW_LOGGED_IN "%s eshte i loguar" #define MSG_CANT_CHANGE_DIR "Nuk mund te nderrohet direktoria ne %s" #define MSG_PATH_TOO_LONG "Shtegu eshte shume e gjate" #define MSG_CANT_PASV "Nuk mund te perdoresh PASV ne lidhje IPv6. Ne vend te saj perdor EPSV." #define MSG_CANT_PASSIVE "E pamundur te hapet nje lidhje pasive" #define MSG_PORTS_BUSY "Te gjitha portat TCP te rezervuara jane te zena" #define MSG_GETSOCKNAME_DATA "E pamundur te identifikohet data socket lokal" #define MSG_GETPEERNAME "E pamundur te identifikohet socket lokal" #define MSG_INVALID_IP "Me vjen keq, keni dhene adrese te gabuar" #define MSG_NO_EPSV "Ju lutemi te perdorni nje klient sipas IPv6 qe suporton EPSV" #define MSG_BAD_PORT "Me vjen keq, nuk mund te lidhem me portat < 1024" #define MSG_NO_FXP "Nuk do cel nje lidhje me %s (vetem me %s)" #define MSG_FXP "Transferim FXP : nga %s ne %s" #define MSG_NO_DATA_CONN "Nuk ka lidhje data" #define MSG_ACCEPT_FAILED "Lidhja nuk u pranua" #define MSG_ACCEPT_SUCCESS "Lidhja data u pranua" #define MSG_CNX_PORT_FAILED "Nuk u hap lidhja data ne port %d" #define MSG_CNX_PORT "Po lidhem me porten %d" #define MSG_ANON_CANT_MKD "Me vjen keq, perdorueseve anonim nuk u lejohet te krijojne direktori" #define MSG_ANON_CANT_RMD "Me vjen keq, perdorueseve anonim nuk u lejohet te heqin direktori" #define MSG_ANON_CANT_RENAME "Perdoruesit anonim nuk mund te levizin/heqin file" #define MSG_ANON_CANT_CHANGE_PERMS "Perdoruesit anonim nuk mund te ndryshojne te drejtat" #define MSG_GLOB_NO_MEMORY "Mbaroi memoria gjate globbing-ut te %s" #define MSG_PROBABLY_DENIED "(Me siguri do te thote \"Nuk te lejohet te hysh\")" #define MSG_GLOB_READ_ERROR "Gabim leximi gjate globbing-ut te %s" #define MSG_GLOB_NO_MATCH "Nuk ka %s ne %s" #define MSG_CHMOD_FAILED "Nuk u ndryshuan te drejtat mbi %s" #define MSG_CHMOD_SUCCESS "U ndryshuan te drejtat mbi %s" #define MSG_CHMOD_TOTAL_FAILURE "Me vjen keq, por nuk munda te ndryshoja asnje te drejte" #define MSG_ANON_CANT_DELETE "Perdoruesit anonim nuk mund te fshijne file" #define MSG_ANON_CANT_OVERWRITE "Perdoruesit anonim nuk mund te mbishkruajne file ekzistues" #define MSG_DELE_FAILED "Nuk munda te fshij %s" #define MSG_DELE_SUCCESS "U fshi %s%s%s%s" #define MSG_DELE_TOTAL_FAILURE "Asnje file nuk u fshi" #define MSG_LOAD_TOO_HIGH \ "Ngarkesa ishte %3.2f Kur u lidhe. Ne nuk lejojme shkarkime\n" \ "nga perdorues anonim kur ngarkesa eshte aq e madhe. Ngarkime jane perhere\n" \ "te pranuar." #define MSG_OPEN_FAILURE "Nuk hap dot %s" #define MSG_OPEN_FAILURE2 "Nuk hap dot ate file" #define MSG_STAT_FAILURE "Nuk gjende kjo madhesi file" #define MSG_STAT_FAILURE2 "Nuk kontrolloj dot ekzistencen e file" #define MSG_REST_TOO_LARGE_FOR_FILE "Zhvendosja fillimit %lld eshte shume e madhe per file me kete madhesi %lld." #define MSG_REST_RESET "Zhvendosja fillimit u kthye ne 0" #define MSG_NOT_REGULAR_FILE "Mund te terheq vetem file te rregullta" #define MSG_NOT_MODERATED \ "Ky file eshte ngarkuar nga nje perdorues anonim. Nuk ka\n" \ "marre lejen per shkarkim nga administratoret e sherbimit." #define MSG_RATIO_DENIAL \ "Me falni po raporti ngarkim/shkarkim eshte %u:%u .\n" \ "Ju sapo bete ngarkim %llu Kb dhe bete shkarkime %llu Kb.\n" \ "Ju lutemi beni ngarkim ndonje gje dhe rrini kot me vone." #define MSG_NO_MORE_TO_DOWNLOAD "Nuk ka ngelur gje per tu shkarkuar" #define MSG_WINNER "Kompjuteri eshte miku juaj. Besojini kompjuterit" #define MSG_KBYTES_LEFT "%.1f kbytes jane per shkarkim" #define MSG_ABORTED "Transferimi u anullua" #define MSG_DATA_WRITE_FAILED "Gabim gjate shkrimit ne lidhjen e te dhenave" #define MSG_DATA_READ_FAILED "Gabim gjate leximit nga lidhja e te dhenave" #define MSG_MMAP_FAILED "Nuk mund te gjejme file ne memorie" #define MSG_WRITE_FAILED "Gabim gjate shkrimit ne file" #define MSG_TRANSFER_RATE_M "%.3f sekonda (te matura), %.2f Mbytes per sekond" #define MSG_TRANSFER_RATE_K "%.3f sekonda (te matura), %.2f Kbytes per sekond" #define MSG_TRANSFER_RATE_B "%.3f sekonda (te matura), %.2f bytes per sekond" #define MSG_SPACE_FREE_M "%.1f Mbytes hapesire e lire ne disk" #define MSG_SPACE_FREE_K "%f Kbytes hapesire e lire ne disk" #define MSG_DOWNLOADED "u shkarkua" #define MSG_REST_NOT_NUMERIC "REST kerkon nje parameter numerik" #define MSG_REST_ASCII_STRICT "Shenjuesi i pergjigjes duhet te jete 0 ne ASCII mode" #define MSG_REST_ASCII_WORKAROUND "Po ristartojme %lld. Gjithsesi jemi ne ASCII mode" #define MSG_REST_SUCCESS "Po ristartojme %lld" #define MSG_SANITY_DIRECTORY_FAILURE "Emer drejtorie i ndaluar" #define MSG_SANITY_FILE_FAILURE "Emer file i ndaluar: %s" #define MSG_MKD_FAILURE "Nuk mund te krijoje direktorine" #define MSG_MKD_SUCCESS "Direktoria u krijua me sukses" #define MSG_RMD_FAILURE "Nuk mund te fshije direktorine" #define MSG_RMD_SUCCESS "Direktoria u fshi me sukses" #define MSG_TIMESTAMP_FAILURE "Nuk mund te gjej nje vule kohore" #define MSG_MODE_ERROR "Vetem ASCII dhe binary modes mund te suportohen" #define MSG_CREATE_FAILURE "Nuk mund te krijoje nje file" #define MSG_ABRT_ONLY "ABRT eshte komanda e vetme gjate nje ngarkimi" #define MSG_UPLOAD_PARTIAL "pjeserisht e ngarkuar" #define MSG_REMOVED "e levizur" #define MSG_UPLOADED "e ngarkuar" #define MSG_GMTIME_FAILURE "Nuk mund te gjej kohen lokale" #define MSG_TYPE_8BIT_FAILURE "Vetem byte me 8-bit mund te suportohen, nuk jemi 10 vjet me perpara" #define MSG_TYPE_UNKNOWN "TYPE i panjohur" #define MSG_TYPE_SUCCESS "TYPE eshte tani" #define MSG_STRU_FAILURE "Vetem F(ile) suportohet" #define MSG_MODE_FAILURE "Ju lutem perdorni S(tream) mode" #define MSG_RENAME_ABORT "Po nderpresim veprimin e ri-emerimit" #define MSG_RENAME_RNFR_SUCCESS "RNFR u pranua - file ekziston, gati per ne destinacion" #define MSG_FILE_DOESNT_EXIST "Te na falni po ky file nuk ekziston" #define MSG_RENAME_ALREADY_THERE "RENAME deshtoi - file destinacion ekziston" #define MSG_RENAME_NORNFR "Duhet RNFR para RNTO" #define MSG_RENAME_FAILURE "Deshtim ri-emerimi/levizje" #define MSG_RENAME_SUCCESS "File u ri-emerua ose leviz me sukses" #define MSG_NO_SUPERSERVER "Ju lutemi nisni pure-ftpd brenda nje super-serveri (si tcpserver)" #define MSG_NO_FTP_ACCOUNT "Nuk mundem te gjejme llogarine 'ftp'" #define MSG_CONF_ERR "Gabim konfigurimi" #define MSG_NO_VIRTUAL_FILE "Mungon emri i file te perdorueseve virtual" #define MSG_ILLEGAL_THROTTLING "Vlere e paligjshme per pershpejtim" #define MSG_ILLEGAL_TRUSTED_GID "Id e grupit 'gid' i paligjshem per chroot" #define MSG_ILLEGAL_USER_LIMIT "Limit i paligjshem per perdoruesin" #define MSG_ILLEGAL_FACILITY "Emer pozicioni i panjohur" #define MSG_ILLEGAL_CONFIG_FILE_LDAP "File konfigurimi LDAP i pavlefshem" #define MSG_ILLEGAL_LOAD_LIMIT "Limit ngarkese i paligjshem" #define MSG_ILLEGAL_PORTS_RANGE "Numerim portash i paligjshem" #define MSG_ILLEGAL_LS_LIMITS "Limit 'ls' i paligjshem" #define MSG_ILLEGAL_FORCE_PASSIVE "IP i forcuar per lidhje pasive i paligjshem" #define MSG_ILLEGAL_RATIO "Raport ngarkim/shkarkim i paligjshem" #define MSG_ILLEGAL_UID_LIMIT "Limit i id te perdoruesit 'uid' i paligjshem" #define MSG_ILLEGAL_OPTION "Opsion i panjohur ne kohe ekzekutimi" #define MSG_LDAP_MISSING_BASE "LDAPBaseDN mungon ne file te konfigurimit LDAP" #define MSG_LDAP_WRONG_PARMS "Parametra LDAP te gabuar" #define MSG_NEW_CONNECTION "Lidhje e re nga %s" #define MSG_WELCOME_TO "Miresevini ne" #define MSG_MAX_USERS "%lu perdorues (maksimumi) jane tashme te loguar, te na falni" #define MSG_NB_USERS "Ju jeni perdoruesi numer %u nga %u te lejuar." #define MSG_WELCOME_TIME "Koha lokale eshte %02d:%02d. Porta e serverit: %u." #define MSG_ANONYMOUS_FTP_ONLY "Ketu pranohet vetem FTP anonime" #define MSG_RATIOS_EVERYONE "RAPORTET JANE TE AKTIVIZUARA PER TE GJITHE:" #define MSG_RATIOS_ANONYMOUS "PERDORUESIT ANONIM NDIKOHEN NGA RAPORTI UL/DL:" #define MSG_RATIOS_RULE "per shkarkim %u Mb, ngarkim/ngarkim i %u Mb te dhenash eshte i detyrueshem." #define MSG_INFO_IDLE_M "Do te shkeputeni pas %lu minutash pa aktivitet." #define MSG_INFO_IDLE_S "Do te shkeputeni pas %lu sekondash pa aktivitet." #define MSG_CANT_READ_FILE "Na falni, ishte e pamundur te lexohej [%s]" #define MSG_LS_TRUNCATED "Rezultati i shkurtuar ne %u krahasime" #define MSG_LS_SUCCESS "%u krahasime ne total" #define MSG_LOGOUT "Logout/Dalje." #define MSG_AUTH_FAILED_LOG "Autentikimi nuk u krye dot per user [%s]" #define MSG_ILLEGAL_UMASK "Umask e gabuar" #define MSG_STANDALONE_FAILED "E pamundur te niset nje server i pavarur" #define MSG_NO_ANONYMOUS_LOGIN "Ky eshte nje sistem privat - Nuk ka hyrje anonim" #define MSG_ANONYMOUS_ANY_PASSWORD "Cdo fjalekalim mund te perdoret" #define MSG_MAX_USERS_IP "Shume teper lidhje (%lu) nga kjo IP" #define MSG_ACTIVE_DISABLED "Modaliteti aktiv eshte i c'aktivizuar" #define MSG_TRANSFER_SUCCESSFUL "File u transferua me sukses" #define MSG_NO_DISK_SPACE "Disku eshte plot - ju lutemi provoni te ngarkoni/ngarkim me vone" #define MSG_OUT_OF_MEMORY "Ka mbaruar memoria" #define MSG_ILLEGAL_TRUSTED_IP "Adrese IP ilegale por e besuar" #define MSG_NO_ASCII_RESUME "Rikthimi me ASCII eshte i pasigurt, ju lutemi te fshini file njehere" #define MSG_UNKNOWN_ALTLOG "Format logimi i panjohur" #define MSG_ACCOUNT_DISABLED "Nuk mund te futem si [%s]: perdorues i c'aktivizuar" #define MSG_SQL_WRONG_PARMS "Parametra SQL te gabuar" #define MSG_ILLEGAL_CONFIG_FILE_SQL "File konfigurimi SQL i gabuar" #define MSG_SQL_MISSING_SERVER "Mungon serveri ne file te konfigurimit SQL" #define MSG_SQL_DOWN "Serveri SQL duket jashte funksioni" #define MSG_ILLEGAL_QUOTA "Kjo quota eshte e gabuar" #define MSG_QUOTA_FILES "%llu file te perdorura (%d%%) - te autorizuara: %llu file" #define MSG_QUOTA_SIZE "%llu Kbytes te perdorura (%d%%) - te autorizuara: %llu Kb" #define MSG_QUOTA_EXCEEDED "Quota u tejkalua: [%s] nuk do te ruhen" #define MSG_AUTH_UNKNOWN "Metode autentikimi e panjohur" #define MSG_PDB_BROKEN "E pamundur te lexohet file puredb i indeksuar (ose format i vjeter i detektuar) - Provo njehere pure-pw mkdb" #define MSG_ALIASES_ALIAS "%s eshte nje alias per %s." #define MSG_ALIASES_UNKNOWN "Alias i panjohur %s." #define MSG_ALIASES_BROKEN_FILE "File me alias e demtuar" #define MSG_ALIASES_LIST "Keto aliase jane te mundeshme :" #define MSG_PERUSER_MAX "Nuk mund te pranoj me shume se %lu lidhje si i njejti perdorues" #define MSG_IPV6_OK "Lidhjet IPv6 jane te mirepritura ne kete server." #define MSG_TLS_INFO "TLS: E aktivizuar %s me %s, %d bite shifrimi sekret" #define MSG_TLS_WEAK "TLS: Shifrim shume i dobet" #define MSG_TLS_NEEDED "Na vjen keq, sesion te hapura dhe shifrime te dobeta nuk jane te pranuara ne kete server.\n" \ "Ju lutem te lidheni perseri duke perdorur metodat e sigurise TLS." #define MSG_ILLEGAL_CHARSET "Fusha karaktereve charset e papranueshme" #define MSG_TLS_NO_CTX "TLS: Konteksti nuk u gjend. Po dalim." #define MSG_PROT_OK "Niveli i mbrojtjes se te dhenave eshte \"%s\"" #define MSG_PROT_PRIVATE_NEEDED "Lidhja e te dhenave nuk mund te hapet me keto kushte PROT." #define MSG_PROT_UNKNOWN_LEVEL "Niveli i mbrojtjes %s i pakuptueshem. Po kthehemi ne \"%s\"" #define MSG_PROT_BEFORE_PBSZ "PROT duhet te paraprihet nga nje komande PBSZ" #define MSG_WARN_LDAP_USERPASS_EMPTY "LDAP u pergjigj pa atributin userPassword, kontrolloni te drejtat e aksesit LDAP." #define MSG_LDAP_INVALID_AUTH_METHOD "LDAPAuthMethod e pavlefshme nje file te konfigurimit. Duhet te jete 'bind' ose 'password'." #define MSG_INVALID_ARGUMENT "Argument i pavlefshem: \"%s\"" #define MSG_READY_TO_PROCEED "Ready to proceed" pure-ftpd-1.0.49.orig/src/daemons.c0000644000175000017500000000465013450665407016006 0ustar rackeracke#include #if !defined(NO_INETD) || defined(IN_PURE_MRTGINFO) # include "ftpd.h" # ifdef WITH_DMALLOC # include # endif # define TCP_STATE_CNX 1UL static unsigned int count(in_port_t server_port, const char * const file) { int f; int r; int c; int b = 0; int e = 0; unsigned int d = 0U; char buf[2049]; if ((f = open(file, O_RDONLY)) == -1) { return 0; } buf[2048] = 0; for (;;) { while ((r = (int) read(f, buf + e, (size_t) (2048U - e))) < (ssize_t) 0 && errno == EINTR); if (r <= (ssize_t) 0) { /* ignore errors. 0 is okay, in fact common. */ break; } e += r; /* * b is the offset of the start of the first line to be parsed * and e the end of the available data */ c = b; while (c < e && buf[c] != '\n') { c++; } while (c < e) { buf[c++] = 0; while (b < c && buf[b] != ':' && buf[b] != '\n') { b++; } if (b < c && buf[b] == ':') { b++; while (b < e && buf[b] != ':') { b++; } b++; if (strtoul(buf + b, NULL, 16) == (unsigned long) server_port) { while (b < e && buf[b] != ':') { b++; } if (buf[b] == ':') { b++; while (b < e && buf[b] != ' ') { b++; } if (buf[b] == ' ') { b++; if (strtoul(buf + b, NULL, 16) == TCP_STATE_CNX) { d++; } } } } } b = c; while (c < e && buf[c] != '\n') { c++; } } if (e > b) { (void) memmove(buf, buf + b, (size_t) (e - b)); /* safe */ } e -= b; b = 0; } close(f); return d; } unsigned int daemons(const in_port_t server_port) { unsigned int nbcnx; nbcnx = count(server_port, "/proc/net/tcp"); nbcnx += count(server_port, "/proc/net/tcp6"); return nbcnx; } #else extern signed char v6ready; #endif pure-ftpd-1.0.49.orig/src/ftpwho-update.h0000644000175000017500000000225213446174132017143 0ustar rackeracke#ifndef __FTPWHO_UPDATE_H__ #define __FTPWHO_UPDATE_H__ 1 #ifdef FTPWHO # ifdef NON_ROOT_FTP # define SCOREBOARD_PATH CONFDIR "/pure-ftpd-ftpwho" # else # define SCOREBOARD_PATH STATEDIR "/run/pure-ftpd" # endif #define SCOREBOARD_PREFIX "client-" typedef enum { FTPWHO_STATE_FREE = 0, /* must be first (0) */ FTPWHO_STATE_IDLE, FTPWHO_STATE_DOWNLOAD, FTPWHO_STATE_UPLOAD } FTPWhoEntryState; typedef struct FTPWhoEntry_ { FTPWhoEntryState state; pid_t pid; struct sockaddr_storage addr; struct sockaddr_storage local_addr; time_t date; time_t xfer_date; volatile off_t restartat; volatile off_t download_total_size; volatile off_t download_current_size; char account[MAX_USER_LENGTH + 1U]; #if defined(__OpenBSD__) char filename[1024]; #else # ifdef PAGE_SIZE # if PAGE_SIZE > 2048 char filename[PAGE_SIZE - 1024]; # else char filename[1024]; # endif # else char filename[1024]; # endif #endif } FTPWhoEntry; int ftpwho_initwho(void); void ftpwho_exit(void); void ftpwho_lock(void); void ftpwho_unlock(void); #ifndef NO_STANDALONE void ftpwho_unlinksbfile(const pid_t pid); #endif #endif #endif pure-ftpd-1.0.49.orig/src/altlog.c0000644000175000017500000003246613450665407015650 0ustar rackeracke /* * Alternative logging formats for Pure-FTPd */ #include #ifdef WITH_ALTLOG # include "ftpd.h" # include "ftpwho-update.h" # include "globals.h" # include "altlog.h" # include "safe_rw.h" # ifdef WITH_DMALLOC # include # endif static int altlog_write(const char *str) { struct flock lock; ssize_t left; if (altlog_fd == -1 || str == NULL || (left = (ssize_t) strlen(str)) <= (ssize_t) 0) { return -1; } lock.l_whence = SEEK_SET; lock.l_start = (off_t) 0; lock.l_len = (off_t) 0; lock.l_pid = getpid(); lock.l_type = F_WRLCK; while (fcntl(altlog_fd, F_SETLKW, &lock) < 0 && errno == EINTR); if (lseek(altlog_fd, (off_t) 0, SEEK_END) < (off_t) 0 # ifdef ESPIPE && errno != ESPIPE # endif # ifdef EBADF && errno != EBADF # endif ) { return -1; } (void) safe_write(altlog_fd, str, (size_t) left, -1); lock.l_type = F_UNLCK; while (fcntl(altlog_fd, F_SETLK, &lock) < 0 && errno == EINTR); return 0; } /* Verbose but compact log format for ftpStats */ static int altlog_writexfer_stats(const int upload, const char * const filename, const off_t size, const double duration) { /* * */ const char *host_ = *host != 0 ? host : "-"; const char *account_ = *account != 0 ? account : "-"; char *alloca_line; size_t line_size; line_size = 16U /* now */ + 1U + 16U /* start */ + 1U /* . */ + 16U /* pid */ + 1U + strlen(account_) + 1U + strlen(host_) + 1U + 1U /* U/D */ + 1U + 20U /* size */ + 1U + 16U /* duration */ + strlen(filename) + 1U /* \n */ + 1U; if ((alloca_line = ALLOCA(line_size)) == NULL) { return -1; } if (!SNCHECK(snprintf(alloca_line, line_size, "%llu %llx.%lx %s %s %c %llu %lu %s\n", (unsigned long long) time(NULL), (unsigned long long) session_start_time, (unsigned long) getpid(), account_, host_, upload != 0 ? 'U' : 'D', (unsigned long long) size, (unsigned long) (duration + 0.5), filename), line_size)) { altlog_write(alloca_line); } ALLOCA_FREE(alloca_line); return 0; } # define NO_URLENCODE(c) ( \ ((c) >= 'a' && (c) <= 'z') || \ ((c) >= 'A' && (c) <= 'Z') || \ ((c) >= '0' && (c) <= '9') || \ (c) == '.' || (c) == '/' || \ (c) == '_' || (c) == '-' \ ) # define HEXD(c) ((c) < 10 ? '0' + (c) : 'A' - 10 + (c)) static char *urlencode(const char *filename) { const char *ptr = filename; char *quoted_filename; char *quoted_filename_ptr; size_t quoted_filename_size = (size_t) 1U; int need_quote = 0; char c; while (*ptr != 0) { if (NO_URLENCODE(*ptr)) { quoted_filename_size++; } else { quoted_filename_size += (size_t) 3U; need_quote = 1; } ptr++; } if (need_quote == 0) { return (char *) filename; } if ((quoted_filename = malloc(quoted_filename_size)) == NULL) { return NULL; } quoted_filename_ptr = quoted_filename; ptr = filename; c = *ptr; do { if (NO_URLENCODE(c)) { if (quoted_filename_size <= (size_t) 1U) { free(quoted_filename); return NULL; } quoted_filename_size--; *quoted_filename_ptr++ = c; } else { if (quoted_filename_size <= (size_t) 3U) { free(quoted_filename); return NULL; } quoted_filename_size -= (size_t) 3U; *quoted_filename_ptr++ = '%'; *quoted_filename_ptr++ = HEXD(((unsigned char) c) >> 4); *quoted_filename_ptr++ = HEXD(((unsigned char) c) & 0xf); } ptr++; } while ((c = *ptr) != 0); *quoted_filename_ptr = 0; return quoted_filename; } /* HTTPd-like common log format */ static int altlog_writexfer_clf(const int upload, const char * const filename, const off_t size) { char date[sizeof "13/Apr/1975:12:34:56 +0100"]; struct tm *tm; char *alloca_line; const char *host_ = *host != 0 ? host : "-"; const char *account_ = *account != 0 ? account : "-"; char *quoted_filename; time_t now; long diff; int sign; size_t line_size; if ((now = time(NULL)) == (time_t) -1 || (tm = localtime(&now)) == NULL || tm->tm_mon > 11 || tm->tm_mon < 0) { return -1; } # ifdef HAVE_STRUCT_TM_TM_GMTOFF diff = -(tm->tm_gmtoff) / 60L; # elif defined(HAVE_SCALAR_TIMEZONE) diff = -(timezone) / 60L; # else { struct tm gmt; struct tm *t; int days, hours, minutes; gmt = *gmtime(&now); t = localtime(&now); days = t->tm_yday - gmt.tm_yday; hours = ((days < -1 ? 24 : 1 < days ? -24 : days * 24) + t->tm_hour - gmt.tm_hour); minutes = hours * 60 + t->tm_min - gmt.tm_min; diff = -minutes; } # endif if (diff > 0L) { sign = '+'; } else { sign = '-'; diff = -diff; } if (SNCHECK(snprintf(date, sizeof date, "%02d/%s/%d:%02d:%02d:%02d %c%02ld%02ld", tm->tm_mday, months[tm->tm_mon], tm->tm_year + 1900, tm->tm_hour, tm->tm_min, tm->tm_sec, sign, diff / 60L, diff % 60L), sizeof date)) { return -1; } if ((quoted_filename = urlencode(filename)) == NULL) { return -1; } line_size = strlen(host_) + (sizeof " - " - 1U) + strlen(account_) + (sizeof " [" - 1U) + (sizeof date - 1U) + (sizeof "] \"" - 1U) + 3U /* GET / PUT */ + (sizeof " " - 1U) + strlen(quoted_filename) + (sizeof "\" 200 18446744073709551616\n" - 1U) + 1U; if ((alloca_line = ALLOCA(line_size)) == NULL) { return -1; } if (!SNCHECK(snprintf(alloca_line, line_size, "%s - %s [%s] \"%s %s\" 200 %llu\n", host_, account_, date, upload == 0 ? "GET" : "PUT", quoted_filename, (unsigned long long) size), line_size)) { altlog_write(alloca_line); } if (quoted_filename != filename) { free(quoted_filename); } ALLOCA_FREE(alloca_line); return 0; } /* WuFTPd-like log format */ static int altlog_writexfer_xferlog(const int upload, const char * const filename, const off_t size, const double duration) { char date[sizeof "Mon Apr 13 12:34:56 1975"]; struct tm *tm; char *alloca_line; const char *host_ = *host != 0 ? host : "-"; const char *account_ = *account != 0 ? account : "-"; char *quoted_filename; size_t filename_idx; time_t now; size_t line_size; size_t filename_size; char c; if ((now = time(NULL)) == (time_t) -1 || (tm = localtime(&now)) == NULL || tm->tm_mon > 11 || tm->tm_mon < 0 || tm->tm_wday > 6 || tm->tm_wday < 0) { return -1; } if (SNCHECK(snprintf(date, sizeof date, "%s %s %02d %02d:%02d:%02d %d", week_days[tm->tm_wday], months[tm->tm_mon], tm->tm_mday, tm->tm_hour, tm->tm_min, tm->tm_sec, tm->tm_year + 1900), sizeof date)) { return -1; } if ((filename_idx = strlen(filename)) <= (size_t) 0U) { return -1; } filename_size = filename_idx + (size_t) 1U; if ((quoted_filename = ALLOCA(filename_size)) == NULL) { return -1; } quoted_filename[filename_idx] = 0; do { filename_idx--; c = filename[filename_idx]; if (isspace((unsigned char) c) || ISCTRLCODE(c)) { c = '_'; } quoted_filename[filename_idx] = c; } while (filename_idx > (size_t) 0U); line_size = (sizeof date - 1U) + (sizeof " " - 1U) + (size_t) 16U /* duration */ + (sizeof " " - 1U) + strlen(host_) + (sizeof " " - 1U) + (size_t) 20U /* size */ + (sizeof " " - 1U) + (filename_size - 1U) + (sizeof " " - 1U) + (size_t) 1U /* type */ + (sizeof " _ " - 1U) + (size_t) 1U /* direction */ + (sizeof " " - 1U) + (size_t) 1U /* anonymous */ + (sizeof " " - 1U) + strlen(account_) + (sizeof " ftp 1 * c\n" - 1U) + (size_t) 1U; if ((alloca_line = ALLOCA(line_size)) == NULL) { ALLOCA_FREE(quoted_filename); return -1; } if (!SNCHECK(snprintf(alloca_line, line_size, "%s %lu %s %llu %s %c _ %c %c %s ftp 1 * c\n", date, (unsigned long) (duration + 0.5), host_, (unsigned long long) size, quoted_filename, type == 1 ? 'a' : 'b', upload != 0 ? 'i' : 'o', loggedin != 0 ? 'r' : 'a', account_), line_size)) { altlog_write(alloca_line); } ALLOCA_FREE(quoted_filename); ALLOCA_FREE(alloca_line); return 0; } static int altlog_writexfer_w3c(const int upload, const char * const filename, const off_t size, const double duration) { /* *