summaryrefslogtreecommitdiff
path: root/src/base/state.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/base/state.c')
-rw-r--r--src/base/state.c71
1 files changed, 71 insertions, 0 deletions
diff --git a/src/base/state.c b/src/base/state.c
index 50ebe4e..652c943 100644
--- a/src/base/state.c
+++ b/src/base/state.c
@@ -103,12 +103,50 @@ error:
return Error;
}
+int
+FromString_link_type(char const *S, link_type *Type)
+{
+ for(link_type i = 0; i < link_type_COUNT; ++i)
+ {
+ if(strcmp(link_type_Names[i], S) == 0)
+ {
+ *Type = i;
+ return 0;
+ }
+ }
+ return -1;
+}
+
+char *
+Parse_link_type(link_type *E, ucl_object_t const *root, char const *Position)
+{
+ if(root == NULL)
+ {
+ *E = link_type_direct;
+ return NULL;
+ }
+ char *Error;
+ UCL_CHECK_ROOT(STRING);
+ char const *S = ucl_object_tostring(root);
+ if(FromString_link_type(S, E) == 0) return NULL;
+ asprintf(&Error, "%s invalid link type '%s'", Position, S);
+error:
+ return Error;
+}
+
char *
Parse_link_configuration(link_configuration *E, ucl_object_t const *root, char const *Position)
{
char *Error;
size_t EndpointAt = 0;
UCL_CHECK_ROOT(OBJECT);
+ {
+ char *NewPosition;
+ asprintf(&NewPosition, "%s.type", Position);
+ Error = Parse_link_type(&E->Type, ucl_object_lookup(root, "type"), NewPosition);
+ free(NewPosition);
+ if(Error != NULL) goto error;
+ }
ucl_object_t const *peer0 = ucl_object_lookup(root, "peer0");
{
char *NewPosition;
@@ -149,6 +187,25 @@ Parse_link(link_ *E, ucl_object_t const *root, char const *Position)
if(Error != NULL) goto error;
Configuration = true;
}
+ switch(E->Configuration.Type)
+ {
+ case link_type_direct: break;
+ case link_type_pipe:
+ {
+ ucl_object_t const *id = ucl_object_lookup(root, "id");
+ UCL_CHECK(id, INT);
+ s64 ID = ucl_object_toint(id);
+ if(ID < 0 || ID > INT32_MAX)
+ {
+ asprintf(&Error, "%s id invalid (%ld)", Position, ID);
+ goto error;
+ }
+ E->pipe.ID = (u32)ID;
+ break;
+ }
+ case link_type_COUNT:
+ default: __builtin_unreachable();
+ }
ucl_object_t const *peer0 = ucl_object_lookup(root, "peer0");
{
char *NewPosition;
@@ -308,6 +365,8 @@ void
Save_link_configuration(jprint_state *S, link_configuration const *E)
{
JPrintObjectBegin(S);
+ JPrintMember(S, "type");
+ JPrint_string(S, link_type_Names[E->Type]);
JPrintMember(S, "peer0");
Save_endpoint_configuration(S, E->Peer + 0);
JPrintMember(S, "peer1");
@@ -321,6 +380,18 @@ Save_link(jprint_state *S, link_ const *E)
JPrintObjectBegin(S);
JPrintMember(S, "configuration");
Save_link_configuration(S, &E->Configuration);
+ switch(E->Configuration.Type)
+ {
+ case link_type_direct: break;
+ case link_type_pipe:
+ {
+ JPrintMember(S, "id");
+ JPrint_ssize_t(S, E->pipe.ID);
+ break;
+ }
+ case link_type_COUNT:
+ default: __builtin_unreachable();
+ }
JPrintMember(S, "peer0");
Save_endpoint(S, E->Peer + 0);
JPrintMember(S, "peer1");