1 #include <unistd.h> 2 #include <fcntl.h> 3 #include <sys/stat.h> 4 #include <string.h> 5 #include "selinux_internal.h" 6 #include <stdio.h> 7 #include <stdlib.h> 8 #include <ctype.h> 9 #include <errno.h> 10 #include <limits.h> 11 #include <regex.h> 12 #include <stdarg.h> 13 matchmediacon(const char * media,char ** con)14int matchmediacon(const char *media, char ** con) 15 { 16 const char *path = selinux_media_context_path(); 17 FILE *infile; 18 char *ptr, *ptr2 = NULL; 19 int found = 0; 20 char current_line[PATH_MAX]; 21 if ((infile = fopen(path, "re")) == NULL) 22 return -1; 23 while (!feof_unlocked(infile)) { 24 if (!fgets_unlocked(current_line, sizeof(current_line), infile)) { 25 return -1; 26 } 27 if (current_line[strlen(current_line) - 1]) 28 current_line[strlen(current_line) - 1] = 0; 29 /* Skip leading whitespace before the partial context. */ 30 ptr = current_line; 31 while (*ptr && isspace(*ptr)) 32 ptr++; 33 34 if (!(*ptr)) 35 continue; 36 37 /* Find the end of the media context. */ 38 ptr2 = ptr; 39 while (*ptr2 && !isspace(*ptr2)) 40 ptr2++; 41 if (!(*ptr2)) 42 continue; 43 44 *ptr2++ = 0; 45 if (strcmp(media, ptr) == 0) { 46 found = 1; 47 break; 48 } 49 } 50 fclose(infile); 51 if (!found) 52 return -1; 53 54 /* Skip whitespace. */ 55 while (*ptr2 && isspace(*ptr2)) 56 ptr2++; 57 if (!(*ptr2)) { 58 return -1; 59 } 60 61 if (selinux_raw_to_trans_context(ptr2, con)) { 62 *con = NULL; 63 return -1; 64 } 65 66 return 0; 67 } 68