|
|
1.1 ! root 1: /* checkperms.y ! 2: * yacc grammar to read permissions description files. ! 3: * part of uucheck. ! 4: */ ! 5: ! 6: %token FOREACH PATHNAME STRING INDENT UNINDENT NL ERROR_TOKEN WARNING_TOKEN ! 7: %token EXIST OWNER GROUP CHMOD_PERMISSION NUMBER ! 8: %token FILE_TOKEN DIRECTORY PIPE CHARACTER_SPECIAL BLOCK_SPECIAL ! 9: %start statement_list ! 10: %% ! 11: ! 12: statement_list : statement ! 13: | statement_list statement ! 14: ; ! 15: ! 16: statement : foreach_block ! 17: | path_block ! 18: | message_statement NL ! 19: | NL /* Blank line is nop. */ ! 20: | error NL ! 21: {yyerrok;} ! 22: ; ! 23: ! 24: /* This is our looping construct--it runs through all possible hosts. */ ! 25: foreach_block : foreach_declarator NL block { ! 26: /* Put lost character back into stdin. */ ! 27: my_ungetchar(delayed_char); ! 28: #ifdef DEBUG ! 29: printf("%d: finished foreach_block.\n", lineno); ! 30: #endif /* DEBUG */ ! 31: } /* finish a foreach_block */ ! 32: ; ! 33: ! 34: foreach_declarator : FOREACH string { ! 35: if(host_looping) { ! 36: FATAL("%d: foreach can not nest.", ! 37: lineno); ! 38: } else { ! 39: #ifdef DEBUG ! 40: /* DEBUG */ printf("%d: Foreach identified\n", lineno); ! 41: #endif /* DEBUG */ ! 42: host_looping = TRUE; ! 43: current_host = first_host($2); ! 44: saving_to_monitor_file = TRUE; ! 45: reading_from_monitor_file = FALSE; ! 46: open_monitor_file(); /* Start saving input. */ ! 47: } /* if host_looping */ ! 48: } /* FOREACH */ ! 49: ; ! 50: ! 51: /* There's one of these for each file. */ ! 52: path_block : path_declarator NL block { ! 53: /* Once beyond the scope of a path_block, make sure ! 54: * that there is no current_path set. ! 55: */ ! 56: free(current_path); ! 57: current_path = NULL; ! 58: } /* path_block */ ! 59: ; ! 60: ! 61: path_declarator : PATHNAME string { ! 62: if(host_looping) { ! 63: /* We need to build a whole pathname. */ ! 64: current_path = malloc(strlen(current_host)+ ! 65: strlen($2) + 1 ); ! 66: /* Insert the current host into the ! 67: * partial path provided. */ ! 68: sprintf(current_path, $2, current_host); ! 69: } else { ! 70: if(current_path != NULL) { ! 71: FATAL("%d: pathnames can not be nested.\n", ! 72: lineno); ! 73: } /* if there is a current path */ ! 74: copy_str(¤t_path, $2); ! 75: } /* if in a loop of host names */ ! 76: ! 77: /* Now that we have a full pathname, we can build ! 78: * a stat structure for it. ! 79: */ ! 80: if (stat(current_path, ¤t_stat) == -1){ ! 81: #ifdef DEBUG ! 82: /* DEBUG */ printf("Can not stat %s.\n", current_path); ! 83: #endif /* DEBUG */ ! 84: it_exists = FALSE; ! 85: } /* if stat failed */ ! 86: else { ! 87: #ifdef DEBUG ! 88: /* DEBUG */ printf("Just stat ed %s.\n", current_path); ! 89: #endif /* DEBUG */ ! 90: it_exists = TRUE; ! 91: } /* else stat succeeded */ ! 92: sprintf(bigbuf, "Examining %s.\n", current_path); ! 93: REALLYVERBOSE(bigbuf); ! 94: } ! 95: ; ! 96: ! 97: block : INDENT statement_list UNINDENT ! 98: | /* nothing--blocks are optional */ ! 99: ; ! 100: ! 101: message_statement : message_type check_type string { ! 102: #ifdef DEBUG ! 103: /* DEBUG */ printf("%d: Message %d, Check %d, String: %s\n", ! 104: lineno, $1, $2, $3); ! 105: #endif /* DEBUG */ ! 106: do_check($1, $2, $3); ! 107: } /* message_type check_type */ ! 108: | message_type check_type { ! 109: #ifdef DEBUG ! 110: /* DEBUG */ printf("%d: Message %d, Check %d\n", ! 111: lineno, $1, $2); ! 112: #endif ! 113: do_check($1, $2, NULL); ! 114: } /* message_type check_type */ ! 115: ; ! 116: ! 117: /* Should this generate error, or warning messages? */ ! 118: message_type : ERROR_TOKEN ! 119: {$$ = ERROR_TOKEN;} ! 120: | WARNING_TOKEN ! 121: {$$ = WARNING_TOKEN;} ! 122: ; ! 123: ! 124: /* What are we checking about the file? */ ! 125: check_type : existence ! 126: {$$=$1;} ! 127: | file_type ! 128: {$$=$1;} ! 129: | ownership ! 130: {$$=$1;} ! 131: | groupship ! 132: {$$=$1;} ! 133: | CHMOD_PERMISSION { ! 134: $$=CHMOD_PERMISSION; ! 135: } /* CHMOD_PERMISSION */ ! 136: ; ! 137: ! 138: existence : EXIST ! 139: {$$=EXIST;} ! 140: ; ! 141: ! 142: file_type : FILE_TOKEN ! 143: {$$=FILE_TOKEN;} ! 144: | DIRECTORY ! 145: {$$=DIRECTORY;} ! 146: | PIPE ! 147: {$$=PIPE;} ! 148: | CHARACTER_SPECIAL ! 149: {$$=CHARACTER_SPECIAL;} ! 150: | BLOCK_SPECIAL ! 151: {$$=BLOCK_SPECIAL;} ! 152: ; ! 153: ! 154: ownership : OWNER string { ! 155: $$=OWNER; ! 156: copy_str(&id_string, $2); ! 157: } /* ownership */ ! 158: ; ! 159: ! 160: groupship : GROUP string { ! 161: $$=GROUP; ! 162: copy_str(&id_string, $2); ! 163: } /* groupship */ ! 164: ; ! 165: ! 166: string : STRING { ! 167: $$=ret_string; ! 168: ret_string = NULL; ! 169: } /* string */ ! 170: ; ! 171: ! 172: number : NUMBER { ! 173: $$ = ret_number; ! 174: } /* number */ ! 175: ; ! 176: %% ! 177: ! 178: #include <stdio.h> ! 179: #include "checkperms.h" ! 180: #include "monitor.h" ! 181: ! 182: yyerror (s) ! 183: char *s; ! 184: { ! 185: fprintf (stderr, "line %d: %s, Token: %d\n", lineno, s, yychar); ! 186: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.