AmendHub

Download:

jcs

/

detritus

/

amendments

/

10

scsi: Use a static buffer


jcs made amendment 10 about 1 year ago
--- scsi.c Tue Oct 1 15:13:41 2024 +++ scsi.c Thu Oct 24 13:55:19 2024 @@ -17,7 +17,7 @@ #include <SCSI.h> #include <string.h> #include <stdio.h> -#include "gemino.h" +#include "detritus.h" struct scsi_inquiry { unsigned char deviceType; @@ -50,8 +50,10 @@ enum { #define BLUESCSI_TLS_CMD_WRITE_CIPHER 0x06 #define BLUESCSI_TLS_CMD_CLOSE 0x07 -static short bluescsi_tls_scsi_id = -1; +uint8_t tls_req_last_id = 1; +static short tls_scsi_id = -1; static struct SCSIInstr tib[2]; +static unsigned char scsi_buf[2048]; short scsi_io(unsigned char *cdb, unsigned long cdb_len, short io_type, unsigned char *buf, unsigned long len); @@ -106,7 +108,7 @@ scsi_find_tls(void) if (memcmp(inq.vendorID, "BlueSCSI", 8) == 0 && memcmp(inq.productID, "TLS", 3) == 0) { - bluescsi_tls_scsi_id = scsi_id; + tls_scsi_id = scsi_id; return noErr; } } @@ -116,13 +118,15 @@ scan_failed: return -1; } -bool -scsi_tls_init(char tls_id, unsigned char *buf, size_t buf_size, - struct tls_init_request *req) +uint8_t +scsi_tls_init(struct tls_init_request *req) { unsigned char cdb[6]; unsigned short size; + uint8_t tls_id; + tls_id = ++tls_req_last_id; + memset(cdb, 0, sizeof(cdb)); cdb[0] = BLUESCSI_TLS_CMD; cdb[1] = BLUESCSI_TLS_CMD_INIT; @@ -132,13 +136,16 @@ scsi_tls_init(char tls_id, unsigned char *buf, size_t cdb[3] = (size >> 8) & 0xff; cdb[4] = size & 0xff; - memcpy(buf, req, size); + memcpy(scsi_buf, req, size); - return (scsi_io(cdb, sizeof(cdb), SCSI_WRITE, buf, size) != -1); + if (scsi_io(cdb, sizeof(cdb), SCSI_WRITE, scsi_buf, size) == -1) + return 0; + + return tls_id; } bool -scsi_tls_close(char tls_id) +scsi_tls_close(uint8_t tls_id) { unsigned char cdb[6]; @@ -151,8 +158,8 @@ scsi_tls_close(char tls_id) } short -scsi_tls_status(char tls_id, unsigned char *buf, size_t buf_size, - short *cipherspace, short *plainspace, short *error) +scsi_tls_status(uint8_t tls_id, short *cipherspace, short *plainspace, + short *error) { unsigned char cdb[6]; size_t size; @@ -163,23 +170,27 @@ scsi_tls_status(char tls_id, unsigned char *buf, size_ cdb[1] = BLUESCSI_TLS_CMD_STATUS; cdb[2] = tls_id; - ret = scsi_io(cdb, sizeof(cdb), SCSI_READ, buf, 8); + ret = scsi_io(cdb, sizeof(cdb), SCSI_READ, (unsigned char *)&scsi_buf, 8); if (ret != 8) return 0; - *cipherspace = ((short)buf[2] << 8) | buf[3]; - *plainspace = ((short)buf[4] << 8) | buf[5]; - *error = ((short)buf[6] << 8) | buf[7]; + *cipherspace = ((short)scsi_buf[2] << 8) | scsi_buf[3]; + *plainspace = ((short)scsi_buf[4] << 8) | scsi_buf[5]; + *error = ((short)scsi_buf[6] << 8) | scsi_buf[7]; - return (((short)buf[0] << 8) | buf[1]); + return (((short)scsi_buf[0] << 8) | scsi_buf[1]); } size_t -scsi_tls_read(char tls_id, unsigned char *buf, size_t buf_size, bool cipher) +scsi_tls_read(uint8_t tls_id, unsigned char **buf, size_t max_size, + bool cipher) { unsigned char cdb[6]; short ret; + if (max_size == 0 || max_size > sizeof(scsi_buf)) + max_size = sizeof(scsi_buf); + memset(cdb, 0, sizeof(cdb)); cdb[0] = BLUESCSI_TLS_CMD; if (cipher) @@ -187,18 +198,22 @@ scsi_tls_read(char tls_id, unsigned char *buf, size_t else cdb[1] = BLUESCSI_TLS_CMD_READ_PLAIN; cdb[2] = tls_id; - cdb[3] = (buf_size >> 8) & 0xff; - cdb[4] = buf_size & 0xff; + cdb[3] = (max_size >> 8) & 0xff; + cdb[4] = max_size & 0xff; - ret = scsi_io(cdb, sizeof(cdb), SCSI_READ_UNKNOWN_SIZE, buf, buf_size); - if (ret < 0) + ret = scsi_io(cdb, sizeof(cdb), SCSI_READ_UNKNOWN_SIZE, scsi_buf, + max_size); + if (ret < 0) { + *buf = NULL; return 0; - + } + + *buf = (unsigned char *)&scsi_buf; return ret; } size_t -scsi_tls_write(char tls_id, unsigned char *buf, size_t buf_size, +scsi_tls_write(uint8_t tls_id, unsigned char *buf, size_t buf_size, bool cipher) { unsigned char cdb[6]; @@ -232,7 +247,7 @@ scsi_io(unsigned char *cdb, unsigned long cdb_len, sho return -1; } - if (SCSISelect(bluescsi_tls_scsi_id) != noErr) { + if (SCSISelect(tls_scsi_id) != noErr) { warn("SCSISelect failed"); return -1; }