Buenos días, programé una función, pero me siento un poco satisfecha con ella, quizá sea la mejor forma, pero quisiera otra perspectiva que sea un poco más simple. Si tienen alguna idea o me ayudarían con la lógica, sería perfecto.
Código C:
Ver original/* Saca la información de w0rm.conf
*
* Este programa es software libre: usted puede redistribuirlo y/o
* modificarlo bajo los términos de la Licencia Pública General de
* GNU según es publicada por la Free Software Foundation, bien
* sea la versión 3 de la Licencia, o (a su elección) cualquier
* versión posterior.
*
* Este programa se distribuye con la esperanza de que sea útil,
* pero SIN NINGUNA GARANTÍA, incluso sin la garantía implícita de
* COMERCIALIZACIÓN o IDONEIDAD PARA UN PROPÓSITO PARTICULAR. Consulte
* la GNU General Public License para más detalles.
*
* Debería haber recibido una copia de la Licencia Pública General de GNU
* junto con este programa. Si no, véase <http://www.gnu.org/licenses/>.
*
* Escrito por Alberto 'guzzan0' José Guilarte para w0rmlinux
*/
#define DIR_CONFIG "/etc/w0rm.conf"
struct wormcfg {
char servidor_espejo[256]; /* RFC 1035 */
char protocolo_espejo[5]; /*FTP o HTTP */
char repositorios[20]; /* Base, opcional, comunidad */
char directorio_db[256]; /* DB con los paquetes */
} cfg_w = {"guzzano2.web44.net", "http", "Base",
"/home/guzzano/Escritorio/w0rm/packages_db"};
/* Realiza una comprobación para ver si no existe en la variable
* algún dato que no sea necesario. Espacios, comillas, errores de tecleo
* o salto de líneas.
*/
static int comprobar_datos (char * cadena_opciones, char ** resultado) {
char * tmp_r = cadena_opciones;
char * tmp_c = NULL;
tmp_r += 1;
if (*tmp_r == '\0' || *tmp_r == '\n')
return -1;
if ((tmp_c
= strchr(tmp_r
, '\n')) != NULL
) tmp_c = '\0';
*resultado = tmp_r;
return 0;
}
int cargar_configuracion (void) {
const char * opciones[4] = {"servidor_espejo", "protocolo_espejo", "repositorios_activos",
"directorio_db"};
char cadena_config[256];
char * tmp = NULL;
char * tmp2 = NULL;
int opciones_c;
int tamano_c = 0;
FILE
* config_archivo
= fopen(DIR_CONFIG
, "a+");
if (config_archivo == NULL) {
fprintf(stderr
, "[Error] no se pudo cargar el archivo de configuración"); return -1;
}
while (fgets(cadena_config
, sizeof(cadena_config
)-1, config_archivo
) != NULL
) { if (cadena_config[0] == '#' || cadena_config[0] == '\n')
continue;
for (opciones_c = 0 ; opciones_c < sizeof(opciones)/sizeof(char *) ; opciones_c++) {
if (strncmp(opciones
[opciones_c
], cadena_config
, strlen(opciones
[opciones_c
])) == 0) { if (strtok_r(cadena_config, "=", &tmp) == NULL)
break;
if (comprobar_datos(tmp, &tmp2) != 0)
break;
switch (opciones_c) {
case 0:
tamano_c
= (strlen(tmp2
) < sizeof(cfg_w.
servidor_espejo))-1 ? strlen(tmp2
) : sizeof(cfg_w.
servidor_espejo)-1; /* Evito buffer overflow */ strncpy(cfg_w.
servidor_espejo, tmp2
, tamano_c
);
break;
case 1:
tamano_c
= (strlen(tmp2
) < sizeof(cfg_w.
protocolo_espejo))-1 ? strlen(tmp2
) : sizeof(cfg_w.
protocolo_espejo)-1; strncpy(cfg_w.
protocolo_espejo, tmp2
, tamano_c
);
break;
case 2:
tamano_c
= (strlen(tmp2
) < sizeof(cfg_w.
repositorios))-1 ? strlen(tmp2
) : sizeof(cfg_w.
repositorios)-1; strncpy(cfg_w.
repositorios, tmp2
, tamano_c
);
break;
case 3:
tamano_c
= (strlen(tmp2
) < sizeof(cfg_w.
directorio_db))-1 ? strlen(tmp2
) : sizeof(cfg_w.
directorio_db)-1; strncpy(cfg_w.
directorio_db, tmp2
, tamano_c
);
break;
}
}
}
}
return 0;
}
Se me hace un poco incomodo y cuando se necesitan más variables de configuración el archivo C será realmente pesado y la comparación también.
Saludos.