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