/* * smackcipso - properly format smack access cipsos for * loading into the kernel by writing to /smack/cipso. * */ #include #include #include #include #include #include #include #define LSIZE 23 #define NSIZE 4 #define MAXCATNUM 239 #define MAXCATVAL 63 #define MAXLEVEL 255 int main(int argc, char *argv[]) { int cipsofd; char line[512]; char cipso[LSIZE + NSIZE + NSIZE + (NSIZE * MAXCATNUM)]; char smack[LSIZE+1]; char cats[MAXCATNUM+1][NSIZE+1]; char *cp; int level; int cat; int catcount; int i; int err; cipsofd = open("/smack/cipso", O_RDWR); if (cipsofd < 0) { perror("opening /smack/cipso"); exit(1); } while (fgets(line, sizeof(line), stdin) != NULL) { catcount = 0; err = 0; if ((cp = strchr(line, '\n')) == NULL) { fprintf(stderr, "Bad input line \"%s\"\n", line); continue; } *cp = '\0'; cp = strtok(line, " \t"); if (cp == NULL) { fprintf(stderr, "Bad input line \"%s\"\n", line); continue; } sprintf(cipso, "%-23s ", line); if (strlen(cipso) != 24) { fprintf(stderr, "Bad input line \"%s\"\n", line); continue; } cp = strtok(NULL, " \t"); if (cp == NULL || !isdigit(*cp)) { fprintf(stderr, "Bad input line \"%s\"\n", line); continue; } level = atoi(cp); if (level > MAXLEVEL) { fprintf(stderr, "Bad input line \"%s\"\n", line); continue; } sprintf(cipso+LSIZE+1, "%-4d", level); cp = strtok(NULL, " \t"); for (i = 0; cp != NULL; cp = strtok(NULL, " \t"), i++) { if (!isdigit(*cp)) { fprintf(stderr, "Bad cat \"%s\"\n", cp); err = 1; break; } cat = atoi(cp); if (i >= MAXCATNUM) { fprintf(stderr, "Maximum number of categories exceeded" "\"%s\"\n"); err = 1; break; } if (cat > MAXCATVAL) { fprintf(stderr, "Bad cat \"%s\"\n", cp); err = 1; break; } sprintf(cats[i], "%-4d", cat); } if (err) continue; sprintf(cipso+LSIZE+1+NSIZE, "%-4d", i); while (i > 0) strcat(cipso, cats[--i]); err = write(cipsofd, cipso, strlen(cipso)); if (err < 0) perror("writing /smack/cipso"); fprintf(stderr, "Good line \"%s\"\n", cipso); } exit(0); }