-
Notifications
You must be signed in to change notification settings - Fork 0
/
utils.c
147 lines (130 loc) · 4.13 KB
/
utils.c
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
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
#include "coldaemon.h"
void writelog(int log_fd, const char * mensaje)
{
pthread_mutex_lock(&lock);
write(log_fd, mensaje, strlen(mensaje));
pthread_mutex_unlock(&lock);
return;
}
void thread_add(struct thread_list **lista, int index)
{
if(*lista == NULL)
{
*lista = (struct thread_list *)malloc(sizeof(struct thread_list));
(*lista)->thread_index = index;
(*lista)->siguiente = NULL;
}else{
struct thread_list * temp = *lista;
while(temp->siguiente != NULL)
{
temp = temp->siguiente;
}
temp->siguiente = (struct thread_list *)malloc(sizeof(struct thread_list));
temp = temp->siguiente;
temp->thread_index = index;
temp->siguiente = NULL;
}
return;
}
pthread_t * thread_get(struct thread_list *lista, int index)
{
if(lista == NULL)
{
//syslog(LOG_ERR,"[CRITICAL ERROR]thread_list llega nulo!\n");
exit(NULL_THREAD);
}
do
{
if(index == lista->thread_index)
{
return &(lista->hilo);
}
}while(lista->siguiente != NULL && (lista = lista->siguiente) );
//syslog(LOG_ERR,"No existe el hilo buscado");
return NULL;
}
void thread_del(struct thread_list **lista, int index)
{
struct thread_list * temp = *lista;
struct thread_list * anterior = NULL;
if(*lista == NULL)
{
//syslog(LOG_ERR,"No se pueden borrar los hilos");
exit(NULL_THREAD);
}
do{
if(index == temp->thread_index)
{
if(anterior != NULL)
{
anterior->siguiente = temp->siguiente;
}else
{
*lista = temp->siguiente;
}
free(temp);
return;
}
anterior = temp;
}while(temp->siguiente != NULL && (temp = temp->siguiente));
//syslog(LOG_ERR,"No hay hilos ejecutandose\n");
return;
}
/*generador de hash de contrasenha recibe el char ingresado por teclado de la contrasenha y lo hashea retornando el long hash del pass*/
uint32_t hash( char * str)
{
//printf ("lk%s", &str);
uint32_t hash = 5381;
int c;
while (c = *str++)
hash = ((hash << 5) + hash) + c; /* hash * 33 + c */
// printf ("asdn%s", hash);
return hash;
}
/*recibe el puntero al archivo, el puntero al usuario y contrasenha a verificar*/
char authentication (char * acl_file, char * user, uint32_t pass_buscado)
{
char user1[50] = {'\0'};
char *tokenPtr;
char *pass_file;
int x = 0;
uint32_t pass1=0;
FILE * acl;
if( ( acl = fopen(acl_file,"r") ) == NULL)
{
syslog(LOG_ERR,"No se pudo abrir %s\n",acl_file);
return CANT_READ_ACL; //Código de error para "No se puede leer ACL"
}
strcpy(user1, "");//vacia la variable user1
fscanf(acl, "%s", user1);//lee una linea del archivo
pass_file=(strpbrk(user1, ":")+2);//extrae lo que encuentra depues de '::' pass
pass1 = atoi(pass_file);//convierte el pass string leido de archivo a long
while (memcmp(user1,user,x)!=0 && pass1!=pass_buscado && !feof(acl))
{/*si el usuario y la contrasenha no son iguales, y no es fin de archivo leer la siguiente linea del archivo acl*/
fscanf(acl, "%s", user1);
pass_file=(strpbrk(user1, ":")+2);//extrae de la linea user::pass lo que esta despues del :: "pass"
pass1 = atoi(pass_file);//convierte la cadena leida a long para luego comparar
}
/*int memcmp(const void *s1, const void *s2, size_t n);
Compara los primeros n caracteres del objeto apuntado por s1 (interpretado como
unsigned char) con los primeros n caracteres del objeto apuntado por s2 (interpretado
como unsigned char).Devuelve 0 en caso que sean iguales*/
tokenPtr= strtok(user1,"::");
if((pass_buscado==pass1 && strcmp(tokenPtr,user)) == 0)
{/*verifica si la variable registrada el final de recorrer la lista de archivos es igual al usuario y contrasenha buscados para la autenticacion*/
return OK;
}
else//si no es por que recorrio todo el archivo y no encontro coincidencias de user y pass
{
return INVALID_USER;
}
}//fin autenticacion
void limpiar_linea(char * cadena)
{
int i=0;
while(cadena[i] != '\n')
{
++i;
}
cadena[i] = '\0';
}