16cd6a6acSopenharmony_ci#include <unistd.h>
26cd6a6acSopenharmony_ci#include <sys/types.h>
36cd6a6acSopenharmony_ci#include <fcntl.h>
46cd6a6acSopenharmony_ci#include <stdlib.h>
56cd6a6acSopenharmony_ci#include <errno.h>
66cd6a6acSopenharmony_ci#include <string.h>
76cd6a6acSopenharmony_ci#include "selinux_internal.h"
86cd6a6acSopenharmony_ci#include <stdio.h>
96cd6a6acSopenharmony_ci#include "policy.h"
106cd6a6acSopenharmony_ci#include <limits.h>
116cd6a6acSopenharmony_ci
126cd6a6acSopenharmony_ciint security_policyvers(void)
136cd6a6acSopenharmony_ci{
146cd6a6acSopenharmony_ci	int fd, ret;
156cd6a6acSopenharmony_ci	char path[PATH_MAX];
166cd6a6acSopenharmony_ci	char buf[20];
176cd6a6acSopenharmony_ci	unsigned vers = DEFAULT_POLICY_VERSION;
186cd6a6acSopenharmony_ci
196cd6a6acSopenharmony_ci	if (!selinux_mnt) {
206cd6a6acSopenharmony_ci		errno = ENOENT;
216cd6a6acSopenharmony_ci		return -1;
226cd6a6acSopenharmony_ci	}
236cd6a6acSopenharmony_ci
246cd6a6acSopenharmony_ci	snprintf(path, sizeof path, "%s/policyvers", selinux_mnt);
256cd6a6acSopenharmony_ci	fd = open(path, O_RDONLY | O_CLOEXEC);
266cd6a6acSopenharmony_ci	if (fd < 0) {
276cd6a6acSopenharmony_ci		if (errno == ENOENT)
286cd6a6acSopenharmony_ci			return vers;
296cd6a6acSopenharmony_ci		else
306cd6a6acSopenharmony_ci			return -1;
316cd6a6acSopenharmony_ci	}
326cd6a6acSopenharmony_ci	memset(buf, 0, sizeof buf);
336cd6a6acSopenharmony_ci	ret = read(fd, buf, sizeof buf - 1);
346cd6a6acSopenharmony_ci	close(fd);
356cd6a6acSopenharmony_ci	if (ret < 0)
366cd6a6acSopenharmony_ci		return -1;
376cd6a6acSopenharmony_ci
386cd6a6acSopenharmony_ci	if (sscanf(buf, "%u", &vers) != 1)
396cd6a6acSopenharmony_ci		return -1;
406cd6a6acSopenharmony_ci
416cd6a6acSopenharmony_ci	return vers;
426cd6a6acSopenharmony_ci}
436cd6a6acSopenharmony_ci
44