Bonjour.
Je suis en train de faire un serveur qui doit être capable de gere plusieurs connexion en même temps.
Je souhaite que ce serveur soit lancé par le " super-utilisateur " pour qu'il puisse lise son fichier de configuration, et attende la connexion d'un client.
Puis dès la connexion d'un client prenne les droits d'un utilisateur créer pour l'ocasion et se chroot dans son " home directory ".
J'avais commencé par utiliser des threads.
Mon souci est que des que je " chroot() " un thread, lors de la connexion d'un autre client le serveur est déja chrooté et ne peux donc pas authentifier le client.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68 #define THREAD_TYPE pthread_t #define THREAD_CREATION(tid, fonction, argument) pthread_create(&(tid), thread_attributes, \ (fonction), (argument)) int main(int argc, char *argv[]) { BIO *acc, *client; SSL *ssl; SSL_CTX *ctx; THREAD_TYPE tid; struct passwd *pwd; pthread_attr_t *thread_attributes; config_t *config = parse_args (argc, argv); lire_config( config->param1 ); chdir ( Getenv("CONF_PATH") ); init_OpenSSL( ); seed_prng( ); ctx = setup_server_ctx( ); acc = BIO_new_accept(PORT); if (!acc) { int_error("ERREUR CR�TION SOCKET"); } if (BIO_do_accept(acc) <= 0) { int_error("ERREUR BINDING SERVEUR"); } for (;;) { if (NULL == (thread_attributes = malloc (sizeof *thread_attributes))) { fprintf (stderr, "Problème avec malloc()\n"); exit (EXIT_FAILURE); } if (0 != pthread_attr_init (thread_attributes)) { fprintf (stderr, "Problème avec pthread_attr_init()\n"); free (thread_attributes); exit (EXIT_FAILURE); } if (0 != pthread_attr_setdetachstate (thread_attributes, PTHREAD_CREATE_DETACHED)) { fprintf (stderr, "Problème avec pthread_attr_setdetachstate()\n"); free (thread_attributes); exit (EXIT_FAILURE); } if (BIO_do_accept(acc) <= 0) log_fct(0 ,"ERREUR av ACCEPT"); client = BIO_pop(acc); if (!(ssl = SSL_new(ctx))) log_fct(0 ,"ERREUR CR�TION SSL CONTEXT"); SSL_set_accept_state(ssl); SSL_set_bio(ssl, client, client); THREAD_CREATION(tid, (void *)server_thread, ssl); pthread_attr_destroy (thread_attributes); } SSL_CTX_free(ctx); BIO_free(acc); return 0; }
Puis-je de cette manière arriver à ce que je veux avec une méthode/fonction ? Ou alors est-ce que je dois obligatoirement utiliser la fonction " fork() " d'une manière similaire a celle-ci ?
Voila
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53 int main(int argc, char *argv[]) { BIO *acc, *client; SSL *ssl; SSL_CTX *ctx; struct passwd *pwd; config_t *config = parse_args (argc, argv); lire_config( config->param1 ); chdir ( Getenv("CONF_PATH") ); init_OpenSSL( ); seed_prng( ); ctx = setup_server_ctx( ); acc = BIO_new_accept(PORT); if (!acc) { int_error("ERREUR CR�TION SOCKET"); } if (BIO_do_accept(acc) <= 0) { int_error("ERREUR BINDING SERVEUR"); } for (;;) { if (BIO_do_accept(acc) <= 0) log_fct(0 ,"ERREUR av ACCEPT"); client = BIO_pop(acc); if (!(ssl = SSL_new(ctx))) log_fct(0 ,"ERREUR CR�TION SSL CONTEXT"); SSL_set_accept_state(ssl); SSL_set_bio(ssl, client, client); /* Utilisation du fork */ if (( pid = fork()) < 0) { exit (EXIT_AILURE); } if ( pid == 0 ) fonction_externe(ssl); else { SSL_CTX_free(ctx); BIO_free(acc); } } return 0;
Partager