PERFORCE change 125441 for review
Fredrik Lindberg
fli at FreeBSD.org
Mon Aug 20 10:35:29 PDT 2007
http://perforce.freebsd.org/chv.cgi?CH=125441
Change 125441 by fli at fli_nexus on 2007/08/20 17:35:23
- Add the ability to list names and resources.
- Tweak the syntax a bit on database manipulation routines.
Affected files ...
.. //depot/projects/soc2007/fli-mdns_sd/mdns/db.c#2 edit
.. //depot/projects/soc2007/fli-mdns_sd/mdns/mdns.c#4 edit
Differences ...
==== //depot/projects/soc2007/fli-mdns_sd/mdns/db.c#2 (text+ko) ====
@@ -42,6 +42,7 @@
enum {
DBCMD_ADD,
DBCMD_DEL,
+ DBCMD_LIST,
};
static int
@@ -203,6 +204,83 @@
return (0);
}
+static void
+getres(struct mdns *m, unsigned int ifidx, char *ident)
+{
+ ssize_t rlen, i;
+ const char *class, *type;
+ struct mdns_res *mr;
+
+ rlen = mdns_db_res_list(m, ident, ifidx, &mr);
+ if (rlen < 0) {
+ printf("Failed to obtain a list of resources\n");
+ return;
+ }
+
+ printf("Resources on identifier '%s'\n", ident);
+ for (i = 0; i < rlen; i++) {
+ class = mdns_ctoa(mr[i].mr_class);
+ type = mdns_ttoa(mr[i].mr_class, mr[i].mr_type);
+
+ printf("\t%d ", mr[i].mr_ttl);
+ if (class != NULL)
+ printf("%s ", class);
+ else
+ printf("%d ", mr[i].mr_class);
+
+ if (type != NULL)
+ printf("%s ", type);
+ else
+ printf("%d ", mr[i].mr_type);
+
+ printf("%ls", mr[i].mr_res);
+ if (mr[i].mr_ptr != NULL)
+ printf(" (pointer to '%s')", mr[i].mr_ptr);
+
+ printf("\n");
+ }
+ mdns_db_res_freelist(mr, rlen);
+}
+
+static int
+dblist(struct mdns *m, unsigned int ifidx, char *ident)
+{
+ struct mdns_name *mn;
+ int len, i, flag;
+ char *p;
+
+ len = mdns_db_name_list(m, ident, ifidx, &mn);
+ if (len < 0) {
+ printf("Failed to obtain list of names\n");
+ return (EXIT_FAILURE);
+ }
+ else if (len == 0) {
+ printf("Identifier have no names assigned\n");
+ getres(m, ifidx, ident);
+ return (0);
+ }
+
+ p = NULL;
+ flag = 0;
+ for (i = 0; i < len; i++) {
+ if (p == NULL || strcmp(p, mn[i].mn_ident) != 0) {
+ if (i > 0)
+ getres(m, ifidx, mn[i-1].mn_ident);
+
+ p = mn[i].mn_ident;
+ flag = 1;
+ printf("Names on identifier '%s'\n", p);
+ }
+ printf("\t%ls", mn[i].mn_name);
+ if (mn[i].mn_ename != NULL)
+ printf(" (%ls)", mn[i].mn_ename);
+ printf("\n");
+
+ }
+ getres(m, ifidx, mn[i-1].mn_ident);
+ return (0);
+}
+
int
db(struct mdns *m, int argc, char *argv[])
{
@@ -224,15 +302,18 @@
argc -= optind;
argv += optind;
- if (argc < 4)
- return (EXIT_FAILURE);
- ident = argv[0];
+ if (argc < 2)
+ ident = NULL;
+ else
+ ident = argv[1];
- if (strcasecmp(argv[1], "name") == 0)
+ if (strcasecmp(argv[0], "name") == 0 && ident != NULL)
error = dbname(m, ident, ifidx, argc - 2, argv + 2);
- else if (strcasecmp(argv[1], "res") == 0)
+ else if (strcasecmp(argv[0], "res") == 0 && ident != NULL)
error = dbres(m, ident, ifidx, argc - 2, argv + 2);
+ else if (strcasecmp(argv[0], "list") == 0)
+ error = dblist(m, ifidx, ident);
else {
printf("No such sub-command '%s'\n", argv[1]);
return (EXIT_FAILURE);
==== //depot/projects/soc2007/fli-mdns_sd/mdns/mdns.c#4 (text+ko) ====
@@ -46,9 +46,10 @@
printf("%s query [-v] [-i ifnam] [-f family] [-w sec] "
"[-c class] [-t type] name\n", exec);
- printf("%s db [-i ifnam] `ident' name [-s] add|del `host'\n", exec);
- printf("%s db [-i ifnam] `ident' res [-p] [-t ttl] add|del "
+ printf("%s db [-i ifnam] name `ident' [-s] add|del `host'\n", exec);
+ printf("%s db [-i ifnam] res `ident' [-p] [-t ttl] add|del "
"`class' `type' `res'\n", exec);
+ printf("%s db -i ifnam list [ident]\n", exec);
printf("%s cache [-i ifnam] view|flush\n", exec);
}
More information about the p4-projects
mailing list