[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
Re: [Lost] [Patch] [1/4] Service-Manager
Am Donnerstag, 26. Juni 2008 22:46:59 schrieb Antoine Kaufmann:
> Hier eine korrigierte Version des Service-Managers
> +/**
> + * Konfigurationsverzeichnis parsen
> + *
> + * @param dir Verzeichnis-Handle
> + *
> + * @return TRUE wenn erfolgreich abgeschlossen wurde, FALSE sonst.
> + */
> +static bool config_dir_parse(io_resource_t* dir)
> +{
> + io_direntry_t* entry;
> + struct config_service* conf_serv;
> + int i;
> +
> + config_list = list_create();
> +
> + // In einem ersten Schritt werden alle Servicenamen eingelesen
> + while ((entry = directory_read(dir))) {
> + // Alles was nicht Verzeichnis ist, wird uebersprungen
> + if ((entry->type != IO_DIRENTRY_DIR) || (entry->name[1] == '.')) {
> + free(entry);
> + continue;
> + }
> +
> + // Service in der Liste eintragen
> + conf_serv = malloc(sizeof(*conf_serv));
> + assert(conf_serv != NULL);
Wie wäre es mit calloc? Hier wird ja nicht alles an einer Stelle
initialisiert, da besteht erst recht Gefahr, was zu vergessen.
> +
> + // Namen setzen
> + assert(asprintf(&conf_serv->name, "%s", entry->name) != -1);
Die assert-Bedingung darf nie Seiteneffekte haben.
> +
> + list_push(config_list, conf_serv);
> +
> + free(entry);
> + }
> +
> + // In einem zweiten schritt werden die Befehle zum Starten und die
> + // Abhaengigkeiten eingetragen
> + for (i = 0; (conf_serv = list_get_element_at(config_list, i)); i++) {
> + char* cmd_path;
> + char* deps_path;
> + char* conf_path;
> +
> + assert(asprintf(&cmd_path, "%s/%s/cmd", full_config_path,
> conf_serv-> + name) != -1);
> + assert(asprintf(&deps_path, "%s/%s/deps", full_config_path,
> conf_serv-> + name) != -1);
> + assert(asprintf(&conf_path, "%s/%s/conf", full_config_path,
> + conf_serv->name) != -1);
Siehe oben.
> +
> + config_read_file(cmd_path, &conf_serv->start_cmd);
> + config_parse_deps(deps_path, conf_serv);
> + config_parse_conf(conf_path, conf_serv);
> + free(deps_path);
> + free(cmd_path);
conf_path wird nicht freigegeben?
> + }
> +
> + return TRUE;
> +}
> +
> +
> +bool config_read()
> +{
> + const char* config_path = "/config/servmgr";
> + io_resource_t* dir;
> + bool result;
> +
> + assert(asprintf(&full_config_path, "%s%s", root_dir, config_path) !=
> -1); +
Siehe oben.
> + // Verzeichnis mit der Konfiguration oeffnen
> + dir = directory_open(full_config_path);
> + if (!dir) {
> + printf("servmgr: Konnte Konfigurationsverzeichnis nicht oeffnen:
> '%s'", + full_config_path);
Ein \n vielleicht?
> +/**
> + * Konfiguration eines Dienstes
> + */
> +struct config_service {
> + char* name;
> + char* start_cmd;
> + list_t* deps;
> +
> + struct {
> + bool no_wait;
> + } conf;
> +};
Die struct-Definition würde ich an den Anfang der Headerdatei stellen und erst
hinterher die ganzen Funktionen. Aber das ist wohl Geschmackssache.