auc: compare versions using dpkg/opkg's verrevcmp
Using strcmp() to compare a version string doesn't work well.
Use verrevcmp() function from opkg instead.
Signed-off-by: Daniel Golle <daniel@makrotopia.org>
(cherry picked from commit 794cf3ac59
,
as it was previously skipped also switch PKG_REVISION back to manual
to keep it in sync with master branch)
This commit is contained in:
parent
92744fd598
commit
f69d625ac4
3 changed files with 56 additions and 3 deletions
|
@ -6,7 +6,7 @@ include $(TOPDIR)/rules.mk
|
||||||
|
|
||||||
PKG_NAME:=auc
|
PKG_NAME:=auc
|
||||||
PKG_VERSION:=0.1.7
|
PKG_VERSION:=0.1.7
|
||||||
PKG_RELEASE:=$(AUTORELEASE)
|
PKG_RELEASE:=1
|
||||||
PKG_LICENSE:=GPL-3.0
|
PKG_LICENSE:=GPL-3.0
|
||||||
|
|
||||||
include $(INCLUDE_DIR)/package.mk
|
include $(INCLUDE_DIR)/package.mk
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
cmake_minimum_required(VERSION 2.6)
|
cmake_minimum_required(VERSION 2.6...3.12)
|
||||||
|
|
||||||
PROJECT(auc C)
|
PROJECT(auc C)
|
||||||
ADD_DEFINITIONS(-Os -ggdb -Wall --std=gnu99 -Wmissing-declarations)
|
ADD_DEFINITIONS(-Os -ggdb -Wall --std=gnu99 -Wmissing-declarations)
|
||||||
|
|
|
@ -17,6 +17,7 @@
|
||||||
#define AUC_VERSION "unknown"
|
#define AUC_VERSION "unknown"
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <ctype.h>
|
||||||
#include <errno.h>
|
#include <errno.h>
|
||||||
#include <fcntl.h>
|
#include <fcntl.h>
|
||||||
#include <dlfcn.h>
|
#include <dlfcn.h>
|
||||||
|
@ -361,6 +362,58 @@ static int load_config() {
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* libdpkg - Debian packaging suite library routines
|
||||||
|
* vercmp.c - comparison of version numbers
|
||||||
|
*
|
||||||
|
* Copyright (C) 1995 Ian Jackson <iwj10@cus.cam.ac.uk>
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* assume ascii; warning: evaluates x multiple times! */
|
||||||
|
#define order(x) ((x) == '~' ? -1 \
|
||||||
|
: isdigit((x)) ? 0 \
|
||||||
|
: !(x) ? 0 \
|
||||||
|
: isalpha((x)) ? (x) \
|
||||||
|
: (x) + 256)
|
||||||
|
|
||||||
|
static int verrevcmp(const char *val, const char *ref)
|
||||||
|
{
|
||||||
|
if (!val)
|
||||||
|
val = "";
|
||||||
|
if (!ref)
|
||||||
|
ref = "";
|
||||||
|
|
||||||
|
while (*val || *ref) {
|
||||||
|
int first_diff = 0;
|
||||||
|
|
||||||
|
while ((*val && !isdigit(*val)) || (*ref && !isdigit(*ref))) {
|
||||||
|
int vc = order(*val), rc = order(*ref);
|
||||||
|
if (vc != rc)
|
||||||
|
return vc - rc;
|
||||||
|
val++;
|
||||||
|
ref++;
|
||||||
|
}
|
||||||
|
|
||||||
|
while (*val == '0')
|
||||||
|
val++;
|
||||||
|
while (*ref == '0')
|
||||||
|
ref++;
|
||||||
|
while (isdigit(*val) && isdigit(*ref)) {
|
||||||
|
if (!first_diff)
|
||||||
|
first_diff = *val - *ref;
|
||||||
|
val++;
|
||||||
|
ref++;
|
||||||
|
}
|
||||||
|
if (isdigit(*val))
|
||||||
|
return 1;
|
||||||
|
if (isdigit(*ref))
|
||||||
|
return -1;
|
||||||
|
if (first_diff)
|
||||||
|
return first_diff;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* UBUS response callbacks
|
* UBUS response callbacks
|
||||||
|
@ -414,7 +467,7 @@ static void pkglist_check_cb(struct ubus_request *req, int type, struct blob_att
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
cmpres = strcmp(blobmsg_get_string(cur), pkg->version);
|
cmpres = verrevcmp(blobmsg_get_string(cur), pkg->version);
|
||||||
if (cmpres < 0)
|
if (cmpres < 0)
|
||||||
*status |= PKG_UPGRADE;
|
*status |= PKG_UPGRADE;
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue