WIP: type per command #4

Draft
vinzenz wants to merge 25 commits from next into main
3 changed files with 24 additions and 8 deletions
Showing only changes of commit c9d2479f5e - Show all commits

View file

@ -5,6 +5,7 @@
#include <stdlib.h> #include <stdlib.h>
#include <arpa/inet.h> #include <arpa/inet.h>
#include <string.h> #include <string.h>
#include <unistd.h>
#include "servicepoint.h" #include "servicepoint.h"
#define DEFAULT_LISTEN_IP "127.0.0.1" #define DEFAULT_LISTEN_IP "127.0.0.1"
@ -63,14 +64,22 @@ int main(int argc, char **argv) {
} }
struct Header *header = sp_packet_get_header(packet); struct Header *header = sp_packet_get_header(packet);
done = header->command_code == COMMAND_CODE_HARD_RESET;
ByteSlice payload = sp_packet_get_payload(packet); ByteSlice payload = sp_packet_get_payload(packet);
printf("Received packet: cc=%d, a=%d, b=%d, c=%d, d=%d, payload=%p (len %zu)\n", printf("Received packet: cc=%d, a=%d, b=%d, c=%d, d=%d, payload=%p (len %zu)\n",
header->command_code, header->a, header->b, header->c, header->d, header->command_code, header->a, header->b, header->c, header->d,
payload.start, payload.length); payload.start, payload.length);
done = header->command_code == COMMAND_CODE_HARD_RESET; struct Command command = sp_cmd_generic_try_from_packet(packet);
sp_packet_free(packet); if (command.tag == COMMAND_TAG_INVALID) {
printf("received invalid command\n");
continue;
}
sp_cmd_generic_free(command);
} }
close(udp_socket);
exit(EXIT_SUCCESS); exit(EXIT_SUCCESS);
} }

View file

@ -1564,6 +1564,8 @@ struct Command sp_cmd_generic_clone(struct Command command);
/** /**
* Deallocates an [SPCommand]. * Deallocates an [SPCommand].
* *
* Commands with an invalid `tag` do not have to be freed as the `data` pointer should be null.
*
* # Examples * # Examples
* *
* ```C * ```C
@ -1588,7 +1590,7 @@ struct Packet *sp_cmd_generic_into_packet(struct Command command);
* *
* Returns: pointer to new [SPCommand] instance or NULL if parsing failed. * Returns: pointer to new [SPCommand] instance or NULL if parsing failed.
*/ */
struct Command *sp_cmd_generic_try_from_packet(struct Packet */*notnull*/ packet); struct Command sp_cmd_generic_try_from_packet(struct Packet */*notnull*/ packet);
/** /**
* Deallocates a [HardResetCommand]. * Deallocates a [HardResetCommand].

View file

@ -74,10 +74,10 @@ impl SPCommand {
#[no_mangle] #[no_mangle]
pub unsafe extern "C" fn sp_cmd_generic_try_from_packet( pub unsafe extern "C" fn sp_cmd_generic_try_from_packet(
packet: NonNull<Packet>, packet: NonNull<Packet>,
) -> *mut SPCommand { ) -> SPCommand {
let packet = *unsafe { Box::from_raw(packet.as_ptr()) }; let packet = *unsafe { Box::from_raw(packet.as_ptr()) };
heap_move_ok(servicepoint::TypedCommand::try_from(packet).map(|value| { servicepoint::TypedCommand::try_from(packet)
match value { .map(|value| match value {
TypedCommand::Clear(clear) => SPCommand { TypedCommand::Clear(clear) => SPCommand {
tag: CommandTag::Clear, tag: CommandTag::Clear,
data: CommandUnion { data: CommandUnion {
@ -139,8 +139,11 @@ pub unsafe extern "C" fn sp_cmd_generic_try_from_packet(
bitmap_legacy: heap_move_nonnull(bitmap_legacy), bitmap_legacy: heap_move_nonnull(bitmap_legacy),
}, },
}, },
} })
})) .unwrap_or_else(move |_| SPCommand {
tag: CommandTag::Invalid,
data: CommandUnion { null: null_mut() },
})
} }
/// Clones an [SPCommand] instance. /// Clones an [SPCommand] instance.
@ -219,6 +222,8 @@ pub unsafe extern "C" fn sp_cmd_generic_clone(command: SPCommand) -> SPCommand {
} }
/// Deallocates an [SPCommand]. /// Deallocates an [SPCommand].
///
/// Commands with an invalid `tag` do not have to be freed as the `data` pointer should be null.
/// ///
/// # Examples /// # Examples
/// ///