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