From 5ab6c9fa9323a9e7648e7bc3fda49597b6f24015 Mon Sep 17 00:00:00 2001 From: david Date: Fri, 1 Feb 2013 05:01:59 +0000 Subject: [PATCH] Sort by metric. --- libnetutil/netutil.cc | 13 +++++++++---- 1 file changed, 9 insertions(+), 4 deletions(-) diff --git a/libnetutil/netutil.cc b/libnetutil/netutil.cc index 91b471eed..be5ee8c61 100644 --- a/libnetutil/netutil.cc +++ b/libnetutil/netutil.cc @@ -1199,8 +1199,8 @@ void tcppacketoptinfo(u8 *optp, int len, char *result, int bufsize) { -/* A trivial function used with qsort to sort the routes by netmask */ -static int nmaskcmp(const void *a, const void *b) { +/* A trivial function used with qsort to sort the routes by metric and netmask */ +static int routecmp(const void *a, const void *b) { struct sys_route *r1 = (struct sys_route *) a; struct sys_route *r2 = (struct sys_route *) b; if (r1->dest.ss_family < r2->dest.ss_family) @@ -1208,6 +1208,11 @@ static int nmaskcmp(const void *a, const void *b) { else if (r1->dest.ss_family > r2->dest.ss_family) return 1; + if (r1->metric < r2->metric) + return -1; + else if (r1->metric > r2->metric) + return 1; + if (r1->netmask_bits < r2->netmask_bits) return 1; else if (r1->netmask_bits > r2->netmask_bits) @@ -1692,8 +1697,8 @@ struct sys_route *getsysroutes(int *howmany, char *errstr, size_t errstrlen) { return NULL; }else{ numroutes = *howmany; - /* Ensure that the route array is sorted by netmask */ - qsort(routes, numroutes, sizeof(routes[0]), nmaskcmp); + /* Ensure that the route array is sorted by metric and netmask */ + qsort(routes, numroutes, sizeof(routes[0]), routecmp); } return routes; }