/** * close the SACD device and clean up. */ static int sacd_net_input_close(sacd_input_t dev) { if (!dev) { return 0; } else { ServerRequest request; ServerResponse response; pb_istream_t input = pb_istream_from_socket(&dev->fd); pb_ostream_t output = pb_ostream_from_socket(&dev->fd); uint8_t zero = 0; request.type = ServerRequest_Type_DISC_CLOSE; if (!pb_encode(&output, ServerRequest_fields, &request)) { goto error; } pb_write(&output, &zero, 1); if (!pb_decode(&input, ServerResponse_fields, &response)) { goto error; } if (response.result == 0 || response.type != ServerResponse_Type_DISC_CLOSED) { goto error; } } error: if(dev) { socket_destroy(&dev->fd); socket_close(); if (dev->input_buffer) { free(dev->input_buffer); dev->input_buffer = 0; } free(dev); dev = 0; } return 0; }
void handle_connection(int connfd) { ListFilesRequest request; ListFilesResponse response; pb_istream_t input = pb_istream_from_socket(connfd); pb_ostream_t output = pb_ostream_from_socket(connfd); DIR *directory; if (!pb_decode(&input, ListFilesRequest_fields, &request)) { printf("Decoding failed.\n"); return; } directory = opendir(request.path); printf("Listing directory: %s\n", request.path); if (directory == NULL) { perror("opendir"); response.has_path_error = true; response.path_error = true; response.file.funcs.encode = NULL; } else { response.has_path_error = false; response.file.funcs.encode = &listdir_callback; response.file.arg = directory; } if (!pb_encode(&output, ListFilesResponse_fields, &response)) { printf("Encoding failed.\n"); } }
static uint32_t sacd_net_input_total_sectors(sacd_input_t dev) { if (!dev) { return 0; } else { ServerRequest request; ServerResponse response; pb_istream_t input = pb_istream_from_socket(&dev->fd); pb_ostream_t output = pb_ostream_from_socket(&dev->fd); uint8_t zero = 0; request.type = ServerRequest_Type_DISC_SIZE; if (!pb_encode(&output, ServerRequest_fields, &request)) { return 0; } /* We signal the end of request with a 0 tag. */ pb_write(&output, &zero, 1); if (!pb_decode(&input, ServerResponse_fields, &response)) { return 0; } if (response.type != ServerResponse_Type_DISC_SIZE) { return 0; } return (uint32_t) response.result; } }
/** * initialize and open a SACD device or file. */ static sacd_input_t sacd_net_input_open(const char *target) { ServerRequest request; ServerResponse response; sacd_input_t dev = 0; const char *err = 0; t_timeout tm; pb_istream_t input; pb_ostream_t output; uint8_t zero = 0; /* Allocate the library structure */ dev = (sacd_input_t) calloc(sizeof(*dev), 1); if (dev == NULL) { fprintf(stderr, "libsacdread: Could not allocate memory.\n"); return NULL; } dev->input_buffer = (uint8_t *) malloc(MAX_PROCESSING_BLOCK_SIZE * SACD_LSN_SIZE + 1024); if (dev->input_buffer == NULL) { fprintf(stderr, "libsacdread: Could not allocate memory.\n"); goto error; } socket_open(); socket_create(&dev->fd, AF_INET, SOCK_STREAM, 0); socket_setblocking(&dev->fd); timeout_markstart(&tm); err = inet_tryconnect(&dev->fd, substr(target, 0, strchr(target, ':') - target), atoi(strchr(target, ':') + 1), &tm); if (err) { fprintf(stderr, "Failed to connect\n"); goto error; } socket_setblocking(&dev->fd); input = pb_istream_from_socket(&dev->fd); output = pb_ostream_from_socket(&dev->fd); request.type = ServerRequest_Type_DISC_OPEN; if (!pb_encode(&output, ServerRequest_fields, &request)) { fprintf(stderr, "Failed to encode request\n"); goto error; } /* We signal the end of request with a 0 tag. */ pb_write(&output, &zero, 1); if (!pb_decode(&input, ServerResponse_fields, &response)) { fprintf(stderr, "Failed to decode response\n"); goto error; } if (response.result != 0 || response.type != ServerResponse_Type_DISC_OPENED) { fprintf(stderr, "Response result non-zero or disc opened\n"); goto error; } return dev; error: sacd_input_close(dev); return 0; }