my_httpd.c File Reference

#include <sys/mman.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <sys/wait.h>
#include <sys/socket.h>
#include <fcntl.h>
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <stdlib.h>
#include <errno.h>
#include <stdarg.h>
#include <pthread.h>
#include <string.h>
#include <netdb.h>
#include <dirent.h>
#include <time.h>
#include <openssl/ssl.h>
#include <openssl/err.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <pwd.h>

Data Structures

struct  longLine
struct  multi_fd
struct  ta

Defines

#define MAXBUF   1024
#define LISTENQ   1024

Typedefs

typedef void Sigfunc (int)

Functions

int sizeOfLongLine (struct longLine *llPtr)
void my_perror (char *msg)
static void err_doit (int errnoflag, const char *fmt, va_list ap)
void err_sys (const char *fmt,...)
void err_quit (const char *fmt,...)
void write_std (int fd, void *ptr, size_t nbytes)
static void log_doit (int fd, const char *fmt, va_list ap)
void log_generic (int fd, const char *fmt,...)
char * joinLongLine (struct longLine *llPtr)
int multi_read (struct multi_fd my_fd, char *cptr, size_t size)
char * read_long_line_until (struct multi_fd my_fd, char *delimeter)
short int isDir (char *path)
char * make_message (const char *fmt,...)
void log_ssl_error (void)
int multi_write (struct multi_fd my_fd, char *str, int size)
int my_ls_generic (struct multi_fd my_fd, char *path)
int checkPerms (char *path)
void * Calloc (size_t n, size_t size)
char * getFilenameFromRequest (char *req, char *delimeter)
int my_send_file_generic (struct multi_fd my_fd, char *filename, char *http_version)
char * get_http_version_from_request (char *request)
int handle_client_generic (struct multi_fd my_fd, char *prefix, char *kind)
void ssl_err (void)
int handle_client_ssl (int fd, char *prefix)
int handle_client (int fd, char *prefix)
int Accept (int fd, struct sockaddr *sa, socklen_t *salenptr)
void Close (int fd)
void * thread_main_generic (void *arg, char *kind, int(*handlerFunc)(int, char *prefix), int sock)
void * thread_main (void *arg)
void * thread_main_ssl (void *arg)
void Pthread_create (pthread_t *tid, const pthread_attr_t *attr, void *(*func)(void *), void *arg)
void thread_make_generic (int numer_procesu, int me, void *(*func)(void *))
void thread_make (int numer_procesu, int me)
void thread_make_ssl (int numer_procesu, int me)
pid_t Fork (void)
void child_main_generic (int numer_procesu, char *kind, void(*func)(int, int))
Sigfuncsignal (int signo, Sigfunc *func)
Sigfuncset_signal (int signo, Sigfunc *func)
void handle_sigpipe (int signum)
void make_child (int numer_procesu, char *rodzaj, void(*func)(int, int), pid_t *array)
int Open (const char *pathname, int oflag, mode_t mode)
void sig_int (int signo)
void Setsockopt (int fd, int level, int optname, const void *optval, socklen_t optlen)
void Listen (int fd, int backlog)
int tcp_listen (const char *serv)
uid_t get_uid (char *name)
int open_log_file (char *path)
void log_files_init (void)
void usage ()
void ssl_initialize (void)
void make_children (void(*sub_func)(int, int), char *rodzaj, pid_t *array)
void write_pid (void)
void handle_sigchld (int signum)
int get_table_index_by_pid (pid_t pid, pid_t *table)
void recreate_specific_process (int index, char *table_name, char *kind, void(*thread_func)(int, int), pid_t *pids_array)
void recreate_process_by_dead_pid (pid_t dead_pid)
void recreate_children (void)
void check_for_sigchld (void)
int main (int argc, char **argv)

Variables

static pid_t * pids
static pid_t * pids_ssl
pid_t my_pid
int forks = 3
int threads = 4
int listenfd
int listenfd_ssl
int log_access_fd
int log_debug_fd
int log_main_fd
short int debug = 0
short int received_sigchld = 0
pthread_t * tptr
socklen_t addrlen
char * port_default = "80"
char * port_default_ssl = "443"
char * my_name = "my_httpd"
SSL_CTX * my_ssl_ctx

