summaryrefslogtreecommitdiff
path: root/src/base/state.c
diff options
context:
space:
mode:
authordautor <karlo98.m@gmail.com>2024-11-17 17:20:16 +0100
committerdautor <karlo98.m@gmail.com>2024-11-17 20:11:23 +0100
commitec241a43c51dc0c8355bc7def98649d23ed49f77 (patch)
treeaef428453486393e0bc9217ec1c351e2cf2b7d6b /src/base/state.c
parent9638b621fa567555e51c9bc61351a708221fd2ee (diff)
Implement ng_pipe link functionality
Links are just netgraph connections by default. To convert a link to a ng_pipe, use setcfg command. To go back to a direct link, use clrcfg command.
Diffstat (limited to 'src/base/state.c')
-rw-r--r--src/base/state.c76
1 files changed, 11 insertions, 65 deletions
diff --git a/src/base/state.c b/src/base/state.c
index 652c943..acef753 100644
--- a/src/base/state.c
+++ b/src/base/state.c
@@ -103,50 +103,12 @@ 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;
@@ -178,6 +140,8 @@ Parse_link(link_ *E, ucl_object_t const *root, char const *Position)
size_t EndpointAt = 0;
bool Configuration = false;
UCL_CHECK_ROOT(OBJECT);
+ ucl_object_t const *id = ucl_object_lookup(root, "id");
+ UCL_CHECK_OPTIONAL(id, INT);
ucl_object_t const *configuration = ucl_object_lookup(root, "configuration");
{
char *NewPosition;
@@ -187,24 +151,15 @@ Parse_link(link_ *E, ucl_object_t const *root, char const *Position)
if(Error != NULL) goto error;
Configuration = true;
}
- switch(E->Configuration.Type)
+ if(id != NULL)
{
- case link_type_direct: break;
- case link_type_pipe:
+ s64 ID = ucl_object_toint(id);
+ if(ID < 0 || ID > INT32_MAX)
{
- 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;
+ asprintf(&Error, "%s id invalid (%ld)", Position, ID);
+ goto error;
}
- case link_type_COUNT:
- default: __builtin_unreachable();
+ E->PipeID = (u32)ID;
}
ucl_object_t const *peer0 = ucl_object_lookup(root, "peer0");
{
@@ -365,8 +320,6 @@ 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");
@@ -380,17 +333,10 @@ Save_link(jprint_state *S, link_ const *E)
JPrintObjectBegin(S);
JPrintMember(S, "configuration");
Save_link_configuration(S, &E->Configuration);
- switch(E->Configuration.Type)
+ if(E->PipeID != 0)
{
- 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, "id");
+ JPrint_ssize_t(S, E->PipeID);
}
JPrintMember(S, "peer0");
Save_endpoint(S, E->Peer + 0);