[Linux-decnet-commit] CVS: dnprogs/nml nml.c,1.4,1.5
Brought to you by:
chrissie_c,
ph3-der-loewe
From: Christine C. <chr...@us...> - 2008-09-06 13:53:05
|
Update of /cvsroot/linux-decnet/dnprogs/nml In directory sc8-pr-cvs1.sourceforge.net:/tmp/cvs-serv6638 Modified Files: nml.c Log Message: Show next (router) node Index: nml.c =================================================================== RCS file: /cvsroot/linux-decnet/dnprogs/nml/nml.c,v retrieving revision 1.4 retrieving revision 1.5 diff -C2 -r1.4 -r1.5 *** nml.c 6 Sep 2008 12:34:34 -0000 1.4 --- nml.c 6 Sep 2008 13:53:00 -0000 1.5 *************** *** 53,56 **** --- 53,58 ---- static struct rtnl_handle listen_rth; static int first_time = 1; + static int verbose; + static unsigned short router_node; #define MAX_ADJACENT_NODES 1024 *************** *** 98,101 **** --- 100,142 ---- } + + /* Get the router address from /proc */ + static unsigned short get_router(void) + { + char buf[256]; + char var1[32]; + char var2[32]; + char var3[32]; + char var4[32]; + char var5[32]; + char var6[32]; + char var7[32]; + char var8[32]; + char var9[32]; + char var10[32]; + char var11[32]; + unsigned short router = 0; + FILE *procfile = fopen("/proc/net/decnet_dev", "r"); + + if (!procfile) + return 0; + while (!feof(procfile)) + { + fgets(buf, sizeof(buf), procfile); + if (sscanf(buf, "%s %s %s %s %s %s %s %s %s ethernet %s\n", + var1,var2,var3,var4,var5,var6,var7,var8,var9,var11) == 10) + { + int area, node; + sscanf(var11, "%d.%d\n", &area, &node); + router = area<<10 | node; + break; + } + } + fclose(procfile); + if (verbose) + fprintf(stderr, "Router node is %x\n", router); + return router; + } + static int send_node(int sock, struct nodeent *n, int exec, char *device, int state) { *************** *** 126,134 **** --- 167,210 ---- /* Node State */ if (state != NODESTATE_UNKNOWN) { + struct nodeent *rn; + buf[ptr++] = 0; // Node state buf[ptr++] = 0; buf[ptr++] = 0x81; // Data type of 'state' buf[ptr++] = state; + + /* For reachable nodes show the next node, ie next router + it itself */ + if (state == NODESTATE_REACHABLE) { + if (((n->n_addr[0] | n->n_addr[1]<<8) & 0xFC00) != + (router_node & 0xFC00)) { + rn = getnodebyaddr((char *)&router_node, 2, AF_DECnet); + } + else { + rn = n; + } + + buf[ptr++] = 0x3e; // 830 NEXT NODE + buf[ptr++] = 0x03; + + buf[ptr++] = 0xc2; // What's this !? + buf[ptr++] = 0x02; // Data type + buf[ptr++] = rn->n_addr[0]; + buf[ptr++] = rn->n_addr[1]; + + buf[ptr++] = 0x40; // ASCII text + if (rn) { + makeupper(rn->n_name); + buf[ptr++] = strlen(rn->n_name); + strcpy(&buf[ptr], rn->n_name); + ptr += strlen(rn->n_name); + } + else { + buf[ptr++] = 0;// No Name + } + } } + + /* Show exec details, name etc */ if (exec) { struct utsname un; *************** *** 167,172 **** } ! /* Save a neighbour entry in a list so we can check it when doing the ! KNOWN NODES display */ static int save_neigh(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) --- 243,248 ---- } ! /* Save a neighbour entry in a list so we can check it when doing the ! KNOWN NODES display */ static int save_neigh(struct sockaddr_nl *who, struct nlmsghdr *n, void *arg) *************** *** 229,232 **** --- 305,310 ---- static int get_neighbour_nodes(int sock, neigh_fn_t neigh_fn) { + router_node = get_router(); + if (first_time) { *************** *** 339,342 **** --- 417,421 ---- int status; + verbose = verbosity; do { |