Define Documentation

#define LISTENQ   1024

#define MAXBUF   1024


Typedef Documentation

typedef void Sigfunc(int)


Function Documentation

int Accept ( int  fd,
struct sockaddr *  sa,
socklen_t *  salenptr 
)

Funkcja opakowująca accept().

void* Calloc ( size_t  n,
size_t  size 
)

Funkcja opakowująca calloc(). Kończy działanie programu w razie napotkania błędu.

void check_for_sigchld ( void   ) 

Sprawdza czy zmienna-flaga received_sigchld została ustawiona (ma wartość 1). Zmienna ta jest ustawiona przez funkcję obsługującą sygnał SIGCHLD. Jeśli tak, to na miejsce zabitych potomków tworzymy nowe.

int checkPerms ( char *  path  ) 

Katalog musi mieć ustawione R oraz X dla innych. Plik musi mieć ustawione R dla innych.

void child_main_generic ( int  numer_procesu,
char *  kind,
void(*)(int, int)  func 
)

Ogólna wersja głównej pętli procesu. Tworzy wątki obsługujące połączenia.

void Close ( int  fd  ) 

Funkcja opakowująca close(). W razie występienia błędu wyświetla komunikat i kończy działanie programu.

static void err_doit ( int  errnoflag,
const char *  fmt,
va_list  ap 
) [static]

Analizuje podane argumenty jako sformatowany tekst i wyświetla go na standardowym wyjściu błędu. Jeśli errnoflag jest ustawione na 1, to również wyświetla komunikat błędu na podstawie wartości zmiennej errno.

void err_quit ( const char *  fmt,
  ... 
)

Pobiera listę argumentów o zmiennej długości, która jest komunikatem w stylu printf() do wyświetlenia.

Parameters:
fmt Napis podany w formacie jak do printf().

void err_sys ( const char *  fmt,
  ... 
)

Wypisuje na standardowe wyjście błędu komunikat podany jako argument, potem komunikat błędu na podstawie zmiennej errno. Kończy działanie programu ze stanem błedu.

pid_t Fork ( void   ) 

Wywołuje fork(), jeśli wystąpił błąd, to wyświetla komunikat błędu i kończy pracę programu z kodem błędu.

char* get_http_version_from_request ( char *  request  ) 

Analizuje żądanie podane jako argument i zwraca wskaźnik do tablicy zawierającej wersję protokołu HTTP, którą posłużył się klient.

int get_table_index_by_pid ( pid_t  pid,
pid_t *  table 
)

Zwraca indeks pozycji na której znajduje się ten numer PID (jeśli został znaleziony). W razie niepowodzenia zwraca -1.

uid_t get_uid ( char *  name  ) 

Pobiera login użytkownika jako argument i zwraca jego UID jeśli istnieje.

char* getFilenameFromRequest ( char *  req,
char *  delimeter 
)

Zwraca wskaźnik na tablicę zawierającą nazwę pliku.

int handle_client ( int  fd,
char *  prefix 
)

Obsługuje klienta nieszyfrowanego. Wykorzystuje funkcję handle_client_generic().

int handle_client_generic ( struct multi_fd  my_fd,
char *  prefix,
char *  kind 
)

Uniwersalna funkcja obsługująca pojedyńcze żadanie klienta (zarówno szyfrowane jak i nieszyfrowane).

int handle_client_ssl ( int  fd,
char *  prefix 
)

Obsługuje klienta nieszyfrowanego. Wykorzystuje funkcję handle_client_generic().

void handle_sigchld ( int  signum  ) 

Funkcja obsługująca sygnał SIGCHLD. Ustawia wartość zmiennej received_sigchld na 1.

void handle_sigpipe ( int  signum  ) 

Funkcja obsługująca sygnal SIGPIPE. Loguje tylko informację o otrzmaniu sygnału.

short int isDir ( char *  path  ) 

Sprawdza czy podana ścieżka jest katalogiem.

