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;
}