Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <stdlib.h>
- #include <stdio.h>
- #include <unistd.h>
- #include <signal.h>
- #include "utils.h"
- #include "conn.h"
- #include <ctype.h>
- #define DIM_BUFFER 256
- volatile sig_atomic_t termina = 0;
- static void *clientFun();
- void gestioneSegnali();
- static void sigHandler();
- int main()
- {
- gestioneSegnali();
- int fdSkt;
- RETURN_SYSCALL(fdSkt, socket(AF_UNIX, SOCK_STREAM, 0), "Errore creazione socket - fdSkt")
- struct sockaddr_un sckAddr;
- strncpy(sckAddr.sun_path, SOCKNAME, MAXBACKLOG);
- sckAddr.sun_family = AF_UNIX;
- SYSCALL(bind(fdSkt, (struct sockaddr *) &sckAddr, sizeof(sckAddr)), "Errore bind - fdSkt")
- SYSCALL(listen(fdSkt, SOMAXCONN), "Errore listen - fdSkt")
- int fdSkt_com;
- while (termina == 0)
- {
- if((fdSkt_com = accept(fdSkt, NULL, 0)) == -1)
- {
- if(errno == EINTR)
- {
- continue;
- }
- else
- {
- perror("Errore: fdSkt_com = accept(fdSkt, NULL, 0)");
- exit(EXIT_FAILURE);
- }
- }
- pthread_t clientId;
- THREAD_CREATE(&clientId, NULL, &clientFun, (void *) &fdSkt_com, "Thread setId")
- SYSCALL_ZERO(pthread_detach(clientId) , "pthread_detach(&clientId)"); //lo chiedeva l'esercizio di usare la moditlià detached
- // SYSCALL_ZERO(pthread_join(clientId, NULL) , "pthread_detach(&clientId)"); //lo chiedeva l'esercizio di usare la moditlià detached
- }
- //chiusura file descriptor
- // SYSCALL(close(fdSkt_com), "Errore - close(fdSkt_com)")
- SYSCALL(close(fdSkt), "Errore - close(fdSkt)")
- puts("Termino");
- unlink(SOCKNAME);
- return 0;
- }
- static void sigHandler()
- {
- termina = 1;
- }
- void gestioneSegnali()
- {
- //i segnali da gestire vengono ignorati finché l'handler non è pronto
- sigset_t mask, oldmask;
- SYSCALL(sigemptyset(&mask), "Errore: sigemptyset(&mask)")
- SYSCALL(sigaddset(&mask, SIGINT), "Errore: sigaddset(&mask, SIGINT)")
- SYSCALL(sigaddset(&mask, SIGTERM), "Errore: sigaddset(&mask, SIGINT)")
- SYSCALL(sigaddset(&mask, SIGQUIT), "Errore: sigaddset(&mask, SIGINT)")
- SYSCALL(sigaddset(&mask, SIGHUP), "Errore: sigaddset(&mask, SIGINT)")
- //guardare su notion per capire cosa amettere come primo argomento
- SYSCALL_ZERO(pthread_sigmask(SIG_BLOCK, &mask, &oldmask), "Errore: Spthread_sigmask(SIG_BLOCK, &mask,&oldmask)")
- //GESTIONE SIGINT
- struct sigaction sigAct;
- memset(&sigAct, 0, sizeof(sigAct)); //inizializza a 0 sSigAction (il prof non fa nessun controllo su memset)
- sigAct.sa_handler = sigHandler; //registra l'handler
- SYSCALL(sigaction(SIGINT, &sigAct, NULL), "Errore sigaction(SIGINT, &sigAct, NULL)") //il 3 campo può essere != NULL
- SYSCALL(sigaction(SIGTERM, &sigAct, NULL), "Errore sigaction(SIGINT, &sigAct, NULL)") //il 3 campo può essere != NULL
- SYSCALL(sigaction(SIGQUIT, &sigAct, NULL), "Errore sigaction(SIGINT, &sigAct, NULL)") //il 3 campo può essere != NULL
- SYSCALL(sigaction(SIGHUP, &sigAct, NULL), "Errore sigaction(SIGINT, &sigAct, NULL)") //il 3 campo può essere != NULL
- //ripristino la maschera (se non lo facessi, non riusciarei a gestire i segnali con l'handler)
- SYSCALL_ZERO(pthread_sigmask(SIG_SETMASK, &oldmask, NULL), "Errore: Spthread_sigmask(SIG_BLOCK, &mask,&oldmask)")
- }
- static void *clientFun(void *fdSkt_comF)
- {
- int fdSkt_com = *((int *) fdSkt_comF);
- char buffer[DIM_BUFFER];
- memset(buffer, '\0', DIM_BUFFER);
- //"termina" is set to 1 by the signal handler when a signal arrives
- while (termina == 0)
- {
- int lenghtRead;
- RETURN_SYSCALL(lenghtRead, read(fdSkt_com, buffer, DIM_BUFFER), "Errore: read(fdSkt_com, buffer, DIM_BUFFER)")
- if(lenghtRead == 0)
- break;
- //lenghtRead conta tutti i caretteri letti (compreso il '\0' se è presente)
- for(int i = 0; i < lenghtRead-1; i++)
- {
- buffer[i] = toupper((unsigned char) buffer[i]);
- }
- SYSCALL(writen(fdSkt_com, buffer, lenghtRead), "writen(fdSkt_com, buffer, lengthBuffer)")
- }
- puts("Ciao");
- return NULL;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement