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