diff --git a/adam/src/fn_fuji/fuji_generate_guid.c b/adam/src/fn_fuji/fuji_generate_guid.c new file mode 100644 index 0000000..e662cdc --- /dev/null +++ b/adam/src/fn_fuji/fuji_generate_guid.c @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include "fujinet-fuji.h" +#include "fujinet-network.h" +#include "fujinet-network-adam.h" +#include "response.h" + +bool fuji_generate_guid(char *buffer) +{ + uint8_t err = 0; + + while(1) + { + err = eos_write_character_device(FUJINET_DEVICE_ID,"\xBB",1); + + if (err == ADAMNET_TIMEOUT) + continue; + else if (err == ADAMNET_OK) + break; + else + return FN_ERR_IO_ERROR; + } + + while(1) + { + err = eos_read_character_device(FUJINET_DEVICE_ID,buffer,MAX_GUID_LEN); + + if (err == ADAMNET_TIMEOUT) + continue; + else if (err == ADAMNET_OK) + break; + else + return FN_ERR_IO_ERROR; + } + + return FN_ERR_OK; +} diff --git a/apple2/src/fn_fuji/fuji_generate_guid.c b/apple2/src/fn_fuji/fuji_generate_guid.c new file mode 100644 index 0000000..6cdd3d8 --- /dev/null +++ b/apple2/src/fn_fuji/fuji_generate_guid.c @@ -0,0 +1,17 @@ +#include +#include +#include "fujinet-fuji.h" +#include "fujinet-bus-apple2.h" + +bool fuji_generate_guid(char *buffer) +{ + if (sp_get_fuji_id() == 0) { + return false; + } + + sp_error = sp_status(sp_fuji_id, FUJICMD_GENERATE_GUID); + if (sp_error == 0) { + memcpy(buffer, &sp_payload[0], MAX_GUID_LEN); + } + return sp_error == 0; +} \ No newline at end of file diff --git a/atari/src/fn_fuji/fuji_generate_guid.c b/atari/src/fn_fuji/fuji_generate_guid.c new file mode 100644 index 0000000..3306068 --- /dev/null +++ b/atari/src/fn_fuji/fuji_generate_guid.c @@ -0,0 +1,36 @@ +#include +#include +#include +#include +#include +#include "fujinet-fuji.h" +#include "fujinet-bus-atari.h" +#include "fujinet-fuji-atari.h" + + +uint8_t t_fuji_generate_guid[6] = { FUJICMD_GENERATE_GUID, 0x40, 0x00, 0x00, 0x00, 0x00 }; + +bool fuji_generate_guid(char *buffer) +{ + uint8_t data[MAX_GUID_LEN + 2]; // add 2 for count bytes + uint16_t buffer_size = MAX_GUID_LEN; + uint16_t bytes_read; + + copy_fuji_cmd_data(t_fuji_generate_guid); + OS.dcb.dbuf = data; + OS.dcb.dbyt = buffer_size + 2; // add 2 for count bytes + OS.dcb.dtimlo = 1; // Generating GUID should be nearly instantaneous, make timeout 1 second + bus(); + if (!fuji_success()) { + return false; + } + + bytes_read = data[0] + (data[1] << 8); + if (bytes_read > 0) { + // move the data from data+2 to data, and set everything else to 0 after this. + memmove(data, &data[2], bytes_read); + strncpy(buffer, (char*)data, buffer_size); + } + return true; + +} \ No newline at end of file diff --git a/coco/src/fn_fuji/fuji_generate_guid.c b/coco/src/fn_fuji/fuji_generate_guid.c new file mode 100644 index 0000000..9035cf9 --- /dev/null +++ b/coco/src/fn_fuji/fuji_generate_guid.c @@ -0,0 +1,26 @@ + +#include +#include +#include "fujinet-fuji.h" +#include +#include + +bool fuji_generate_guid(char *buffer) +{ + struct _gg + { + uint8_t opcode; + uint8_t cmd; + } gg; + + gg.opcode = OP_FUJI; + gg.cmd = FUJICMD_GENERATE_GUID; + + bus_ready(); + + dwwrite((uint8_t *)&gg, sizeof(gg)); + if (fuji_get_error()) + return false; + + return fuji_get_response((uint8_t *)buffer, MAX_GUID_LEN); +} \ No newline at end of file diff --git a/commodore/src/fn_fuji/fuji_generate_guid.c b/commodore/src/fn_fuji/fuji_generate_guid.c new file mode 100644 index 0000000..c591cd3 --- /dev/null +++ b/commodore/src/fn_fuji/fuji_generate_guid.c @@ -0,0 +1,10 @@ +#include +#include +#include "fujinet-fuji.h" +#include "fujinet-fuji-cbm.h" + +bool fuji_generate_guid(char *buffer) +{ + int bytes_read; + return open_read_close(FUJICMD_GENERATE_GUID, true, &bytes_read, MAX_GUID_LEN, (uint8_t *) buffer); +} diff --git a/fujinet-fuji.h b/fujinet-fuji.h index f57b049..ebf4e1f 100644 --- a/fujinet-fuji.h +++ b/fujinet-fuji.h @@ -54,6 +54,7 @@ #define FILE_MAXLEN 36 #define SSID_MAXLEN 33 /* 32 + NULL */ #define MAX_APPKEY_LEN 64 +#define MAX_GUID_LEN 37 #ifdef __CBM__ #define MAX_PASSWORD_LEN 65 @@ -114,6 +115,7 @@ #define FUJICMD_GET_ADAPTERCONFIG_EXTENDED 0xC4 #define FUJICMD_HASH_COMPUTE_NO_CLEAR 0xC3 #define FUJICMD_HASH_CLEAR 0xC2 +#define FUJICMD_GENERATE_GUID 0xBB #define FUJICMD_SET_STATUS 0x81 enum WifiStatus @@ -318,6 +320,12 @@ bool fuji_enable_udpstream(uint16_t port, char *host); */ bool fuji_error(void); +/** + * @brief Generate a randomized GUID. + * @return success status of request + */ +bool fuji_generate_guid(char *buffer); + /** * @brief Gets adapter config information from FN, e.g. IP, MAC, BSSID etc. * Raw version that returns bytes for all IP etc related values. diff --git a/msdos/src/fn_fuji/fuji_generate_guid.c b/msdos/src/fn_fuji/fuji_generate_guid.c new file mode 100644 index 0000000..346e7de --- /dev/null +++ b/msdos/src/fn_fuji/fuji_generate_guid.c @@ -0,0 +1,9 @@ +#include +#include +#include "fujinet-fuji.h" +#include "fujinet-fuji-msdos.h" + +bool fuji_generate_guid(char *buffer) +{ + return int_f5_read(0x70,0xBB,0x00,0x00,buffer,MAX_GUID_LEN) == 'C'; +} diff --git a/pmd85/src/fn_fuji/fuji_generate_guid.c b/pmd85/src/fn_fuji/fuji_generate_guid.c new file mode 100644 index 0000000..c6a6c3d --- /dev/null +++ b/pmd85/src/fn_fuji/fuji_generate_guid.c @@ -0,0 +1,23 @@ +#include "fujinet-fuji.h" +#include +#include + +bool fuji_generate_guid(char *buffer) +{ + struct _gg + { + uint8_t opcode; + uint8_t cmd; + } gg; + + gg.opcode = OP_FUJI; + gg.cmd = FUJICMD_GENERATE_GUID; + + bus_ready(); + + dwwrite((uint8_t *)&gg, sizeof(gg)); + if (fuji_get_error()) + return false; + + return fuji_get_response((uint8_t *)buffer, MAX_GUID_LEN); +} \ No newline at end of file