16cd6a6acSopenharmony_ci#include <unistd.h> 26cd6a6acSopenharmony_ci#include <stdlib.h> 36cd6a6acSopenharmony_ci#include <string.h> 46cd6a6acSopenharmony_ci#include <stdio.h> 56cd6a6acSopenharmony_ci#include <ctype.h> 66cd6a6acSopenharmony_ci#include "selinux_internal.h" 76cd6a6acSopenharmony_ci#include "context_internal.h" 86cd6a6acSopenharmony_ci 96cd6a6acSopenharmony_ciint selinux_check_securetty_context(const char * tty_context) 106cd6a6acSopenharmony_ci{ 116cd6a6acSopenharmony_ci char *line = NULL; 126cd6a6acSopenharmony_ci char *start, *end = NULL; 136cd6a6acSopenharmony_ci size_t line_len = 0; 146cd6a6acSopenharmony_ci ssize_t len; 156cd6a6acSopenharmony_ci int found = -1; 166cd6a6acSopenharmony_ci FILE *fp; 176cd6a6acSopenharmony_ci fp = fopen(selinux_securetty_types_path(), "re"); 186cd6a6acSopenharmony_ci if (fp) { 196cd6a6acSopenharmony_ci context_t con = context_new(tty_context); 206cd6a6acSopenharmony_ci if (con) { 216cd6a6acSopenharmony_ci const char *type = context_type_get(con); 226cd6a6acSopenharmony_ci while ((len = getline(&line, &line_len, fp)) != -1) { 236cd6a6acSopenharmony_ci 246cd6a6acSopenharmony_ci if (line[len - 1] == '\n') 256cd6a6acSopenharmony_ci line[len - 1] = 0; 266cd6a6acSopenharmony_ci 276cd6a6acSopenharmony_ci /* Skip leading whitespace. */ 286cd6a6acSopenharmony_ci start = line; 296cd6a6acSopenharmony_ci while (*start && isspace(*start)) 306cd6a6acSopenharmony_ci start++; 316cd6a6acSopenharmony_ci if (!(*start)) 326cd6a6acSopenharmony_ci continue; 336cd6a6acSopenharmony_ci 346cd6a6acSopenharmony_ci end = start; 356cd6a6acSopenharmony_ci while (*end && !isspace(*end)) 366cd6a6acSopenharmony_ci end++; 376cd6a6acSopenharmony_ci if (*end) 386cd6a6acSopenharmony_ci *end++ = 0; 396cd6a6acSopenharmony_ci if (!strcmp(type, start)) { 406cd6a6acSopenharmony_ci found = 0; 416cd6a6acSopenharmony_ci break; 426cd6a6acSopenharmony_ci } 436cd6a6acSopenharmony_ci } 446cd6a6acSopenharmony_ci free(line); 456cd6a6acSopenharmony_ci context_free(con); 466cd6a6acSopenharmony_ci } 476cd6a6acSopenharmony_ci fclose(fp); 486cd6a6acSopenharmony_ci } 496cd6a6acSopenharmony_ci 506cd6a6acSopenharmony_ci return found; 516cd6a6acSopenharmony_ci} 526cd6a6acSopenharmony_ci 53