mirror of
https://github.com/OpenVPN/openvpn.git
synced 2026-05-28 04:03:29 -04:00
Implement ovpn version detection
Add detection of the ovpn kernel module type: if a backported (out-of-tree) version is loaded, the MODULE_VERSION string is read from sysfs; otherwise, for the in-tree module, the function reports the kernel release and version. Change-Id: I7fc033a7ffee73045316763356a95d75ef23f5ad Signed-off-by: Ralf Lici <ralf@mandelbit.com> Acked-by: Gert Doering <gert@greenie.muc.de> Message-Id: <20250515150038.30097-1-gert@greenie.muc.de> URL: https://www.mail-archive.com/openvpn-devel@lists.sourceforge.net/msg31652.html Signed-off-by: Gert Doering <gert@greenie.muc.de>
This commit is contained in:
parent
fef5c4b4e8
commit
f6c95ac2ff
1 changed files with 68 additions and 1 deletions
|
|
@ -1117,10 +1117,77 @@ dco_available(int msglevel)
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* There's no version indicator in the ovpn in-tree module, so we return a
|
||||
* string containing info about the kernel version and release.
|
||||
*/
|
||||
static const char *
|
||||
dco_version_string_in_tree(struct gc_arena *gc)
|
||||
{
|
||||
struct buffer buf = alloc_buf_gc(256, gc);
|
||||
struct utsname system;
|
||||
|
||||
if (uname(&system))
|
||||
{
|
||||
return "ERR";
|
||||
}
|
||||
|
||||
buf_puts(&buf, system.release);
|
||||
buf_puts(&buf, " ");
|
||||
buf_puts(&buf, system.version);
|
||||
return BSTR(&buf);
|
||||
}
|
||||
|
||||
/**
|
||||
* When the module is loaded, the backports version of ovpn has a version file
|
||||
* in sysfs. Read it and return the string.
|
||||
*
|
||||
* The caller is responsible for closing the file pointer.
|
||||
*/
|
||||
static const char *
|
||||
dco_version_string_backports(FILE *fp, struct gc_arena *gc)
|
||||
{
|
||||
char *str = gc_malloc(PATH_MAX, false, gc);
|
||||
|
||||
if (!fgets(str, PATH_MAX, fp))
|
||||
{
|
||||
return "ERR";
|
||||
}
|
||||
|
||||
/* remove potential newline at the end of the string */
|
||||
char *nl = strchr(str, '\n');
|
||||
if (nl)
|
||||
{
|
||||
*nl = '\0';
|
||||
}
|
||||
|
||||
return str;
|
||||
}
|
||||
|
||||
const char *
|
||||
dco_version_string(struct gc_arena *gc)
|
||||
{
|
||||
return "Unknown";
|
||||
const char *version;
|
||||
struct stat sb;
|
||||
FILE *fp;
|
||||
|
||||
if (stat("/sys/module/ovpn", &sb) != 0 || !S_ISDIR(sb.st_mode))
|
||||
{
|
||||
return "N/A";
|
||||
}
|
||||
|
||||
/* now that we know for sure that the module is loaded, if there's no
|
||||
* version file it means we're dealing with the in-tree version, otherwise
|
||||
* it's backports */
|
||||
fp = fopen("/sys/module/ovpn/version", "r");
|
||||
if (!fp)
|
||||
{
|
||||
return dco_version_string_in_tree(gc);
|
||||
}
|
||||
version = dco_version_string_backports(fp, gc);
|
||||
|
||||
fclose(fp);
|
||||
return version;
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
|||
Loading…
Reference in a new issue