diff --git a/lib/link/seven_fs/getfreemem.c b/lib/link/seven_fs/getfreemem.c index 0051649..0ffbee3 100644 --- a/lib/link/seven_fs/getfreemem.c +++ b/lib/link/seven_fs/getfreemem.c @@ -34,6 +34,56 @@ int CASIO_EXPORT casio_sevenfs_getfreemem(sevenfs_cookie_t *cookie, { int err; casio_link_t *handle = cookie; + const char *devname = (path->sevenfs_path_dev != 0xFF) ? + &path->sevenfs_path_data[path->sevenfs_path_dev] : + NULL; + /* Some checks */ + chk_handle(handle); + chk_active(handle); + if (devname == NULL) + return (casio_error_op); + + /* Send command packet */ + if ((err = casio_seven_send_cmdfls_reqcapacity(handle, devname))) { + msg((ll_fatal, "Couldn't send request/didn't receive answer")); + return (casio_error_unknown); + } + + /* Check response packet */ + if (response.casio_seven_packet_type == casio_seven_type_nak + && response.casio_seven_packet_code == casio_seven_err_other) { + msg((ll_fatal, "File system probably doesn't exist")); + return (casio_error_device); + } else if (response.casio_seven_packet_type != casio_seven_type_ack) { + msg((ll_fatal, "Didn't receive ack ro known error...")); + return (casio_error_unknown); + } + + /* Swap roles */ + msg((ll_info, "Sending roleswap")); + if ((err = casio_seven_send_roleswp(handle))) { + msg((ll_fatal, "Couldn't swap roles")); + return (err); + } else if (response.casio_seven_packet_type != casio_seven_type_cmd + || response.casio_seven_packet_code != 0x4C + || !response.casio_seven_packet_args[4]) { + msg((ll_fatal, "Didn't receive expected comand")); + return (casio_error_unknown); + } + + /* Decode thingy */ + *capacity = response.casio_seven_packet_filesize; + + /* ack and check for the roleswap */ + msg((ll_info, "Return ack and wait for roleswp")); + if ((err = casio_seven_send_ack(handle, 1))) { + msg((ll_fatal, "Unable to send ack")); + return (err); + } else if (response.casio_seven_packet_type != casio_seven_type_swp) { + return (casio_error_unknown); + } + + /* No error */ return (0); } \ No newline at end of file