char* joinLongLine ( struct longLine llPtr  ) 

Alokuje nową, ciągłą przestrzeń na docelową tablicę, kopiuje tam zawartość buforów z kolejnych struktur i zwraca adres tak utworzonej tablicy.

void Listen ( int  fd,
int  backlog 
)

Wywołuje listen() z podanymi argumentami i kończy pracę programu jeśli wystąpił błąd.

static void log_doit ( int  fd,
const char *  fmt,
va_list  ap 
) [static]

Przyjmuje jako argument deskryptor z otwartym plikiem logu. Zapisuje do niego komunikat podany jako kolejne argumenty. Komunikat poprzedza aktualną datą i czasem.

void log_files_init ( void   ) 

Otwiera wszystkie pliki z logami.

void log_generic ( int  fd,
const char *  fmt,
  ... 
)

Jeśli podany deskryptor jest logiem debug, to wykonuje logowanie tylko jeśli zmienna debug jest włączona.

void log_ssl_error ( void   ) 

Zapisuje w głównym logu komunikaty błędów SSL.

int main ( int  argc,
char **  argv 
)

Główna funkcja programu. Przyjmuje standardowe argumenty.

void make_child ( int  numer_procesu,
char *  rodzaj,
void(*)(int, int)  func,
pid_t *  array 
)

Wykonuje Fork() i tworzy proces potomny na podstawie podanych argumentów.

void make_children ( void(*)(int, int)  sub_func,
char *  rodzaj,
pid_t *  array 
)

Tworzy odpowiedni rodzaj potomków (szyfrowane bądź nie) zgodnie z podanymi argumentami.

char* make_message ( const char *  fmt,
  ... 
)

Alokuje sukcesywnie coraz większe tablice i zapisuje w nich napis podany jako argument. Jeśli napis sie zmieści, to zwraca adres tablicy.

int multi_read ( struct multi_fd  my_fd,
char *  cptr,
size_t  size 
)

Zależnie od zawartości uniwersalnego deskryptora używa read() bądź SSL_read() do odczytania danych. W razie napotkania błędu kończy działanie.

int multi_write ( struct multi_fd  my_fd,
char *  str,
int  size 
)

Zależnie od zawartości uniwersalnego deskryptora używa write() bądź SSL_write() do zapisania danych. W razie napotkania błędu kończy działanie.

int my_ls_generic ( struct multi_fd  my_fd,
char *  path 
)

Wypisuje do uniwersalengo deskryptora podanego jako pierwszy argument zawartość katalogu podanego jako drugi argument.

void my_perror ( char *  msg  ) 

Wywołuje perror() i wychodzi z programu.

int my_send_file_generic ( struct multi_fd  my_fd,
char *  filename,
char *  http_version 
)

Funkcja przyjmuje jako pierwszy argument uniwersalny deskryptor. Zapisuje do niego plik do którego ścieżka podana jest jako drugi argument.

int Open ( const char *  pathname,
int  oflag,
mode_t  mode 
)

Wywołuje open() z podanymi argymentami. Jeśli wystąpił błąd, to wyświetla komunikat i kończy pracę.

int open_log_file ( char *  path  ) 

Funkcja opakowująca do otwierania pliku z logiem.

void Pthread_create ( pthread_t *  tid,
const pthread_attr_t *  attr,
void *(*)(void *)  func,
void *  arg 
)

Wywołuje pthread_create() z podanymi argumentami. Jeśli wystąpił błąd, wyświetla odpowiedni komunikat i kończy działanie programu.

char* read_long_line_until ( struct multi_fd  my_fd,
char *  delimeter 
)

Czyta dane z deskryptora i zapisuje je do struktur długiej linii. Użytkownik wpisać podać teoretycznie dowolną ilość danych. Kończy w momencie napotkania separatora podanego jako drugi argument.

void recreate_children ( void   ) 

Za pomocą funkcji waitpid() sprawdza które z procesów potomnych zmieniły swój stan (zostaly zabite). Następnie je odtwarza.

void recreate_process_by_dead_pid ( pid_t  dead_pid  ) 

