PageRenderTime 48ms CodeModel.GetById 13ms RepoModel.GetById 0ms app.codeStats 1ms

/main.c

https://bitbucket.org/jhg/sav-pfsense-gtkdesarrollo
C | 1110 lines | 703 code | 56 blank | 351 comment | 83 complexity | 9eb4fb287edea86e9680829cba42a57c MD5 | raw file
  1. /*
  2. Sav-pfsense (C) 2011 Jesús Hernández Gormaz
  3. This program is free software; you can redistribute it and/or modify it under
  4. the terms of the GNU General Public License as published by the Free Software
  5. Foundation; either version 3, or (at your option) any later version.
  6. This program is distributed in the hope that it will be useful, but WITHOUT ANY
  7. WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
  8. PARTICULAR PURPOSE. See the GNU General Public License for more details.
  9. You should have received a copy of the GNU General Public License along with
  10. this program; if not, write to the Free Software Foundation, Inc., 675 Mass Ave,
  11. Cambridge, MA 02139, USA.
  12. Este programa es software libre. Puede redistribuirlo y/o modificarlo bajo los
  13. términos de la Licencia Pública General de GNU según es publicada por la Free
  14. Software Foundation, bien de la versión 3 de dicha Licencia o bien (según su
  15. elección) de cualquier versión posterior.
  16. Este programa se distribuye con la esperanza de que sea útil, pero SIN NINGUNA
  17. GARANTÍA, incluso sin la garantía MERCANTIL implícita o sin garantizar la
  18. CONVENIENCIA PARA UN PROPÓSITO PARTICULAR. Para más detalles, véase la Licencia
  19. Pública General de GNU.
  20. Debería haber recibido una copia de la Licencia Pública General junto con este
  21. programa. En caso contrario, escriba a la Free Software Foundation, Inc., en 675
  22. Mass Ave, Cambridge, MA 02139, EEUU.
  23. */
  24. #include <stdio.h>
  25. #include <string.h>
  26. #include <stdlib.h>
  27. #include <gtk/gtk.h>
  28. #include "main.h"
  29. /*Entrar al portal de configuración de Pfsense y obtener una cookie de sesion,
  30. devuelve 0 si todo fue bien, usa wget*/
  31. int obtener_sesion_wget (char *ip);
  32. /*Validarse con un usuario y clave*/
  33. int validar_usuario_wget (char *ip, char *usuario, char *clave);
  34. /*Descarga el rollo de vouchers indicado*/
  35. int descargar_vouchers_wget (char *ip, unsigned int id, char *usuario, char *clave);
  36. /*Formatear vouchers descargados*/
  37. int formatear_vouchers (int id);
  38. /*Muestra un voucher y lo marca como usado, devuelve -1 en caso de que no queden
  39. vouchers*/
  40. int obtener_voucher (int rollo, char *voucher);
  41. /*Elimina un rollo de vouchers*/
  42. int eliminar_vouchers_wget (char *ip, unsigned int rollo, char *usuario, char *clave);
  43. /*Obtiene un campo oculto del formulario para crear vouchers*/
  44. int obtener_sid_wget (char *ip, char *sid);
  45. /*Crea el numero de rollo de vouchers indicado, indicando los minutos de
  46. duración, el numero de vouchers y un comentario*/
  47. int crear_vouchers_wget (char *ip, unsigned int rollo, unsigned int minutos,
  48. unsigned int numerovouchers, char *comentario,
  49. char *usuario, char *clave);
  50. /*Codifica la cadena segun la codificación URL*/
  51. int codificacion_url (char *cadena);
  52. /*Carga la lista local de rollos disponibles y devuelve el puntero al primer
  53. elemento o NULL si la lista esta vacia*/
  54. listarollos *cargar_lista_local_rollos ();
  55. /*Guarda la lista local de rollos*/
  56. int guardar_lista_local_rollos (listarollos *primero);
  57. /*Agregar un rollo a la lista de rollos, colocandolo en ultimo lugar*/
  58. int agregar_rollo_lista (listarollos **lista, unsigned int rollo, unsigned int minutos, unsigned int numerovouchers, char *comentario);
  59. /*Libera la memoria de la lista de rollos*/
  60. int liberar_lista_rollos (listarollos *primero);
  61. /*Asigna a id la posición en lista del rollo indicado, devuelve -1 si no existe*/
  62. int buscar_id_rollo (listarollos *primero, unsigned int rollo, unsigned int *id);
  63. /*Eliminar un rollo de la lista de rollos*/
  64. int eliminar_rollo_lista (listarollos **lista, unsigned int rollo);
  65. /*Muestra la ventana de configuracion*/
  66. void mostrar_configurar_ip_usuario_clave ();
  67. /*Se ejecuta al hacer click en aceptar en la ventana de configuracion*/
  68. void configurar_ip_usuario_clave (GtkButton *button, gpointer data);
  69. /*Muestra la ventana de peticion de la clave*/
  70. void mostrar_pedir_clave ();
  71. /*Se ejecuta al hacer click en aceptar en la ventana de pedir la clave*/
  72. void obtener_clave_introducida (GtkButton *button, gpointer data);
  73. /*Muestra la ventana de peticion de la clave*/
  74. void mostrar_crear_rollo ();
  75. /*Se ejecuta al hacer click en aceptar en la ventana de pedir la clave*/
  76. void obtener_crear_rollo (GtkButton *button, gpointer data);
  77. /*Muestra la ventana de peticion de la clave*/
  78. void mostrar_voucher_gtk ();
  79. /*Se ejecuta al hacer click en aceptar en la ventana de pedir la clave*/
  80. void obtener_voucher_gtk (GtkButton *button, gpointer data);
  81. /*Funcion que elimina los vouchers y muestra la ventana para volver a crearlos*/
  82. void regenerar_vouchers (GtkButton *button, gpointer data);
  83. /*Variables globales para el funcionamiento*/
  84. gchar *tusuario;
  85. gchar *tclave;
  86. gchar *tip;
  87. listarollos *rollos;
  88. /*Punteros para la entrada de texto para la validacion en pfsense*/
  89. GtkWidget *ip, *usuario, *clave;
  90. /*Puntero a la ventana que usaremos*/
  91. GtkWidget *ventanaprincipal;
  92. GtkWidget *ventanavoucher;
  93. /*Puntero a la etiqueta que muestra el voucher*/
  94. GtkWidget *evoucher;
  95. /*Variable para decidir si la ventana puede cerrarse, por defecto puede cerrarse*/
  96. int bloquearventana=1;
  97. /*Funcion para finalizar el programa con eventos*/
  98. void cerrar_todo ()
  99. {
  100. exit (0);
  101. return;
  102. }
  103. int main (int argc, char *argv[])
  104. {
  105. FILE *archivo=NULL;
  106. unsigned int suma_clave=0;
  107. unsigned int suma_comparacion=0;
  108. char *recorrer_comparacion=NULL;
  109. char usuariocargado[128];
  110. char ipcargada[20];
  111. char control;
  112. /*Iniciamos GTK*/
  113. gtk_init (&argc, &argv);
  114. /*Comprobamos si existe una configuración de Sav-pfsense guardada*/
  115. archivo = fopen (ARCHIVO_CONFIGURACION, "rb");
  116. if (archivo == NULL)
  117. {
  118. /*Indicamos que bloque la ventana para poder abrirla*/
  119. bloquearventana = 0;
  120. /*Abrimos la ventana para configurar Sav-pfsense*/
  121. mostrar_configurar_ip_usuario_clave ();
  122. }
  123. else
  124. {
  125. /*Cargamos la configuración*/
  126. fscanf (archivo, "%u %c %s %s\n", &suma_clave, &control, &usuariocargado[0], &ipcargada[0]);
  127. fclose (archivo);
  128. /*Reservamos memoria para almacenar la configuración cargada en los punteros
  129. globales*/
  130. tip = (gchar *) malloc (sizeof (char) * (strlen (&ipcargada[0]) + 1) );
  131. tusuario = (gchar *) malloc (sizeof (char) * (strlen (&usuariocargado[0]) + 1) );
  132. /*Copiamos la configuracion*/
  133. strcpy (tip, &ipcargada[0]);
  134. strcpy (tusuario, &usuariocargado[0]);
  135. do
  136. {
  137. /*Pedimos la clave al usuario*/
  138. mostrar_pedir_clave ();
  139. /*Recorremos la clave introducida apra calcular la suma y poder compararlas*/
  140. recorrer_comparacion = (char *) tclave;
  141. while (*recorrer_comparacion != '\0')
  142. {
  143. suma_comparacion += *recorrer_comparacion % 23;
  144. recorrer_comparacion ++;
  145. }
  146. } while (suma_clave != suma_comparacion);
  147. }
  148. /*NOTA: Esta versión de la interfaz grafica solo trabajara con un rollo de vouchers*/
  149. rollos=NULL;
  150. /*Cargamos los rollos*/
  151. rollos = cargar_lista_local_rollos ();
  152. /*Comprobamos que exista algun rollo, si no existe ninguno creamos uno*/
  153. if (rollos == NULL) mostrar_crear_rollo ();
  154. /*Mostramos la pantalla donde obtener los vouchers*/
  155. mostrar_voucher_gtk ();
  156. return 0;
  157. }
  158. void mostrar_configurar_ip_usuario_clave ()
  159. {
  160. /*Comprobamos si la ventana ha sido bloqueada para abrirla o no*/
  161. if (bloquearventana != 0) return;
  162. /*Punteros a las etiquetas de texto*/
  163. GtkWidget *eip, *eusuario, *eclave;
  164. /*Puntero para el boton de aceptar*/
  165. GtkWidget *baceptar;
  166. /*Punteros a las cajas que usaremos*/
  167. GtkWidget *cipusuarioc, *controles, *formulario;
  168. /*Creamos la ventana*/
  169. ventanaprincipal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  170. /*Indicamos las dimensiones de la ventana*/
  171. gtk_window_set_default_size (GTK_WINDOW (ventanaprincipal), 255, 125);
  172. /*Impedimos que no se redimensione la ventana*/
  173. gtk_window_set_resizable (GTK_WINDOW (ventanaprincipal), FALSE);
  174. /*Indicamos el titulo de la ventana*/
  175. gtk_window_set_title (GTK_WINDOW (ventanaprincipal), "Sav - Configuración");
  176. /*Centramos la ventana*/
  177. gtk_window_set_position (GTK_WINDOW (ventanaprincipal), GTK_WIN_POS_CENTER_ALWAYS);
  178. /*Creamos las etiquetas de texto*/
  179. eip = gtk_label_new ("Direccion ip: ");
  180. eusuario = gtk_label_new ("Usuario: ");
  181. eclave = gtk_label_new ("Clave: ");
  182. /*Creamos el boton de aceptar*/
  183. baceptar = gtk_button_new_with_label ("Aceptar");
  184. /*Creamos la entrada de texto*/
  185. ip = gtk_entry_new ();
  186. usuario = gtk_entry_new ();
  187. clave = gtk_entry_new ();
  188. /*Creamos la caja de IP, Usuario y Clave*/
  189. cipusuarioc = gtk_vbox_new (FALSE, 14);
  190. /*Empaquetamos las etiquetas*/
  191. gtk_box_pack_start ( (GtkBox *) cipusuarioc, eip, FALSE, TRUE, 0);
  192. gtk_box_pack_start ( (GtkBox *) cipusuarioc, eusuario, FALSE, TRUE, 0);
  193. gtk_box_pack_start ( (GtkBox *) cipusuarioc, eclave, FALSE, TRUE, 0);
  194. /*Creamos la caja para los controles*/
  195. controles = gtk_vbox_new (FALSE, 2);
  196. /*Empaquetamos los botones*/
  197. gtk_box_pack_start ( (GtkBox *) controles, ip, FALSE, TRUE, 0);
  198. gtk_box_pack_start ( (GtkBox *) controles, usuario, FALSE, TRUE, 0);
  199. gtk_box_pack_start ( (GtkBox *) controles, clave, FALSE, TRUE, 0);
  200. gtk_box_pack_start ( (GtkBox *) controles, baceptar, FALSE, TRUE, 0 );
  201. /*Creamos la caja para el formulario*/
  202. formulario = gtk_hbox_new (FALSE, 3);
  203. /*Empaquetamos la caja de etiquetas y la de controles*/
  204. gtk_box_pack_start ( (GtkBox *) formulario, cipusuarioc, FALSE, TRUE, 0);
  205. gtk_box_pack_start ( (GtkBox *) formulario, controles, FALSE, TRUE, 0);
  206. /*Empaquetamos una caja dentro de la ventana*/
  207. gtk_container_add ( (GtkContainer *) ventanaprincipal, formulario);
  208. /*Conectamos las señales*/
  209. /*Indicamos que al cerrar la ventana vuelva a abrirla*/
  210. gtk_signal_connect (GTK_OBJECT (ventanaprincipal), "destroy", G_CALLBACK (mostrar_configurar_ip_usuario_clave), NULL);
  211. /*Indicamos que funcion ejecutar al hacer click en aceptar*/
  212. g_signal_connect ( (GObject *) baceptar, "clicked", (GCallback) configurar_ip_usuario_clave, NULL);
  213. /*Hacemos visible la ventana*/
  214. gtk_widget_show_all(ventanaprincipal);
  215. /*Ejecutamos el bucle de GTK*/
  216. gtk_main();
  217. return;
  218. }
  219. void configurar_ip_usuario_clave (GtkButton *button, gpointer data)
  220. {
  221. FILE *archivo_datos_conexion;
  222. /*Variables con las que calcular una suma de control de la clave*/
  223. unsigned int suma_clave=0;
  224. char *recorrer_clave;
  225. /*Obtenemos los datos introducidos*/
  226. tip = (gchar *) gtk_entry_get_text ( (GtkEntry *) ip);
  227. tusuario = (gchar *) gtk_entry_get_text ( (GtkEntry *) usuario);
  228. tclave = (gchar *) gtk_entry_get_text ( (GtkEntry *) clave);
  229. /*Transformamos el tipo de la clave para recorrerlo byte a byte*/
  230. recorrer_clave = (char *) tclave;
  231. /*Indicamos que no se necesita mantener mas la ventana bloqueada*/
  232. bloquearventana = 1;
  233. /*Hacemos invisible la ventana*/
  234. gtk_widget_hide_all(ventanaprincipal);
  235. /*Finalizamos el bucle GTK*/
  236. gtk_main_quit();
  237. /*Recorremos la clave y vamos sumando los valores de los bytes*/
  238. while (*recorrer_clave != '\0')
  239. {
  240. /*Lo sumamos calculando el resto de dividirlo entre 23*/
  241. suma_clave += *recorrer_clave % 23;
  242. /*Pasamos al siguiente caracter*/
  243. recorrer_clave ++;
  244. }
  245. /*Abrimos el archivo donde guardar la configuración*/
  246. archivo_datos_conexion = fopen (ARCHIVO_CONFIGURACION, "wb");
  247. /*Comprobamos que no hubiese ningun error*/
  248. if (archivo_datos_conexion == NULL) exit (-1);
  249. /*Escribimos los datos en el archivo*/
  250. fprintf (archivo_datos_conexion, "%u %c %s %s\n", suma_clave, 0x00, (char *) tusuario, (char *) tip);
  251. /*Cerramos el archivo*/
  252. fclose (archivo_datos_conexion);
  253. return;
  254. }
  255. void mostrar_pedir_clave ()
  256. {
  257. /*Punteros a las etiquetas de texto*/
  258. GtkWidget *eip, *eusuario, *eclave;
  259. /*Puntero para el boton de aceptar*/
  260. GtkWidget *baceptar;
  261. /*Punteros a las cajas que usaremos*/
  262. GtkWidget *cipusuarioc, *controles, *formulario;
  263. /*Creamos la ventana*/
  264. ventanaprincipal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  265. /*Indicamos las dimensiones de la ventana*/
  266. gtk_window_set_default_size (GTK_WINDOW (ventanaprincipal), 255, 125);
  267. /*Impedimos que no se redimensione la ventana*/
  268. gtk_window_set_resizable (GTK_WINDOW (ventanaprincipal), FALSE);
  269. /*Indicamos el titulo de la ventana*/
  270. gtk_window_set_title (GTK_WINDOW (ventanaprincipal), "Sav - Autenticación");
  271. /*Centramos la ventana*/
  272. gtk_window_set_position (GTK_WINDOW (ventanaprincipal), GTK_WIN_POS_CENTER_ALWAYS);
  273. /*Creamos las etiquetas de texto*/
  274. eip = gtk_label_new ("Direccion ip: ");
  275. eusuario = gtk_label_new ("Usuario: ");
  276. eclave = gtk_label_new ("Clave: ");
  277. /*Creamos el boton de aceptar*/
  278. baceptar = gtk_button_new_with_label ("Validar");
  279. /*Creamos la entrada de texto*/
  280. ip = gtk_label_new (tip);
  281. usuario = gtk_label_new (tusuario);
  282. clave = gtk_entry_new ();
  283. /*Creamos la caja de IP, Usuario y Clave*/
  284. cipusuarioc = gtk_vbox_new (FALSE, 2);
  285. /*Empaquetamos las etiquetas*/
  286. gtk_box_pack_start ( (GtkBox *) cipusuarioc, eip, FALSE, TRUE, 0);
  287. gtk_box_pack_start ( (GtkBox *) cipusuarioc, eusuario, FALSE, TRUE, 0);
  288. gtk_box_pack_start ( (GtkBox *) cipusuarioc, eclave, FALSE, TRUE, 0);
  289. /*Creamos la caja para los controles*/
  290. controles = gtk_vbox_new (FALSE, 2);
  291. /*Empaquetamos los botones*/
  292. gtk_box_pack_start ( (GtkBox *) controles, ip, FALSE, TRUE, 0);
  293. gtk_box_pack_start ( (GtkBox *) controles, usuario, FALSE, TRUE, 0);
  294. gtk_box_pack_start ( (GtkBox *) controles, clave, FALSE, TRUE, 0);
  295. gtk_box_pack_start ( (GtkBox *) controles, baceptar, FALSE, TRUE, 0 );
  296. /*Creamos la caja para el formulario*/
  297. formulario = gtk_hbox_new (FALSE, 3);
  298. /*Empaquetamos la caja de etiquetas y la de controles*/
  299. gtk_box_pack_start ( (GtkBox *) formulario, cipusuarioc, FALSE, TRUE, 0);
  300. gtk_box_pack_start ( (GtkBox *) formulario, controles, FALSE, TRUE, 0);
  301. /*Empaquetamos una caja dentro de la ventana*/
  302. gtk_container_add ( (GtkContainer *) ventanaprincipal, formulario);
  303. /*Conectamos las señales*/
  304. /*Indicamos que al cerrar la ventana vuelva a abrirla*/
  305. gtk_signal_connect (GTK_OBJECT (ventanaprincipal), "destroy", G_CALLBACK (cerrar_todo), NULL);
  306. /*Indicamos que funcion ejecutar al hacer click en aceptar*/
  307. g_signal_connect ( (GObject *) baceptar, "clicked", (GCallback) obtener_clave_introducida, NULL);
  308. /*Hacemos visible la ventana*/
  309. gtk_widget_show_all(ventanaprincipal);
  310. /*Ejecutamos el bucle de GTK*/
  311. gtk_main();
  312. return;
  313. }
  314. void obtener_clave_introducida (GtkButton *button, gpointer data)
  315. {
  316. /*Obtenemos los datos introducidos*/
  317. tclave = (gchar *) gtk_entry_get_text ( (GtkEntry *) clave);
  318. /*Hacemos invisible la ventana*/
  319. gtk_widget_hide_all(ventanaprincipal);
  320. /*Finalizamos el bucle GTK*/
  321. gtk_main_quit();
  322. return;
  323. }
  324. void mostrar_crear_rollo ()
  325. {
  326. /*Punteros a las etiquetas de texto*/
  327. GtkWidget *eip, *eusuario, *eclave;
  328. /*Puntero para el boton de aceptar*/
  329. GtkWidget *baceptar;
  330. /*Punteros a las cajas que usaremos*/
  331. GtkWidget *cipusuarioc, *controles, *formulario;
  332. /*Creamos la ventana*/
  333. ventanaprincipal = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  334. /*Indicamos las dimensiones de la ventana*/
  335. gtk_window_set_default_size (GTK_WINDOW (ventanaprincipal), 255, 125);
  336. /*Impedimos que no se redimensione la ventana*/
  337. gtk_window_set_resizable (GTK_WINDOW (ventanaprincipal), FALSE);
  338. /*Indicamos el titulo de la ventana*/
  339. gtk_window_set_title (GTK_WINDOW (ventanaprincipal), "Sav - Crear vouchers");
  340. /*Centramos la ventana*/
  341. gtk_window_set_position (GTK_WINDOW (ventanaprincipal), GTK_WIN_POS_CENTER_ALWAYS);
  342. /*Creamos las etiquetas de texto*/
  343. eclave = gtk_label_new ("Minutos: ");
  344. /*Creamos el boton de aceptar*/
  345. baceptar = gtk_button_new_with_label ("Crear vouchers");
  346. /*Creamos la entrada de texto*/
  347. clave = gtk_entry_new ();
  348. /*Creamos la caja de IP, Usuario y Clave*/
  349. cipusuarioc = gtk_vbox_new (FALSE, 2);
  350. /*Empaquetamos las etiquetas*/
  351. gtk_box_pack_start ( (GtkBox *) cipusuarioc, eclave, FALSE, TRUE, 0);
  352. /*Creamos la caja para los controles*/
  353. controles = gtk_vbox_new (FALSE, 2);
  354. /*Empaquetamos los botones*/
  355. gtk_box_pack_start ( (GtkBox *) controles, clave, FALSE, TRUE, 0);
  356. gtk_box_pack_start ( (GtkBox *) controles, baceptar, FALSE, TRUE, 0 );
  357. /*Creamos la caja para el formulario*/
  358. formulario = gtk_hbox_new (FALSE, 3);
  359. /*Empaquetamos la caja de etiquetas y la de controles*/
  360. gtk_box_pack_start ( (GtkBox *) formulario, cipusuarioc, FALSE, TRUE, 0);
  361. gtk_box_pack_start ( (GtkBox *) formulario, controles, FALSE, TRUE, 0);
  362. /*Empaquetamos una caja dentro de la ventana*/
  363. gtk_container_add ( (GtkContainer *) ventanaprincipal, formulario);
  364. /*Conectamos las señales*/
  365. /*Indicamos que al cerrar la ventana vuelva a abrirla*/
  366. gtk_signal_connect (GTK_OBJECT (ventanaprincipal), "destroy", G_CALLBACK (cerrar_todo), NULL);
  367. /*Indicamos que funcion ejecutar al hacer click en aceptar*/
  368. g_signal_connect ( (GObject *) baceptar, "clicked", (GCallback) obtener_crear_rollo, NULL);
  369. /*Hacemos visible la ventana*/
  370. gtk_widget_show_all(ventanaprincipal);
  371. /*Ejecutamos el bucle de GTK*/
  372. gtk_main();
  373. return;
  374. }
  375. void obtener_crear_rollo (GtkButton *button, gpointer data)
  376. {
  377. gchar *minutos=NULL;
  378. unsigned int iminutos=0;
  379. /*Obtenemos los datos introducidos*/
  380. minutos = (gchar *) gtk_entry_get_text ( (GtkEntry *) clave);
  381. sscanf ( (char *) minutos, "%u", &iminutos);
  382. /*Creamos el rollo*/
  383. crear_vouchers_wget (tip, 0, iminutos,
  384. 1023, "Sav-pfsense",
  385. tusuario, tclave);
  386. gtk_window_set_title (GTK_WINDOW (ventanaprincipal), "Sav - Creando...");
  387. /*Hacemos invisible la ventana*/
  388. gtk_widget_hide_all(ventanaprincipal);
  389. /*Finalizamos el bucle GTK*/
  390. gtk_main_quit();
  391. return;
  392. }
  393. void mostrar_voucher_gtk ()
  394. {
  395. /*Punteros a las etiquetas de texto*/
  396. GtkWidget *eip, *eusuario, *eclave;
  397. /*Puntero para el boton de aceptar*/
  398. GtkWidget *baceptar;
  399. GtkWidget *nuevos;
  400. /*Punteros a las cajas que usaremos*/
  401. GtkWidget *cipusuarioc, *controles, *formulario;
  402. /*Creamos la ventana*/
  403. ventanavoucher = gtk_window_new (GTK_WINDOW_TOPLEVEL);
  404. /*Indicamos las dimensiones de la ventana*/
  405. gtk_window_set_default_size (GTK_WINDOW (ventanavoucher), 555, 125);
  406. /*Impedimos que no se redimensione la ventana*/
  407. gtk_window_set_resizable (GTK_WINDOW (ventanavoucher), FALSE);
  408. /*Indicamos el titulo de la ventana*/
  409. gtk_window_set_title (GTK_WINDOW (ventanavoucher), "Sav - Voucher");
  410. /*Creamos las etiquetas de texto*/
  411. evoucher = gtk_label_new (" ");
  412. /*Creamos el boton de aceptar*/
  413. baceptar = gtk_button_new_with_label ("Obtener vouchers");
  414. nuevos = gtk_button_new_with_label ("Regenerar vouchers");
  415. /*Creamos la caja de IP, Usuario y Clave*/
  416. cipusuarioc = gtk_vbox_new (FALSE, 2);
  417. /*Empaquetamos las etiquetas*/
  418. gtk_box_pack_start ( (GtkBox *) cipusuarioc, evoucher, FALSE, TRUE, 0);
  419. /*Creamos la caja para los controles*/
  420. controles = gtk_hbox_new (FALSE, 2);
  421. /*Empaquetamos los botones*/
  422. gtk_box_pack_start ( (GtkBox *) controles, baceptar, FALSE, TRUE, 0 );
  423. gtk_box_pack_start ( (GtkBox *) controles, nuevos, FALSE, TRUE, 0 );
  424. /*Creamos la caja para el formulario*/
  425. formulario = gtk_hbox_new (FALSE, 3);
  426. /*Empaquetamos la caja de etiquetas y la de controles*/
  427. gtk_box_pack_start ( (GtkBox *) formulario, cipusuarioc, FALSE, TRUE, 0);
  428. gtk_box_pack_start ( (GtkBox *) formulario, controles, FALSE, TRUE, 0);
  429. /*Empaquetamos una caja dentro de la ventana*/
  430. gtk_container_add ( (GtkContainer *) ventanavoucher, formulario);
  431. /*Conectamos las señales*/
  432. /*Indicamos que al cerrar la ventana vuelva a abrirla*/
  433. gtk_signal_connect (GTK_OBJECT (ventanavoucher), "destroy", G_CALLBACK (cerrar_todo), NULL);
  434. /*Indicamos que funcion ejecutar al hacer click en aceptar*/
  435. g_signal_connect ( (GObject *) baceptar, "clicked", (GCallback) obtener_voucher_gtk, NULL);
  436. g_signal_connect ( (GObject *) nuevos, "clicked", (GCallback) regenerar_vouchers, NULL);
  437. /*Hacemos visible la ventana*/
  438. gtk_widget_show_all(ventanavoucher);
  439. /*Ejecutamos el bucle de GTK*/
  440. gtk_main();
  441. return;
  442. }
  443. void obtener_voucher_gtk (GtkButton *button, gpointer data)
  444. {
  445. char voucher[40];
  446. /*Comprobamos si no quedan vouchers para volver a crearlos*/
  447. if (obtener_voucher (0, &voucher[0]) != 0)
  448. {
  449. gtk_widget_hide_all(ventanavoucher);
  450. mostrar_crear_rollo ();
  451. gtk_widget_show_all(ventanavoucher);
  452. }
  453. else
  454. {
  455. /*Mostramos el voucher*/
  456. gtk_label_set_text (GTK_LABEL(evoucher), &voucher[0]);
  457. }
  458. return;
  459. }
  460. void regenerar_vouchers (GtkButton *button, gpointer data)
  461. {
  462. gtk_widget_hide_all(ventanavoucher);
  463. /*Eliminamos los vouchers y los volvemos a crear*/
  464. eliminar_vouchers_wget (tip, 0, tusuario, tclave);
  465. mostrar_crear_rollo ();
  466. gtk_widget_show_all(ventanavoucher);
  467. return;
  468. }
  469. int obtener_sesion_wget (char *ip)
  470. {
  471. char comando[512];
  472. /*Formamos el comando*/
  473. sprintf (&comando[0],
  474. "wget -q -O %s --user-agent %s %s %s http://%s/index.php\0",
  475. ARCHIVO_PAGINA, NAVEGADOR, OPCIONES_WGET_COOKIES, ARCHIVO_COOKIE,
  476. ip);
  477. /*Ejecutamos el comando en el sistema*/
  478. system (&comando[0]);
  479. /*Eliminamos el archivo de la pagina ya que no la necesitamos*/
  480. remove (ARCHIVO_PAGINA);
  481. return 0;
  482. }
  483. int validar_usuario_wget (char *ip, char *usuario, char *clave)
  484. {
  485. char comando[512];
  486. /*Obtenemos una cookie de sesion*/
  487. obtener_sesion_wget (ip);
  488. /*Formamos el comando*/
  489. sprintf (&comando[0],
  490. "wget -q -O %s --user-agent %s --load-cookies %s %s %s --post-data usernamefld=%s\\&passwordfld=%s\\&login=Login --referer http://%s/index.php http://%s/index.php",
  491. ARCHIVO_PAGINA, NAVEGADOR, ARCHIVO_COOKIE, OPCIONES_WGET_COOKIES,
  492. ARCHIVO_COOKIE, usuario, clave, ip, ip);
  493. /*Ejecutamos el comando en el sistema*/
  494. system (&comando[0]);
  495. sprintf (&comando[0],
  496. "wget -q -O %s --user-agent %s --load-cookies %s %s %s --referer http://%s/index.php http://%s/",
  497. ARCHIVO_PAGINA, NAVEGADOR, ARCHIVO_COOKIE, OPCIONES_WGET_COOKIES,
  498. ARCHIVO_COOKIE, ip, ip);
  499. /*Ejecutamos el comando en el sistema*/
  500. system (&comando[0]);
  501. /*Eliminamos el archivo de la pagina ya que no la necesitamos*/
  502. remove (ARCHIVO_PAGINA);
  503. return 0;
  504. }
  505. int descargar_vouchers_wget (char *ip, unsigned int id, char *usuario, char *clave)
  506. {
  507. char comando[512];
  508. /*Nos validamos en el portal de administración de Pfsense*/
  509. validar_usuario_wget (ip, usuario, clave);
  510. /*Formamos el comando*/
  511. sprintf (&comando[0],
  512. "wget -q -O %s%u%s --user-agent %s --load-cookies %s %s %s --referer http://%s/ http://%s/services_captiveportal_vouchers.php?act=csv\\&id=%u",
  513. PREFIJO_ARCHIVO_VOUCHERS, id, EXTENSION_ARCHIVO_VOUCHERS,
  514. NAVEGADOR, ARCHIVO_COOKIE, OPCIONES_WGET_COOKIES, ARCHIVO_COOKIE,
  515. ip, ip, id);
  516. /*Ejecutamos el comando en el sistema*/
  517. system (&comando[0]);
  518. /*Formateamos los vouchers para simplificar su posterior lectura*/
  519. formatear_vouchers (id);
  520. /*Eliminamos la cookie para finalizar la sesion*/
  521. remove (ARCHIVO_COOKIE);
  522. return 0;
  523. }
  524. int formatear_vouchers (int id)
  525. {
  526. FILE *vouchers=NULL;
  527. FILE *formateados=NULL;
  528. char archivo[512];
  529. char linea[32];
  530. char *lineaformateada;
  531. unsigned int longitud;
  532. registrovoucher registro;
  533. /*Formamos la ruta al archivo de los vouchers descargados*/
  534. sprintf (&archivo[0], "%s%u%s", PREFIJO_ARCHIVO_VOUCHERS, id,
  535. EXTENSION_ARCHIVO_VOUCHERS);
  536. /*Abrimos el archivo*/
  537. vouchers = fopen (&archivo[0], "r");
  538. /*Formamos la ruta al archivo de los vouchers formateados*/
  539. sprintf (&archivo[0], "%s%u%s", PREFIJO_ARCHIVO_VOUCHERS, id, ".dat");
  540. /*Abrimos el archivo*/
  541. formateados = fopen (&archivo[0], "wb");
  542. /*Preparamos el registro como no usado*/
  543. registro.usado = 0;
  544. /*Leemos el resto del archivo completo linea a linea*/
  545. while (fgets (&linea[0], 32, vouchers) != NULL)
  546. {
  547. /*Comprobamos si debemos ignorar la linea por estar comentada*/
  548. if (linea[0] == '#') continue;
  549. /*Comprobamos si la linea no es un voucher*/
  550. if (linea[0] != '\"') continue;
  551. /*Quitamos los dos primeros caracteres, una comilla y un espacio*/
  552. lineaformateada = &linea[2];
  553. /*Quitamos la comilla final*/
  554. longitud = strlen (&linea[0]);
  555. linea[longitud - 2] = '\0';
  556. /*Copiamos la cadena fomateada al registro*/
  557. strcpy (&registro.voucher[0], lineaformateada);
  558. /*Escribimos el registro*/
  559. fwrite (&registro, sizeof (registrovoucher), 1, formateados);
  560. }
  561. /*Cerramos los archivos*/
  562. fclose (vouchers);
  563. fclose (formateados);
  564. /*Formamos la ruta al archivo de los vouchers descargados*/
  565. sprintf (&archivo[0], "%s%u%s", PREFIJO_ARCHIVO_VOUCHERS, id,
  566. EXTENSION_ARCHIVO_VOUCHERS);
  567. /*Eliminamos el archivo descargado*/
  568. remove (&archivo[0]);
  569. return 0;
  570. }
  571. int obtener_voucher (int rollo, char *voucher)
  572. {
  573. FILE *vouchers=NULL;
  574. char archivo[512];
  575. registrovoucher registro;
  576. unsigned int id=0;
  577. listarollos *rollos=NULL;
  578. /*Cargamos la lista de rollos*/
  579. rollos = cargar_lista_local_rollos ();
  580. /*Comprobamos que exista el rollo*/
  581. if (buscar_id_rollo (rollos, rollo, &id) != 0)
  582. {
  583. /*Liberamos la lista de rollos*/
  584. liberar_lista_rollos (rollos);
  585. return -1;
  586. }
  587. /*Liberamos la lista de rollos*/
  588. liberar_lista_rollos (rollos);
  589. rollos = NULL;
  590. /*Indicamos el valor por defecto, no usado*/
  591. registro.usado = 0;
  592. /*Indicamos que no se ha obtenido ningun voucher aun*/
  593. int obtenido=0;
  594. /*Formamos la ruta al archivo de los vouchers*/
  595. sprintf (&archivo[0], "%s%u%s", PREFIJO_ARCHIVO_VOUCHERS, id, ".dat");
  596. /*Abrimos el archivo*/
  597. vouchers = fopen (&archivo[0], "r+b");
  598. while (!feof (vouchers) )
  599. {
  600. /*Cargamos un voucher*/
  601. fread (&registro, sizeof (registrovoucher), 1, vouchers );
  602. /*Comprobamos si ha sido usado*/
  603. if (registro.usado == 0)
  604. {
  605. /*Indicamos que esta usado*/
  606. registro.usado = 0xff;
  607. /*Lo guardamos en el archivo*/
  608. fseek (vouchers, - sizeof (registrovoucher), SEEK_CUR);
  609. fwrite (&registro, sizeof (registrovoucher), 1, vouchers);
  610. /*Indicamos que se ha encontrado un voucher*/
  611. obtenido = 1;
  612. /*Salimos del bucle*/
  613. break;
  614. }
  615. }
  616. /*Cerramos el archivo*/
  617. fclose (vouchers);
  618. /*comprobamos si se obtuvo un voucher*/
  619. if (obtenido == 0)
  620. {
  621. /*Cargamos la lista de rollos*/
  622. rollos = cargar_lista_local_rollos ();
  623. /*Eliminamos el rollo de vouchers por haber gastado ya todos*/
  624. eliminar_rollo_lista (&rollos, rollo);
  625. /*Liberamos la lista de rollos*/
  626. liberar_lista_rollos (rollos);
  627. rollos = NULL;
  628. return -1;
  629. }
  630. else
  631. {
  632. /*copiamos el voucher a la cadena indicada al llamar a la función*/
  633. strcpy (voucher, &registro.voucher[0]);
  634. }
  635. return 0;
  636. }
  637. int eliminar_vouchers_wget (char *ip, unsigned int rollo, char *usuario, char *clave)
  638. {
  639. char comando[512];
  640. unsigned int id=0;
  641. listarollos *rollos=NULL;
  642. /*Cargamos la lista de rollos*/
  643. rollos = cargar_lista_local_rollos ();
  644. /*Comprobamos que exista el rollo*/
  645. if (buscar_id_rollo (rollos, rollo, &id) != 0)
  646. {
  647. /*Liberamos la lista de rollos*/
  648. liberar_lista_rollos (rollos);
  649. return -1;
  650. }
  651. /*Liberamos la lista de rollos*/
  652. liberar_lista_rollos (rollos);
  653. rollos = NULL;
  654. /*Nos validamos en el portal de administración de Pfsense*/
  655. validar_usuario_wget (ip, usuario, clave);
  656. /*Formamos el comando*/
  657. sprintf (&comando[0],
  658. "wget -q -O %s --user-agent %s --load-cookies %s %s %s --referer http://%s/ http://%s/services_captiveportal_vouchers.php?act=del\\&id=%u",
  659. ARCHIVO_PAGINA, NAVEGADOR, ARCHIVO_COOKIE, OPCIONES_WGET_COOKIES,
  660. ARCHIVO_COOKIE, ip, ip, id);
  661. /*Ejecutamos el comando en el sistema*/
  662. system (&comando[0]);
  663. /*Eliminamos el archivo de la pagina ya que no la necesitamos*/
  664. remove (ARCHIVO_PAGINA);
  665. /*Eliminamos la cookie para finalizar la sesion*/
  666. remove (ARCHIVO_COOKIE);
  667. /*Cargamos la lista de rollos*/
  668. rollos = cargar_lista_local_rollos ();
  669. /*Eliminamos el archivo de vouchers*/
  670. eliminar_rollo_lista (&rollos, rollo);
  671. /*Liberamos la lista de rollos*/
  672. liberar_lista_rollos (rollos);
  673. rollos = NULL;
  674. return 0;
  675. }
  676. int obtener_sid_wget (char *ip, char *sid)
  677. {
  678. FILE *pagina=NULL;
  679. char comando[2048];
  680. char *auxiliar;
  681. int longitud;
  682. /*Indicamos que no hemos encontrado aun el sid*/
  683. int encontrado=-1;
  684. /*Formamos el comando*/
  685. sprintf (&comando[0],
  686. "wget -q -O %s --user-agent %s --load-cookies %s %s %s --referer http://%s/ http://%s/services_captiveportal_vouchers.php",
  687. ARCHIVO_PAGINA, NAVEGADOR, ARCHIVO_COOKIE, OPCIONES_WGET_COOKIES,
  688. ARCHIVO_COOKIE, ip, ip);
  689. /*Ejecutamos el comando en el sistema*/
  690. system (&comando[0]);
  691. /*Abrimos el archivo*/
  692. pagina = fopen (ARCHIVO_PAGINA, "r");
  693. /*Leemos todo el archivo buscando la linea que necesitamos*/
  694. while (fgets (&comando[0], 1024, pagina) != NULL)
  695. {
  696. /*Buscamos sid:*/
  697. auxiliar = strstr (&comando[0], "sid:");
  698. /*Comprobamos si lo hemos encontrado*/
  699. if (auxiliar != NULL)
  700. {
  701. /*Indicamos que lo encontramos*/
  702. encontrado = 0;
  703. /*Salimos del bucle*/
  704. break;
  705. }
  706. }
  707. /*Cerramos el archivo*/
  708. fclose (pagina);
  709. /*Eliminamos el archivo que ya es innecesario*/
  710. remove (ARCHIVO_PAGINA);
  711. /*Comprobamos si se encontro*/
  712. if (encontrado == 0)
  713. {
  714. /*Calculamos la longitud del sid*/
  715. longitud = strstr (auxiliar, "\"") - auxiliar;
  716. /*Copiamos el sid*/
  717. strncpy (sid, auxiliar, longitud);
  718. /*Indicamos el final de la cadena de caracteres*/
  719. *(sid + longitud) = '\0';
  720. }
  721. return encontrado;
  722. }
  723. int crear_vouchers_wget (char *ip, unsigned int rollo, unsigned int minutos,
  724. unsigned int numerovouchers, char *comentario,
  725. char *usuario, char *clave)
  726. {
  727. char comando[512];
  728. char sid[128];
  729. unsigned int id=0;
  730. listarollos *rollos=NULL;
  731. /*Cargamos la lista de rollos*/
  732. rollos = cargar_lista_local_rollos ();
  733. /*Comprobamos que no exista ya el rollo que intentamos crear*/
  734. if (buscar_id_rollo (rollos, rollo, &id) == 0)
  735. {
  736. /*Liberamos la lista de rollos*/
  737. liberar_lista_rollos (rollos);
  738. return -1;
  739. }
  740. /*Liberamos la lista de rollos*/
  741. liberar_lista_rollos (rollos);
  742. rollos = NULL;
  743. /*Nos validamos en el portal de administración de Pfsense*/
  744. validar_usuario_wget (ip, usuario, clave);
  745. /*Obtenemos el sid*/
  746. obtener_sid_wget (ip, &sid[0]);
  747. /*Lo codificamos para enviarlo por POST*/
  748. codificacion_url (&sid[0]);
  749. /*Formamos el comando*/
  750. sprintf (&comando[0],
  751. "wget -q -O %s --user-agent %s --load-cookies %s %s %s --post-data __csrf_magic=%s\\&number=%u\\&minutes=%u\\&count=%u\\&comment=%s\\&Submit=Save --referer http://%s/services_captiveportal_vouchers_edit.php http://%s/services_captiveportal_vouchers_edit.php",
  752. ARCHIVO_PAGINA, NAVEGADOR, ARCHIVO_COOKIE, OPCIONES_WGET_COOKIES,
  753. ARCHIVO_COOKIE, &sid[0], rollo, minutos, numerovouchers,
  754. comentario, ip, ip);
  755. /*Ejecutamos el comando en el sistema*/
  756. system (&comando[0]);
  757. /*Eliminamos el archivo que ya es innecesario*/
  758. remove (ARCHIVO_PAGINA);
  759. /*Eliminamos la cookie para finalizar la sesion*/
  760. remove (ARCHIVO_COOKIE);
  761. /*Cargamos la lista de rollos*/
  762. rollos = cargar_lista_local_rollos ();
  763. /*Agregamos el nuevo rollos*/
  764. agregar_rollo_lista (&rollos, rollo, minutos, numerovouchers, comentario);
  765. /*Guardamos la lista de rollos*/
  766. guardar_lista_local_rollos (rollos);
  767. /*Liberamos la lista de rollos*/
  768. liberar_lista_rollos (rollos);
  769. rollos = NULL;
  770. /*Cargamos la lista de rollos*/
  771. rollos = cargar_lista_local_rollos ();
  772. /*Obtenemos el id del rollo*/
  773. buscar_id_rollo (rollos, rollo, &id);
  774. /*Liberamos la lista de rollos*/
  775. liberar_lista_rollos (rollos);
  776. rollos = NULL;
  777. /*Descargamos los vouchers creados*/
  778. descargar_vouchers_wget (ip, id, usuario, clave);
  779. return 0;
  780. }
  781. int codificacion_url (char *cadena)
  782. {
  783. char auxiliar[128];
  784. char *recorrer;
  785. unsigned int i=0;
  786. /*Recorremos la cadena caracter a caracter*/
  787. for (recorrer=cadena; *recorrer != '\0'; recorrer++)
  788. {
  789. /*Comprobamos de que caracter se trata para codificarlo*/
  790. if (*recorrer == ':')
  791. {
  792. /*Codificamos el caracter*/
  793. auxiliar[i] = '%';
  794. i++;
  795. auxiliar[i] = '3';
  796. i++;
  797. auxiliar[i] = 'A';
  798. i++;
  799. }
  800. else if (*recorrer == '/')
  801. {
  802. /*Codificamos el caracter*/
  803. auxiliar[i] = '%';
  804. i++;
  805. auxiliar[i] = '2';
  806. i++;
  807. auxiliar[i] = 'F';
  808. i++;
  809. }
  810. else if (*recorrer == '.')
  811. {
  812. /*Codificamos el caracter*/
  813. auxiliar[i] = '%';
  814. i++;
  815. auxiliar[i] = '2';
  816. i++;
  817. auxiliar[i] = 'E';
  818. i++;
  819. }
  820. else if (*recorrer == ',')
  821. {
  822. /*Codificamos el caracter*/
  823. auxiliar[i] = '%';
  824. i++;
  825. auxiliar[i] = '2';
  826. i++;
  827. auxiliar[i] = 'C';
  828. i++;
  829. }
  830. else
  831. {
  832. /*Solo copiamos el caracter*/
  833. auxiliar[i] = *recorrer;
  834. i++;
  835. }
  836. }
  837. /*Colocamos el final de la cadena de caracteres*/
  838. auxiliar[i] = '\0';
  839. strcpy (cadena, &auxiliar[0]);
  840. return 0;
  841. }
  842. listarollos *cargar_lista_local_rollos ()
  843. {
  844. FILE *archivo=NULL;
  845. listarollos *primero=NULL, *nuevo=NULL, *auxiliar=NULL;
  846. rollovouchers registro;
  847. unsigned int id=0;
  848. /*Abrimos el archivo*/
  849. archivo = fopen (ARCHIVO_ROLLOS, "rb");
  850. /*Comprobamos si se pudo abrir*/
  851. if (archivo != NULL)
  852. {
  853. /*Leemos el archivo hasta el final*/
  854. while (!feof (archivo) )
  855. {
  856. /*Leemos un registro del archivo y comprobamos que no hubo errores*/
  857. if (fread (&registro, sizeof (rollovouchers), 1, archivo) != 1) break;
  858. /*Reservamos memoria para mantenerlo en memoria*/
  859. nuevo = (listarollos *) malloc (sizeof (listarollos) );
  860. /*Comprobamos que no haya ningun error*/
  861. if (nuevo == NULL) exit (-1);
  862. /*Copiamos los valores leidos*/
  863. nuevo -> id = id;
  864. id ++;
  865. nuevo -> rollo . rollo = registro . rollo;
  866. nuevo -> rollo . minutos = registro . minutos;
  867. nuevo -> rollo . numerovouchers = registro . numerovouchers;
  868. strcpy ( &(nuevo -> rollo . comentario[0]), &(registro . comentario [0]) );
  869. nuevo -> siguiente = NULL;
  870. /*Lo añadimos a la lista*/
  871. if (primero == NULL)
  872. {
  873. primero = nuevo;
  874. auxiliar = nuevo;
  875. nuevo = NULL;
  876. }
  877. else
  878. {
  879. /*Lo añadimos al final de la lista*/
  880. auxiliar -> siguiente = nuevo;
  881. auxiliar = nuevo;
  882. }
  883. }
  884. /*Cerramos el archivo*/
  885. fclose (archivo);
  886. }
  887. return primero;
  888. }
  889. int guardar_lista_local_rollos (listarollos *primero)
  890. {
  891. FILE *archivo=NULL;
  892. listarollos *auxiliar=NULL;
  893. rollovouchers registro;
  894. /*Eliminamos un posible archivo de respaldo de los rollos*/
  895. remove (ARCHIVO_RESPALDO_ROLLOS);
  896. /*Renombramos el archivo existente como copia de respaldo*/
  897. rename (ARCHIVO_ROLLOS, ARCHIVO_RESPALDO_ROLLOS);
  898. /*Abrimos el archivo*/
  899. archivo = fopen (ARCHIVO_ROLLOS, "wb");
  900. /*Comprobamos si se pudo abrir*/
  901. if (archivo != NULL)
  902. {
  903. /*Recorremos la lista de rollos*/
  904. for (auxiliar = primero; auxiliar != NULL; auxiliar = auxiliar -> siguiente )
  905. {
  906. /*Copiamos los valores a escribir*/
  907. registro . rollo = auxiliar -> rollo . rollo;
  908. registro . minutos = auxiliar -> rollo . minutos;
  909. registro . numerovouchers = auxiliar -> rollo . numerovouchers;
  910. strcpy (&(registro . comentario [0]), &(auxiliar -> rollo . comentario[0]) );
  911. /*Escribimos un registro del archivo*/
  912. fwrite (&registro, sizeof (rollovouchers), 1, archivo);
  913. }
  914. /*Cerramos el archivo*/
  915. fclose (archivo);
  916. /*Eliminamos el archivo de respaldo de los rollos*/
  917. remove (ARCHIVO_RESPALDO_ROLLOS);
  918. }
  919. else
  920. {
  921. /*Eliminamos el archivo de los rollos*/
  922. remove (ARCHIVO_ROLLOS);
  923. /*Renombramos el archivo de respaldo para recuperarlo*/
  924. rename (ARCHIVO_RESPALDO_ROLLOS, ARCHIVO_ROLLOS);
  925. }
  926. return 0;
  927. }
  928. int agregar_rollo_lista (listarollos **lista, unsigned int rollo, unsigned int minutos, unsigned int numerovouchers, char *comentario)
  929. {
  930. listarollos *auxiliar=NULL, *nuevo=NULL;
  931. /*Reservamos memoria para el nuevo rollo*/
  932. nuevo = (listarollos *) malloc (sizeof (listarollos) );
  933. /*Comprobamos que no haya ningun error*/
  934. if (nuevo == NULL) exit (-1);
  935. /*Copiamos los valores*/
  936. nuevo -> rollo . rollo = rollo;
  937. nuevo -> rollo . minutos = minutos;
  938. nuevo -> rollo . numerovouchers = numerovouchers;
  939. strcpy ( &(nuevo -> rollo . comentario[0]), comentario);
  940. nuevo -> siguiente = NULL;
  941. /*Comprobamos si la lista esta vacia*/
  942. if (*lista == NULL)
  943. {
  944. /*Al ser el primer elemento su numeración en la lista es la 0*/
  945. nuevo -> id = 0;
  946. /*Lo incluimos en la lista en la primera posición*/
  947. *lista = nuevo;
  948. }
  949. else
  950. {
  951. /*Buscamos el final de la lista*/
  952. auxiliar = *lista;
  953. while (auxiliar -> siguiente != NULL) auxiliar = auxiliar -> siguiente;
  954. /*Calculamos la numeración en lista del nuevo rollo*/
  955. nuevo -> id = auxiliar -> id + 1;
  956. /*Lo incluimos en la lista*/
  957. auxiliar -> siguiente = nuevo;
  958. }
  959. /*Guardamos la lista de rollos para mantener la lista de rollos actualziada
  960. a los cambios hechos*/
  961. guardar_lista_local_rollos (*lista);
  962. return 0;
  963. }
  964. int liberar_lista_rollos (listarollos *primero)
  965. {
  966. listarollos *recorrer, *liberar;
  967. /*Nos situamos al comienzo de la lista*/
  968. liberar = primero;
  969. /*Liberamos hasta que no queden elementos*/
  970. while (liberar != NULL)
  971. {
  972. /*Obtenemos el proximo elemento*/
  973. recorrer = liberar -> siguiente;
  974. /*Liberamos el actual*/
  975. free (liberar);
  976. /*Pasamos al siguiente*/
  977. liberar = recorrer;
  978. }
  979. return 0;
  980. }
  981. int buscar_id_rollo (listarollos *primero, unsigned int rollo, unsigned int *id)
  982. {
  983. int encontrado=-1;
  984. listarollos *auxiliar;
  985. /*Recorremos la lista*/
  986. for (auxiliar = primero; auxiliar != NULL; auxiliar = auxiliar -> siguiente)
  987. {
  988. /*Comprobamos si es el rollo que buscamos*/
  989. if (rollo == auxiliar -> rollo . rollo)
  990. {
  991. /*Asignamos el valor de posición en lista*/
  992. *id = auxiliar -> id;
  993. /*Indicamos que lo encontramos*/
  994. encontrado = 0;
  995. }
  996. }
  997. return encontrado;
  998. }
  999. int eliminar_rollo_lista (listarollos **lista, unsigned int rollo)
  1000. {
  1001. listarollos *recorrer=NULL, *liberar=NULL;
  1002. char archivo[64];
  1003. char archivorenombrado[64];
  1004. /*Comprobamos si es el primer elemento*/
  1005. if ( (*lista) -> rollo . rollo == rollo)
  1006. {
  1007. /*Apuntamos al elemento a liberar*/
  1008. liberar = *lista;
  1009. /*Quitamos el primer elemento*/
  1010. *lista = liberar -> siguiente;
  1011. /*Apuntamos al primer elemento que deberemos corregir la numeración*/
  1012. recorrer = *lista;
  1013. }
  1014. else
  1015. {
  1016. /*Buscamos el rollo anterior al rollo a eliminar*/
  1017. recorrer = *lista;
  1018. while (recorrer -> siguiente -> rollo . rollo != rollo) recorrer = recorrer -> siguiente;
  1019. /*Apuntamos al elemento a liberar*/
  1020. liberar = recorrer -> siguiente;
  1021. /*Lo sacamos de la lista*/
  1022. recorrer -> siguiente = liberar -> siguiente;
  1023. /*Apuntamos al primer elemento que deberemos corregir la numeración*/
  1024. recorrer = recorrer -> siguiente;
  1025. }
  1026. /*Formamos la ruta al archivo del rollo*/
  1027. sprintf (&archivo[0], "%s%u%s", PREFIJO_ARCHIVO_VOUCHERS, liberar -> id, ".dat");
  1028. /*Liberamos lamemoria*/
  1029. free (liberar);
  1030. /*Eliminamos el archivo del rollo*/
  1031. remove (&archivo[0]);
  1032. /*Recorremos todos los rollos de la lista a los que hay que corregirles la
  1033. numeración para que sea continua en toda la lista*/
  1034. while (recorrer != NULL)
  1035. {
  1036. /*Formamos la ruta al archivo del rollo*/
  1037. sprintf (&archivo[0], "%s%u%s", PREFIJO_ARCHIVO_VOUCHERS, recorrer -> id, ".dat");
  1038. /*Corregimos la númeracion del rollo*/
  1039. recorrer -> id --;
  1040. /*Formamos la ruta al nuevo nombre del archivo del rollo*/
  1041. sprintf (&archivorenombrado[0], "%s%u%s", PREFIJO_ARCHIVO_VOUCHERS, recorrer -> id, ".dat");
  1042. /*Renombramos el archivo*/
  1043. rename (&archivo[0], &archivorenombrado[0]);
  1044. /*Pasamos al siguiente*/
  1045. recorrer = recorrer -> siguiente;
  1046. }
  1047. /*Guardamos la lista de rollos para mantener la lista de rollos actualziada
  1048. a los cambios hechos*/
  1049. guardar_lista_local_rollos (*lista);
  1050. return 0;
  1051. }