⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dynamic.c

📁 功能强大的ftp服务器源代码
💻 C
字号:
#include <config.h>#ifndef NO_STANDALONE/* Yes, I know, I could have used multi-hashed linked lists,  * binary trees and other funny stuff. It'd have been better, cleaner, * faster. Yeah, it'd have added many lines of complicated source code * to win 1/100000 sec on system with more than 500 sim users. * Great win, but sorry, I won't do that just to please theorical * algorithms wizards. -Jedi. */# include "ftpd.h"# include "dynamic.h"# include "ftpwho-update.h"# include "globals.h"# ifdef WITH_DMALLOC#  include <dmalloc.h># endifstatic 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(iptrack_list[c].ip) == STORAGE_SIN_ADDR(*ip)) {                return c;            } else if (STORAGE_FAMILY(iptrack_list[c].ip) == AF_INET6 &&                       IN6_ARE_ADDR_EQUAL                       (&STORAGE_SIN_ADDR6_NF(iptrack_list[c].ip),                        &STORAGE_SIN_ADDR6_NF(*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(iptrack_list[c].ip) == STORAGE_SIN_ADDR(*ip)) {                nb++;            } else if (STORAGE_FAMILY(iptrack_list[c].ip) == AF_INET6 &&                       IN6_ARE_ADDR_EQUAL                       (&STORAGE_SIN_ADDR6_NF(iptrack_list[c].ip),                        &STORAGE_SIN_ADDR6_NF(*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;}#elseextern signed char v6ready;#endif

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -