My girl would be so proud of me
This commit is contained in:
		
							parent
							
								
									f70d13c541
								
							
						
					
					
						commit
						bb0363a1a2
					
				
					 1 changed files with 80 additions and 31 deletions
				
			
		|  | @ -23,10 +23,10 @@ static void usage(int argc, char **argv, const char *message, ...) { | |||
|     exit(1); | ||||
| } | ||||
| 
 | ||||
| static ssize_t handle_options(hexagram_pcapng_stream *stream, | ||||
|                               uint32_t type, | ||||
|                               uint16_t code, | ||||
|                               uint16_t len) { | ||||
| static ssize_t handle_option(hexagram_pcapng_stream *stream, | ||||
|                              uint32_t type, | ||||
|                              uint16_t code, | ||||
|                              uint16_t len) { | ||||
|     ssize_t readlen; | ||||
|     uint8_t data[65535]; | ||||
| 
 | ||||
|  | @ -50,40 +50,59 @@ error_io: | |||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| static ssize_t handle_block(hexagram_pcapng_stream *stream, | ||||
|                             uint32_t type, | ||||
|                             size_t len) { | ||||
|     hexagram_pcapng_packet header; | ||||
|     uint8_t body[65535]; | ||||
| static ssize_t handle_block_if(hexagram_pcapng_stream *stream, | ||||
|                                uint32_t type, | ||||
|                                size_t len) { | ||||
|     hexagram_pcapng_if iface; | ||||
| 
 | ||||
|     ssize_t readlen, | ||||
|             total = 0; | ||||
| 
 | ||||
|     size_t remaining = len; | ||||
| 
 | ||||
|     ssize_t total = 0, | ||||
|             readlen; | ||||
| 
 | ||||
|     /*
 | ||||
|      * If we've received anything other than a packet block, then seek past | ||||
|      * that data and move on. | ||||
|      * Read the interface block header. | ||||
|      */ | ||||
|     if (type != HEXAGRAM_PCAPNG_BLOCK_PACKET) { | ||||
|         printf("Read block type %08"PRIx32" len %zu\n", | ||||
|             type, len); | ||||
|     if ((readlen = read(stream->fd, &iface, sizeof(iface))) < 0) { | ||||
|         stream->error = HEXAGRAM_PCAPNG_ERROR_IO; | ||||
| 
 | ||||
|         if ((readlen = lseek(stream->fd, len, SEEK_CUR)) < 0) { | ||||
|             perror("lseek()"); | ||||
| 
 | ||||
|             goto error_io; | ||||
|         } | ||||
| 
 | ||||
|         return readlen; | ||||
|         goto error_io; | ||||
|     } else { | ||||
|         remaining -= readlen; | ||||
|         total     += readlen; | ||||
|     } | ||||
| 
 | ||||
|     if ((readlen = hexagram_pcapng_read_options(stream, handle_option, type, remaining)) < 0) { | ||||
|         stream->error = HEXAGRAM_PCAPNG_ERROR_IO; | ||||
| 
 | ||||
|         goto error_io; | ||||
|     } else { | ||||
|         total += readlen; | ||||
|     } | ||||
| 
 | ||||
|     return total; | ||||
| 
 | ||||
| error_io: | ||||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| static ssize_t handle_block_packet(hexagram_pcapng_stream *stream, | ||||
|                                    uint32_t type, | ||||
|                                    size_t len) { | ||||
|     hexagram_pcapng_packet header; | ||||
|     uint8_t body[65535]; | ||||
| 
 | ||||
|     ssize_t readlen, | ||||
|             total = 0; | ||||
| 
 | ||||
|     size_t remaining = len; | ||||
| 
 | ||||
|     /*
 | ||||
|      * Otherwise, read the packet block header so that we may determine the | ||||
|      * size of the payload to continue to read. | ||||
|      * Read the packet block header so that we may determine the size of the | ||||
|      * payload to continue to read. | ||||
|      */ | ||||
|     if ((readlen = read(stream->fd, &header, sizeof(header))) < 0) { | ||||
|         perror("read()"); | ||||
|         stream->error = HEXAGRAM_PCAPNG_ERROR_IO; | ||||
| 
 | ||||
|         goto error_io; | ||||
|     } else { | ||||
|  | @ -95,7 +114,7 @@ static ssize_t handle_block(hexagram_pcapng_stream *stream, | |||
|      * Read the packet body into our scratchpad. | ||||
|      */ | ||||
|     if ((readlen = read(stream->fd, &body, header.caplen)) < 0) { | ||||
|         perror("read()"); | ||||
|         stream->error = HEXAGRAM_PCAPNG_ERROR_IO; | ||||
| 
 | ||||
|         goto error_io; | ||||
|     } else { | ||||
|  | @ -110,7 +129,7 @@ static ssize_t handle_block(hexagram_pcapng_stream *stream, | |||
|         size_t padding = sizeof(uint32_t) - (header.caplen % sizeof(uint32_t)); | ||||
| 
 | ||||
|         if (lseek(stream->fd, padding, SEEK_CUR) < 0) { | ||||
|             perror("lseek()"); | ||||
|             stream->error = HEXAGRAM_PCAPNG_ERROR_IO; | ||||
| 
 | ||||
|             goto error_io; | ||||
|         } else { | ||||
|  | @ -123,10 +142,12 @@ static ssize_t handle_block(hexagram_pcapng_stream *stream, | |||
|      * The remaining data here should be pcapng option values, and since we do | ||||
|      * not presently require them, we can safely seek past them. | ||||
|      */ | ||||
|     if ((readlen = hexagram_pcapng_read_options(stream, handle_options, type, remaining)) < 0) { | ||||
|     if (lseek(stream->fd, remaining, SEEK_CUR) < 0) { | ||||
|         stream->error = HEXAGRAM_PCAPNG_ERROR_IO; | ||||
| 
 | ||||
|         goto error_io; | ||||
|     } else { | ||||
|         total += readlen; | ||||
|         total += remaining; | ||||
|     } | ||||
| 
 | ||||
|     stream->error = HEXAGRAM_PCAPNG_ERROR_OK; | ||||
|  | @ -139,6 +160,34 @@ error_io: | |||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| static ssize_t handle_block(hexagram_pcapng_stream *stream, | ||||
|                             uint32_t type, | ||||
|                             size_t len) { | ||||
|     switch (type) { | ||||
|         case HEXAGRAM_PCAPNG_BLOCK_IF: | ||||
|             return handle_block_if(stream, type, len); | ||||
| 
 | ||||
|         case HEXAGRAM_PCAPNG_BLOCK_PACKET: | ||||
|             return handle_block_packet(stream, type, len); | ||||
| 
 | ||||
|         default: break; | ||||
|     } | ||||
| 
 | ||||
|     printf("Read block type %08"PRIx32" len %zu\n", | ||||
|         type, len); | ||||
| 
 | ||||
|     if (lseek(stream->fd, len, SEEK_CUR) < 0) { | ||||
|         stream->error = HEXAGRAM_PCAPNG_ERROR_IO; | ||||
| 
 | ||||
|         goto error_io; | ||||
|     } | ||||
| 
 | ||||
|     return len; | ||||
| 
 | ||||
| error_io: | ||||
|     return -1; | ||||
| } | ||||
| 
 | ||||
| int main(int argc, char **argv) { | ||||
|     int fd; | ||||
|     hexagram_pcapng_stream *stream; | ||||
|  |  | |||
		Loading…
	
	Add table
		
		Reference in a new issue