Commit 8b90a990 authored by Vadim Kochan's avatar Vadim Kochan Committed by Stephen Hemminger

tc class: Ignore if default class name file does not exist

If '-nm' specified that do not fail if there is no
default class names file in /etc/iproute2.

Changed default class name file cls_names -> tc_cls.
Signed-off-by: default avatarVadim Kochan <vadim4j@gmail.com>
parent 51cf3675
...@@ -16,7 +16,8 @@ struct db_names { ...@@ -16,7 +16,8 @@ struct db_names {
int max; int max;
}; };
struct db_names *db_names_alloc(const char *path); struct db_names *db_names_alloc(void);
int db_names_load(struct db_names *db, const char *path);
void db_names_free(struct db_names *db); void db_names_free(struct db_names *db);
char *id_to_name(struct db_names *db, int id, char *name); char *id_to_name(struct db_names *db, int id, char *name);
......
...@@ -11,8 +11,10 @@ ...@@ -11,8 +11,10 @@
#include <stdio.h> #include <stdio.h>
#include <string.h> #include <string.h>
#include <stdlib.h> #include <stdlib.h>
#include <errno.h>
#include "names.h" #include "names.h"
#include "utils.h"
#define MAX_ENTRIES 256 #define MAX_ENTRIES 256
#define NAME_MAX_LEN 512 #define NAME_MAX_LEN 512
...@@ -48,48 +50,65 @@ static int read_id_name(FILE *fp, int *id, char *name) ...@@ -48,48 +50,65 @@ static int read_id_name(FILE *fp, int *id, char *name)
return 0; return 0;
} }
struct db_names *db_names_alloc(const char *path) struct db_names *db_names_alloc(void)
{ {
struct db_names *db; struct db_names *db;
struct db_entry *entry;
FILE *fp;
int id;
char namebuf[NAME_MAX_LEN] = {0};
int ret;
fp = fopen(path, "r"); db = malloc(sizeof(*db));
if (!fp) { if (!db)
fprintf(stderr, "Can't open file: %s\n", path);
return NULL; return NULL;
}
db = malloc(sizeof(*db));
memset(db, 0, sizeof(*db)); memset(db, 0, sizeof(*db));
db->size = MAX_ENTRIES; db->size = MAX_ENTRIES;
db->hash = malloc(sizeof(struct db_entry *) * db->size); db->hash = malloc(sizeof(struct db_entry *) * db->size);
memset(db->hash, 0, sizeof(struct db_entry *) * db->size); memset(db->hash, 0, sizeof(struct db_entry *) * db->size);
return db;
}
int db_names_load(struct db_names *db, const char *path)
{
struct db_entry *entry;
FILE *fp;
int id;
char namebuf[NAME_MAX_LEN] = {0};
int ret = -1;
fp = fopen(path, "r");
if (!fp)
return -ENOENT;
while ((ret = read_id_name(fp, &id, &namebuf[0]))) { while ((ret = read_id_name(fp, &id, &namebuf[0]))) {
if (ret == -1) { if (ret == -1) {
fprintf(stderr, "Database %s is corrupted at %s\n", fprintf(stderr, "Database %s is corrupted at %s\n",
path, namebuf); path, namebuf);
fclose(fp); goto Exit;
return NULL;
} }
ret = -1;
if (id < 0) if (id < 0)
continue; continue;
entry = malloc(sizeof(*entry)); entry = malloc(sizeof(*entry));
entry->id = id; if (!entry)
goto Exit;
entry->name = strdup(namebuf); entry->name = strdup(namebuf);
if (!entry->name) {
free(entry);
goto Exit;
}
entry->id = id;
entry->next = db->hash[id & (db->size - 1)]; entry->next = db->hash[id & (db->size - 1)];
db->hash[id & (db->size - 1)] = entry; db->hash[id & (db->size - 1)] = entry;
} }
ret = 0;
Exit:
fclose(fp); fclose(fp);
return db; return ret;
} }
void db_names_free(struct db_names *db) void db_names_free(struct db_names *db)
...@@ -117,8 +136,12 @@ void db_names_free(struct db_names *db) ...@@ -117,8 +136,12 @@ void db_names_free(struct db_names *db)
char *id_to_name(struct db_names *db, int id, char *name) char *id_to_name(struct db_names *db, int id, char *name)
{ {
struct db_entry *entry = db->hash[id & (db->size - 1)]; struct db_entry *entry;
if (!db)
return NULL;
entry = db->hash[id & (db->size - 1)];
while (entry && entry->id != id) while (entry && entry->id != id)
entry = entry->next; entry = entry->next;
...@@ -136,6 +159,9 @@ int name_to_id(struct db_names *db, int *id, const char *name) ...@@ -136,6 +159,9 @@ int name_to_id(struct db_names *db, int *id, const char *name)
struct db_entry *entry; struct db_entry *entry;
int i; int i;
if (!db)
return -1;
if (db->cached && strcmp(db->cached->name, name) == 0) { if (db->cached && strcmp(db->cached->name, name) == 0) {
*id = db->cached->id; *id = db->cached->id;
return 0; return 0;
...@@ -145,6 +171,7 @@ int name_to_id(struct db_names *db, int *id, const char *name) ...@@ -145,6 +171,7 @@ int name_to_id(struct db_names *db, int *id, const char *name)
entry = db->hash[i]; entry = db->hash[i];
while (entry && strcmp(entry->name, name)) while (entry && strcmp(entry->name, name))
entry = entry->next; entry = entry->next;
if (entry) { if (entry) {
db->cached = entry; db->cached = entry;
*id = entry->id; *id = entry->id;
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <arpa/inet.h> #include <arpa/inet.h>
#include <string.h> #include <string.h>
#include <math.h> #include <math.h>
#include <errno.h>
#include "utils.h" #include "utils.h"
#include "names.h" #include "names.h"
...@@ -33,15 +34,25 @@ ...@@ -33,15 +34,25 @@
static struct db_names *cls_names = NULL; static struct db_names *cls_names = NULL;
#define NAMES_DB "/etc/iproute2/cls_names" #define NAMES_DB "/etc/iproute2/tc_cls"
int cls_names_init(char *path) int cls_names_init(char *path)
{ {
cls_names = db_names_alloc(path ?: NAMES_DB); int ret;
if (!cls_names) {
fprintf(stderr, "Error while opening class names file\n"); cls_names = db_names_alloc();
if (!cls_names)
return -1;
ret = db_names_load(cls_names, path ?: NAMES_DB);
if (ret == -ENOENT && path) {
fprintf(stderr, "Can't open class names file: %s\n", path);
return -1; return -1;
} }
if (ret) {
db_names_free(cls_names);
cls_names = NULL;
}
return 0; return 0;
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment