|
|
1.1 ! root 1: %start input ! 2: ! 3: %{ ! 4: ! 5: #include "scsi.h" ! 6: ! 7: %} ! 8: ! 9: %token DISK ID RELEASE HELP SET EJECT INQUIRY READ CAPACITY SENSE ! 10: %token NUMBER EXT SIDEA SIDEB ALL RESET SLEEP START STOP STATUS ! 11: %token ECHO ERROR MEDIA WORM WRITE DIAGNOSTIC STRING COPY ! 12: ! 13: %type <str> STRING ! 14: %type <num> NUMBER drive side shelf ! 15: ! 16: %union { ! 17: char *str; ! 18: long num; ! 19: } ! 20: ! 21: %% ! 22: ! 23: input : /* nothing */ ! 24: | input line error '\n' ! 25: | input line '\n' ! 26: | input line ';' ! 27: | input line error ';' ! 28: ; ! 29: ! 30: /* ! 31: help can be done explicitly by :help info:: ! 32: */ ! 33: line : /* nothing */ ! 34: | CAPACITY drive { s_capacity($2, (long *)0, (long *)0); } ! 35: | COPY drive NUMBER NUMBER drive NUMBER {/*:COPY sdrive sstart nblocks ddrive dstart:: */ ! 36: s_copy($2, $3, $4, $5, $6); ! 37: } ! 38: | DIAGNOSTIC drive { s_drdiag($2); } ! 39: | DISK EJECT drive { s_diskeject($3); } ! 40: | DISK RELEASE drive shelf side { s_diskrelease($4, $5, $3, 1); } ! 41: | DISK RELEASE drive { s_diskrelease(-1, A, $3, 1); } ! 42: | DISK SET shelf side drive { s_diskset($3, $4, $5, 1); } ! 43: | ECHO NUMBER { print(">> %d <<\n", $2); } ! 44: | HELP { help(); } ! 45: | ID drive { scsiid($2); } ! 46: | INQUIRY { ! 47: int i; ! 48: for(i = 0; i<8; i++) ! 49: s_inquiry(scsi_id, i); ! 50: } ! 51: | INQUIRY drive { s_inquiry(scsi_id, $2); } ! 52: | MEDIA drive NUMBER NUMBER { s_media($2, $3, $4, 0); } ! 53: | MEDIA drive NUMBER NUMBER STRING { s_mediaf($2, $3, $4, $5); } /*:MEDIA drive start nblocks \"filename\"::*/ ! 54: | EXT MEDIA drive NUMBER NUMBER { s_media($3, $4, $5, 1); } ! 55: | READ drive NUMBER { ! 56: struct scsi_o output; ! 57: s_read($2, $3, 1, &output); ! 58: scsiodump(output.data, 1024); ! 59: } ! 60: | READ ID drive { ! 61: struct scsi_o output; ! 62: s_read($3, 1, 1, &output); ! 63: print("id='%s'\n", &output.data[42]); ! 64: } ! 65: | RESET { s_reset(); } ! 66: | SENSE drive { s_sense($2, 0); } ! 67: | EXT SENSE drive { s_sense($3, 1); } ! 68: | SLEEP NUMBER { sleep($2); } ! 69: | START drive { s_start($2); } ! 70: | STATUS drive { s_status($2, (struct scsi_o *)0); } ! 71: | STATUS { s_status(0, (struct scsi_o *)0); } ! 72: | STOP drive { s_stop($2); } ! 73: | WORM drive { s_worm($2, 1); } ! 74: | WORM drive NUMBER { s_worm($2, $3); } /*:WORM drive start:: */ ! 75: | WRITE drive NUMBER { s_write($2, $3, 1); } ! 76: | WRITE drive NUMBER NUMBER { s_write($2, $3, $4); } /*:WRITE drive start n:: */ ! 77: ; ! 78: ! 79: drive : NUMBER ! 80: ; ! 81: ! 82: shelf : NUMBER ! 83: ; ! 84: ! 85: side : SIDEA { $$ = 0; } ! 86: | SIDEB { $$ = 1; } ! 87: ; ! 88: ! 89: %% ! 90: ! 91: yywrap() ! 92: { ! 93: return(1); ! 94: } ! 95: ! 96: yyerror(s1, s2) ! 97: char *s1, *s2; ! 98: { ! 99: fprint(2, s1, s2); ! 100: fprint(2, "\n"); ! 101: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.