Dokumentace pro všechny soubory

Konstanty | Proměnné | Funkce

Konstanty (12)

JménoHodnotaDokumentace
BUFFER_GRANULARITY4096granularita bufferu, musi byt mocnina dvou
DEFAULT_CONFIG_FILE"/etc/sp_proxy.conf"defaultni cesta ke konfiguracnimu souboru
DEFAULT_POP3_PORT110defaultni POP3 proxy port
DEFAULT_SMTP_PORT25defaultni SMTP proxy port
INADDR_NONE0xffffffffkonstanta pro nedefinovanou adresu (-1)
_vsnprintfvsnprintfalias pro funkci
_vsnprintfvsnprintfalias pro funkci
debug_printfprintfUNDOCUMENTED!
stricmpstrcasecmpalias pro funkci
stricmpstrcasecmpalias pro funkci
strnicmpstrncasecmpalias pro funkci
strnicmpstrncasecmpalias pro funkci

Proměnné (63)

JménoTypPočáteční hodnotaDokumentace
a_sizeint?alokovana velikost
a_sizeint?alokovana velikost
active*config?aktivni konfigurace [EXT]
begin*char?zacatek
begin*char?zacatek
blacklist*tree?blacklistovane emaily/domeny
blacklist*tree?blacklistovane emaily/domeny
blacklist_levelint?uroven na jakou se nastavi hodnota emailu s odelilatelem v blacklistu
blacklist_levelint?uroven na jakou se nastavi hodnota emailu s odelilatelem v blacklistu
blacklistfile*char?soubor s blacklistem
blacklistfile*char?soubor s blacklistem
buf*char?buffer na data
buf*char?buffer na data
cfg_lockpthread_mutex_t?lock na manipulace s configem
configfile*char?jmeno aktualniho konfiguracniho souboru [EXT]
curr*char?aktualni pozice
curr*char?aktualni pozice
func*threadfunc?funkce pro thread
leftint?kolik bajtu zbyva;
leftint?kolik bajtu zbyva;
maxint?minimalni priorita zporavy pro spusteni tohohle programmu
maxint?minimalni priorita zporavy pro spusteni tohohle programmu
minint?minimalni priorita zporavy pro spusteni tohohle programu
minint?minimalni priorita zporavy pro spusteni tohohle programu
name*char?jmeno
name*char?jmeno
numint?pocet prvku tohoto (pod)stromu
numint?pocet prvku tohoto (pod)stromu
p_class*char?program na klasifikaci emailu
p_class*char?program na klasifikaci emailu
p_postact*priority_list?programy spoustene na zpravy
p_postact*priority_list?programy spoustene na zpravy
p_postfilt*priority_list?program na eventuelni zmenu vysledne zpravy
p_postfilt*priority_list?program na eventuelni zmenu vysledne zpravy
p_prefilt*priority_list?program na predzpracovani zpravy
p_prefilt*priority_list?program na predzpracovani zpravy
pop3_portint?POP3 port
pop3_portint?POP3 port
pop3sint?socket na POP3
prog*char?program ke spusteni
prog*char?program ke spusteni
refcountint?citac pouziti -> kdyz je na 0, zlikviduje se
refcountint?citac pouziti -> kdyz je na 0, zlikviduje se
remotesmtp*char?vzdaleny SMTP host, kam jsou mail preposilany
remotesmtp*char?vzdaleny SMTP host, kam jsou mail preposilany
sizeint?bajtu v bufferu
sizeint?bajtu v bufferu
smtp_portint?SMTP port
smtp_portint?SMTP port
smtpsint?socket na SMTP
sockint?socket pro thread
subject_mark*priority_list?oznacovani subjektu
subject_mark*priority_list?oznacovani subjektu
val*void?hodnota
val*void?hodnota
valid_charchar[256]?platne znaky v emailu
whitelist*tree?whitelistovane emaily/domeny
whitelist*tree?whitelistovane emaily/domeny
whitelist_levelint?uroven na jakou se nastavi hodnota emailu s odelilatelem ve whitelistu
whitelist_levelint?uroven na jakou se nastavi hodnota emailu s odelilatelem ve whitelistu
whitelist_lockpthread_mutex_t?lock na zmenu whitelistu
whitelistfile*char?soubor s blacklistem
whitelistfile*char?soubor s blacklistem

Funkce (95)

ModifikátorJménoParametryDokumentace
voidadd_to_whitelist(config *cfg,const char *line)zapise adresu do whitelistu
char *b_strncpy(char *dest,const char *source, size_t count)jako strncpy, ale posledni znak vzdy nastavi na NULL
voidbuf_add(charbuffer *b,const char *data,int datalen)prida do bufferu data
voidbuf_addline(charbuffer *b,const char *line)prida do buffer radku line + znaky CR a LF
char *buf_firstline(charbuffer *b)vrati a radku ukoncenou CRLF, LF, CR nebo koncem bufferu z bufferu, nebo NULL pokud je buffer prazdny.
Radku z bufferu neostrani, buffer zustane nezmenen
voidbuf_free(charbuffer *b)uvolni pamet zabranou bufferem
char *buf_getline(charbuffer *b)vrati a odstrani radky ukoncenou CRLF z bufferu, nebo NULL pokud tam takova radka neni
voidbuf_init(charbuffer *b,int size)inicializuje promennou na defaultni hodnoty + naalokuje pocatecni buffer
voidbuf_realloc(charbuffer *b,int minsize)realokuje buffer na velikost alespon minsize bajtu. Pokud je buffer uz dostatecne velky, nedela nic
intchkerror(char *action,int retcode)pokud retcode je -1, vypise perror s parametrem action a ukonci program
typicke pouziti: chkerror("popis chyby",syscall_co_vraci_-1_pri_chybe(...));
voidconfig_mutex_lock()zamkne konfiguraci pro modifikace
voidconfig_mutex_lock_init()inicializace zamku
voidconfig_mutex_unlock()odemkne konfiguraci pro modifikace
intconnect_string(const char *host,int def_port)priconnecti se na adresu ve tvaru (hostname|adresa)(:port)?
def_port se pouzije, pokud port neni zadan
intemail_in_list(tree *list,const char *email)vraci 1 pokud je email v seznamu list, jinak 0
intempty(const char *a)vrati 1 pokud je retezec NULL nebo prazdny
inteq(const char *a,const char *b)vrati 1 pokud se retezce rovnaji
inteqi(const char *a,const char *b)vrati 1 pokud se retezce rovnaji (case insensitive)
voidfatal(char *s)vyskoci s chybovou hlaskou. Dobre k debugovani
voidfatalf(char *fmt,...)jako fatal(), ale s formatovanym retezcem jako u printf
voidfree_config(config *c)uvolni konfiguracni strukturu z pameti
voidfreetoken(text_token *t)uvolni token z pameti, vcetne jeho vnitrku, tedy dat, ze kterych byl token vytvoren
intfsize(const char *f)vrati velikost souboru
const char *get_cmd_param(const char *cmd,const char *input)otestuje jestli vstup input zacina na cmd a vrati
odkaz na prvni nemezerovy znak za prikazem cmd, nebo NULL, pokud to neni spravny prikaz
inthave_char(char c,char *buf,int len)vraci true, je li znak v bufferu
voidinit_config(int argc,char **argv)nahraje konfiguracni soubor a pak ho (eventuelne) upravi podle commandline parametru
intis_canonical_email(const char *string,int s_len)vraci true, pokud podretezec retezce string delky strlen je email fe formatu user@domena
voidline_checkwhitelist(config *cfg,char *line)ZKONTROLUJE jestli radka neobsahuje ^RCPT TO:(.*)$
a pokud ano, prida \1 do whitelistu
config *load_config(char *filename)nahraje konfiguraci ze souboru file
intloadfile(void **out,const char *name)nahraje soubor do pameti, vrati velikost
tree *loadlist(char *filename)nahraje do stromu vsechny radky ze souboru krome komentaru.
Pripousti se, ze soubor neexistuje
config *lock_config(config *c)zvysi refcount
config *lock_config_int(config *c)zvysi refcount (bez zamykani)
voidlog_error()posle do logu chybovou hlasku podle kodu v ERRNO
voidlog_init()inicializuje logovani hlasek
voidlog_message(int priority,const char *err)zaloguje hlasky. Typicky do syslogu, ale pri debugovani i na STDOUT
voidlog_messagef(int priority, const char *fmt,...)jako log_message(), ale s formatovanym retezcem jako u printf
intmain(int argc,char **argv)main - hlavni funkce programu
voidmain_rebind(int change_smtp,int change_pop3)zmeni sockety, pokud je po zmene konfigurace nuntno naslouchat na jinych portech
voidmake_vch_table()inicializuje tabulku valid_char
void *malloc0(size_t t)naalokuje pamet. Pamet je vyplnena nulama
void *malloc1(size_t t)naalokuje pamet. Selhani neni povoleno (pri nedostatku pameti program konci s chybovou hlaskou)
voidmessage_dots(charbuffer *b,int cnt)Escape na tecky v smtp komunikaci
cnt==-1: z .. na jednom radku udela .
cnt==+1: z . na jednom radku udela ..
intnet_listen(int port)zacne naslouchat na portu [port], vrati socket
voidnet_thread(thread_rec *t)wrapper kolem funkce socketu. Funkce (vnitrni) po sobe socket nezvira, to dela tato funkce
voidnet_thread_run(thread_rec t)spusti sitovy thread s danou funkcin a socketem
intopen_connection(const char *host,int port)otevre konexi na dany host a port, vrati socket nebo -1 pokud chyba
char *parse_email(const char *email)rozparsuje email z formatu typu "neco"
a podobnych na normalizovany tvar user@domena
intpipe_filter(charbuffer *msg,charbuffer *msg_out,pid_t pid,int h_in,int h_out)zapise obsah msg do h_in, zaroven vyzvedne obsah z h_out do
bufferu msg_out, a po ukonceni procesu pid vrati jeho navratovou hodnotu
voidplist_add(priority_list **p,char *cfg_line)do prioritniho seznamu prida zaznam z konfiguraku (format "LOW-HIGH PROGRAM"/"PRIO PROGRAM")
voidplist_add_num(priority_list **p,int lo, int hi, char *prog)do prioritniho seznamu prida zaznam z konfiguraku (LOW,HIGH,PROGRAM)
voidplist_free(priority_list *p)odalokuje spojak s programy spoustenymi dle priorit
intpop3_handler(int s,config *cfg)POP3 socket handler
intport_from_string(const char *port)prevede port na cislo
longresolve(const char *name)pro dany host vrati jeho IPV4 adresu
intrun_classificator(charbuffer *b_message,const char *prog)na zpravu spusti klasifikator dle nastaveni a vrati hodnotu zpravy
voidrun_pipe(const char *prog, int *h_in,int *h_out,pid_t *pid)spusti program a k nemu oboustrannou pipe - vrati handle na zapis do programu (h_in) a handle na cteni programu (h_out)
Vrati tez pid child procesu (aby se dalo cekat pres waitpid, az vypise vsechen vystup)
voidrun_postaction(charbuffer *b_message,priority_list *filt,int state)na zpravu spusti programy postaction dle nastaveni
voidrun_postfilter(charbuffer *b_message,priority_list *filt,int state)na zpravu spusti programy postfilter dle nastaveni
charbufferrun_prefilter(charbuffer *b_message,priority_list *filt)spusti na zpravy b_message prefilter, vrati prefiltrovanou zpravu
intrun_prog(charbuffer *msg,const char *prog,programtype pt)spusti program, msg je buffer, ktery obsahuje vstupni zpravu, pokud pt je
pt_subjectmark, nebo pt_filter, bude nahrazena vystupni zpravou
voidrun_programlist(charbuffer *msg,priority_list *filt,int state,programtype pt)spusti vsechny programy postupne v jejich poradi ze seznamu list
na zpravu msg, programy dostanou parametry state a pt
voidrun_subjmark(charbuffer *b_message,priority_list *filt,int state)na zpravu spusti znackovac Subjectu dle nastaveni
intsend_all(int sock,const void *buf,size_t buf_bytes,int flags)stejne jako send, az na to, ze se send_all pokusi prostlacit vzdy celou zpravu
(pokud send vrati ze byla poslana pouze cast zpravy, send_all pokracuje pustenim send na zbytek)
voidsend_line(int s,char *str)posle retezec + CRLF na socket
voidsend_linef(int sock,char *fmt,...)jako send_line(), ale s formatovanym retezcem jako u printf
voidset_nonblock(int fd)Nastavi non-blocking na file deskriptor
voidsighup_handler(int sig)sighup handler: reload config
intsmtp_handler(int s,config *cfg)
SMTP proxy - start double pipe, pass input/output unchanged, if input is
^RCPT TO:(.*)$
then add $1 to whitelist (maybe: only if 250 response code received)
if input is DATA, then wait for .
char *socket_getline(charbuffer *b, int sock)nacte radku ze socketu, zbyle znaky (za koncem radky)
vrati do bufferu, pokud je radka jiz v bufferu, nic nenacita.
Pri uzavreni spojeni vraci NULL
intstr_beginwithi(const char *s1,const char *s2)vrati 1 pokud retezec s2 zacina retezcem s1 (case insensitive), jinak 0
voidstr_free(char *s)odalokace retezce s kontrolou na NULL pointery
text_tokentoken_create(void *source,int size)vytvori z danych dat parsovatelny token
inttoken_loadbinary(text_token *t,void *i,int s)nacte z tokenu kus binarnich dat
inttoken_readchar(text_token *t,char c)nacte znak z tokenu a odstrani ho. Vraci 1 pri uspechu, 0 pri chybe (je tam jiny znak, nebo tam neni zadny)
inttoken_readfloat(text_token *t,double *f)nacte z tokenu jeden float
inttoken_readint(text_token *t,int *f)nacte z tokenu jeden integer
inttoken_readkv_sep(text_token *t,char **key,char **value,char separator)ze zacatku tokenu nacte a odstrani zaznam ve formatu key=value.
Misto = lze pouzit i jiny separator
POZOR! dealokovat se musi jenom key, nikdy ne value, nebot to je jeden buffer
char *token_readline(text_token *t)nacte z tokenu jednu neprazdnou radku
char *token_readqstring(text_token *t)nacte retezec v uvozovkach z tokenu
char *token_readstring(text_token *t)nacte retezec z tokenu (znaky az do prvni whitespace nebo konce radky)
voidtoken_remove_rest_of_line(text_token *t)preskoci vse v tokenu az do konce radky
voidtoken_skip_trash(text_token *t)preskoci vsechny whitespacy a pokud narazi na komentar, tak i ten
voidtree_add(tree **t,const char *name,void *val1)prida do stromu polozku se jmenem name a hodnovou val1, pokud je jiz obsazena, neprida nic (a pokud je zapnuty debug tak rovnou fatalne spadne)
inttree_count(tree *t)vrati pocet prvku stromu
inttree_del(tree **t,const char *name)odstrani ze stormu polozku name
1 - polozka byla odstranena
0 - polozka tam nebyla
void *tree_delv(tree **t,const char *name)odstrani ze stormu polozku name a vrati ji (nebo NULL, pokud tam neni)
1 - polozka byla odstranena
0 - polozka tam nebyla
tree *tree_dup(const tree *t)zduplikuje dany strom - vytvori novou kopii
const tree *tree_element(const tree *t,int i)vytahne ze stromu ukazatel na list s prvek s cislem i (i je mezi 0 a (poctem prvku ve stromu -1)
Da se pouzit napr. pro prochazeni cleeho stropu, ackoliv tree_foreach / tree_foreach_p muze byt vhodnejsi
Pokud nastane chyba nebo je prvek mimo rozsah, vrati NULL
voidtree_foreach(tree *t,tree_func *f)zavola funkci na kazdy prvek stromu
voidtree_foreach_p(tree *t,tree_func_p *f,void *param)zavola funkci na kazdy prvek stromu (s extra parametrem)
voidtree_free(tree *t)odalokuje strom z pameti
void *tree_search(const tree *t,const char *name)prohleda strom jestli obsahuje polozku name a vrati ji, pokud neobsahuje, vraci 0
voidunlock_config(config *c)snizi refcount, eventuelne zlikviduje strukturu
voidunlock_config_int(config *c)snizi refcount, eventuelne zlikviduje strukturu (bez zamykani)

Dokumentace z 29.01.2004 01:50:02