/* * smackload - properly format smack access rules for * loading into the kernel by writing to /smack/load. * */ #include #include #include #include #include #include #define LSIZE 23 #define ASIZE 4 int main(int argc, char *argv[]) { int loadfd; char line[80]; char rule[LSIZE + LSIZE + ASIZE + 3]; char subject[LSIZE+1]; char object[LSIZE+1]; char accesses[ASIZE+1]; char real[ASIZE+1]; char *cp; int i; int err; loadfd = open("/smack/load", O_RDWR); if (loadfd < 0) { perror("opening /smack/load"); exit(1); } while (fgets(line, 80, stdin) != NULL) { err = 0; if ((cp = strchr(line, '\n')) != NULL) *cp = '\0'; if (sscanf(line,"%23s %23s %4s",subject,object,accesses) != 3) err = 1; else { strcpy(real, "----"); for (i = 0; i < ASIZE && accesses[i] != '\0' && err == 0; i++) { switch (accesses[i]) { case 'r': case 'R': real[0] = 'r'; break; case 'w': case 'W': real[1] = 'w'; break; case 'x': case 'X': real[2] = 'x'; break; case 'a': case 'A': real[3] = 'a'; break; case '\0': case '-': break; default: err = 1; break; } } } if (err == 0) { fprintf(stderr, "Good input line \"%s\"\n", line); sprintf(rule, "%-23s %-23s %4s", subject,object,real); fprintf(stderr, "Sending in line \"%s\"\n", rule); err = write(loadfd, rule, LSIZE + LSIZE + ASIZE + 2); if (err < 0) perror("writing /smack/load"); } else fprintf(stderr, "Bad input line \"%s\"\n", line); } exit(0); }