|
@@ -5517,35 +5517,67 @@ microdescs_parse_from_string(const char *s, const char *eos,
|
|
|
* the router is at least as new as the cutoff, else return 0.
|
|
|
*/
|
|
|
int
|
|
|
-tor_version_as_new_as(const char *platform, const char *cutoff)
|
|
|
+tor_version_parse_platform(const char *platform,
|
|
|
+ tor_version_t *router_version,
|
|
|
+ int strict)
|
|
|
{
|
|
|
- tor_version_t cutoff_version, router_version;
|
|
|
- char *s, *s2, *start;
|
|
|
char tmp[128];
|
|
|
+ char *s, *s2, *start;
|
|
|
|
|
|
- tor_assert(platform);
|
|
|
-
|
|
|
- if (tor_version_parse(cutoff, &cutoff_version)<0) {
|
|
|
- log_warn(LD_BUG,"cutoff version '%s' unparseable.",cutoff);
|
|
|
+ if (strcmpstart(platform,"Tor "))
|
|
|
return 0;
|
|
|
- }
|
|
|
- if (strcmpstart(platform,"Tor "))
|
|
|
- return 1;
|
|
|
|
|
|
start = (char *)eat_whitespace(platform+3);
|
|
|
- if (!*start) return 0;
|
|
|
+ if (!*start) return -1;
|
|
|
s = (char *)find_whitespace(start);
|
|
|
s2 = (char*)eat_whitespace(s);
|
|
|
if (!strcmpstart(s2, "(r") || !strcmpstart(s2, "(git-"))
|
|
|
s = (char*)find_whitespace(s2);
|
|
|
|
|
|
if ((size_t)(s-start+1) >= sizeof(tmp))
|
|
|
- return 0;
|
|
|
+ return -1;
|
|
|
strlcpy(tmp, start, s-start+1);
|
|
|
|
|
|
- if (tor_version_parse(tmp, &router_version)<0) {
|
|
|
+ if (tor_version_parse(tmp, router_version)<0) {
|
|
|
log_info(LD_DIR,"Router version '%s' unparseable.",tmp);
|
|
|
- return 1;
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+
|
|
|
+ if (strict) {
|
|
|
+ if (router_version->major < 0 ||
|
|
|
+ router_version->minor < 0 ||
|
|
|
+ router_version->minor < 0 ||
|
|
|
+ router_version->patchlevel < 0 ||
|
|
|
+ router_version->svn_revision < 0) {
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ return 1;
|
|
|
+}
|
|
|
+
|
|
|
+
|
|
|
+ * and compare it to the version in <b>cutoff</b>. Return 1 if
|
|
|
+ * the router is at least as new as the cutoff, else return 0.
|
|
|
+ */
|
|
|
+int
|
|
|
+tor_version_as_new_as(const char *platform, const char *cutoff)
|
|
|
+{
|
|
|
+ tor_version_t cutoff_version, router_version;
|
|
|
+ int r;
|
|
|
+ tor_assert(platform);
|
|
|
+
|
|
|
+ if (tor_version_parse(cutoff, &cutoff_version)<0) {
|
|
|
+ log_warn(LD_BUG,"cutoff version '%s' unparseable.",cutoff);
|
|
|
+ return 0;
|
|
|
+ }
|
|
|
+
|
|
|
+ r = tor_version_parse_platform(platform, &router_version, 0);
|
|
|
+ if (r == 0) {
|
|
|
+
|
|
|
+ return 1;
|
|
|
+ } else if (r < 0) {
|
|
|
+
|
|
|
+ return 1;
|
|
|
}
|
|
|
|
|
|
|