PDA

View Full Version : [C] Permessi di root su demone


Manugal
13-03-2010, 17:14
Ciao a tutti!

Sto programmando un mail server sotto Linux. Nel momento in cui vado a fare la bind() sulla porta 110 mi ritorna l'errore Permission Denied. Leggendo su vari thread ho scoperto che per le porte sotto la 1024 bisogna essere root (però su Windows questo non accade, infatti la bind() funziona normalmente anche sulla porta 110). Ora siccome ho creato un demone per eseguire l'intero mail server, vorrei capire se c'è la possibilità di fare il bind di questa porta (ho letto che bisognerebbe mettere il demone sotto /etc/init.d ma non ho capito bene cosa devo fare).

Edit: Questo è il codice con il quale configuro i socket:


void setMTSocket()
{
#ifdef _WIN32
WSADATA WSStartData;
if(WSAStartup(MAKEWORD (2,2), &WSStartData) != 0)
PrintError("Can't support WinSock v2.2: ");
#endif
struct sockaddr_in POP3SAddr;
memset(&POP3SAddr,0,sizeof(POP3SAddr));
POP3Socket = socket(PF_INET,SOCK_STREAM,0);
if(POP3Socket == INVALID_SOCKET)
PrintError("Failed POP3 socket() call: ");
POP3SAddr.sin_family = AF_INET;
POP3SAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
POP3SAddr.sin_port = htons((uint16_t) cfgParams->POP3Port);
if(bind(POP3Socket,(struct sockaddr *)&POP3SAddr,sizeof(struct sockaddr_in)) == SOCKET_ERROR)
PrintError("Failed POP3 bind() call: ");
if (listen(POP3Socket,cfgParams->numOfThrds) != 0)
PrintError("Failed POP3 listen() call: ");
struct sockaddr_in SMTPSAddr;
memset(&SMTPSAddr,0,sizeof(SMTPSAddr));
SMTPSocket = socket(PF_INET,SOCK_STREAM,0);
if(SMTPSocket == INVALID_SOCKET)
PrintError("Failed SMTP socket() call: ");
SMTPSAddr.sin_family = AF_INET;
SMTPSAddr.sin_addr.s_addr = inet_addr("127.0.0.1");
SMTPSAddr.sin_port = htons((uint16_t) cfgParams->SMTPPort);
if(bind(SMTPSocket,(struct sockaddr *)&SMTPSAddr,sizeof(struct sockaddr_in)) == SOCKET_ERROR)
PrintError("Failed SMTP bind() call: ");
if(listen(SMTPSocket,cfgParams->numOfThrds) != 0)
PrintError("Failed SMTP listen() call: ");
return;
}

DanieleC88
13-03-2010, 23:31
Per fargli avere i diritti del superutente puoi avviarlo dal profilo di root (cosa che generalmente fai solo all'avvio, tramite l'/etc/init.d che ti è stato consigliato, anche se non è una cosa che funziona su tutte le distrubuzioni, quindi te lo sconsiglio), o magari impostare al programma il bit setuid (http://it.wikipedia.org/wiki/Setuid#File_eseguibli), che probabilmente è meglio per ciò che devi farci.

ciao ;)

cionci
14-03-2010, 12:20
Puoi tranquillamente avviarlo da una shell di root ;)

Tra l'altro per fare i test, potresti anche fare il bind su una porta diversa dalla 110.

Manugal
14-03-2010, 12:21
Grazie. Ho provato a impostare il bit setuid tramite il comando chmod +s , ma mi da sempre Permission denied. :(

Manugal
14-03-2010, 13:05
Si posso avviarlo tramite una shell di root, però non lo so, con tutto il rispetto, mi sembra una soluzione poco elegante :)

cionci
14-03-2010, 13:07
Veramente alla fine è quello che succede quando il demone viene eseguito ;)

Manugal
14-03-2010, 13:10
Ah ecco :D

Ok allora mi sa proprio che non ci sbatterò la testa più di tanto e lo avvierò così. Grazie. ;)