Pobiera numer PID zabitego procesu, przegląda listę zarejestrowanych procesów potomnych i na miejsce martwego potomka tworzy nowego.

void recreate_specific_process ( int  index,
char *  table_name,
char *  kind,
void(*)(int, int)  thread_func,
pid_t *  pids_array 
)

Odtwarza potomka nieszyfrowanego lub szyfrowanego w zależności od podanych argumentów.

Sigfunc* set_signal ( int  signo,
Sigfunc func 
)

Funkcja opakowująca do ustawiania funkcji obsługującej dany sygnał.

void Setsockopt ( int  fd,
int  level,
int  optname,
const void *  optval,
socklen_t  optlen 
)

Wywołuje setsockopt() z podanymi argumentami i kończy pracę programu jeśli wystąpił błąd.

void sig_int ( int  signo  ) 

Obsługa sygnału INT ([Ctrl]+[C] na klawiaturze).

Sigfunc* signal ( int  signo,
Sigfunc func 
)

Funkcja opakowująca sigaction().

int sizeOfLongLine ( struct longLine llPtr  ) 

Pobiera wskaźnik do struktury longLine i oblicza długość całej długiej linii.

void ssl_err ( void   ) 

Wyswietla komunikat bledu OpenSSL i wychodzi z programu z kodem bledu.

void ssl_initialize ( void   ) 

Przygotowuje do użycia bibliotekę OpenSSL.

int tcp_listen ( const char *  serv  ) 

Funkcja opakowująca. Tworzy gniazdo nasłuchujące na porcie usługi podanej jako argument w postaci napisu.

void* thread_main ( void *  arg  ) 

Wywołuje thread_main_generic() z argumentami charakterystycznymi dla wątku nieszyfrowanego.

void* thread_main_generic ( void *  arg,
char *  kind,
int(*)(int, char *prefix)  handlerFunc,
int  sock 
)

Ogólna wersja głównej funkcji wątku (dla serwera obsługującego połączenia szyfrowane oraz dla serwera obsługującego połączenia nieszyfrowane).

void* thread_main_ssl ( void *  arg  ) 

Wywołuje thread_main_generic() z argumentami charakterystycznymi dla wątku SSL.

void thread_make ( int  numer_procesu,
int  me 
)

Wywołuje thread_make_generic() z argumentami odpowiednimi dla wątku obsługującego połączenia nieszyfrowane.

void thread_make_generic ( int  numer_procesu,
int  me,
void *(*)(void *)  func 
)

Przyjmuje jako jeden z argumentów wskaźnik do funkcji, którą ma wykonywać utworzony wątek.

void thread_make_ssl ( int  numer_procesu,
int  me 
)

Wywołuje thread_make_generic() z argumentami odpowiednimi dla wątku obsługującego połączenia SSL.

void usage (  ) 

Wyświetla instrukcję użycia programu i kończy działanie programu z kodem błędu.

void write_pid ( void   ) 

Zapisuje PID serwera w pliku na dysku.

void write_std ( int  fd,
void *  ptr,
size_t  nbytes 
)

Przyjmuje takie same argumenty jak write(). Wywołuje z nimi write() i w razie napotkania błędu kończy działanie programu wyświetlając odpowiedni komunikat.


Variable Documentation

socklen_t addrlen

short int debug = 0

int forks = 3

int listenfd

Deskryptory plików oraz gniazd.

int listenfd_ssl

int log_access_fd

int log_debug_fd

int log_main_fd

char * my_name = "my_httpd"

pid_t my_pid

PID bieżącego procesu.

SSL_CTX* my_ssl_ctx

Kontekst SSL.

pid_t* pids [static]

Tablice na PID-y potomków szyfrowanych i nie szyfrowanych.

pid_t * pids_ssl [static]

char* port_default = "80"

char * port_default_ssl = "443"

short int received_sigchld = 0

int threads = 4

Ilość potomków i wątków.

pthread_t* tptr


Generated on Wed Jul 4 20:39:39 2007 for my_httpd by  doxygen 1.5.2