/*! Generic quit callback */ int cli_quit(clicon_handle h, cvec *vars, cvec *argv) { cligen_exiting_set(cli_cligen(h), 1); return 0; }
/* * request quitting the CLI */ int quit(cligen_handle h, cvec *vars, cg_var *arg) { cligen_exiting_set(h, 1); return 0; }
/*! Send internal netconf rpc from client to backend * @param[in] h CLICON handle * @param[in] msg Encoded message. Deallocate woth free * @param[out] xret Return value from backend as xml tree. Free w xml_free * @param[inout] sock0 If pointer exists, do not close socket to backend on success * and return it here. For keeping a notify socket open * @note sock0 is if connection should be persistent, like a notification/subscribe api * @note xret is populated with yangspec according to standard handle yangspec */ int clicon_rpc_msg(clicon_handle h, struct clicon_msg *msg, cxobj **xret0, int *sock0) { int retval = -1; char *sock; int port; char *retdata = NULL; cxobj *xret = NULL; yang_stmt *yspec; #ifdef RPC_USERNAME_ASSERT assert(strstr(msg->op_body, "username")!=NULL); /* XXX */ #endif clicon_debug(1, "%s request:%s", __FUNCTION__, msg->op_body); if ((sock = clicon_sock(h)) == NULL){ clicon_err(OE_FATAL, 0, "CLICON_SOCK option not set"); goto done; } /* What to do if inet socket? */ switch (clicon_sock_family(h)){ case AF_UNIX: if (clicon_rpc_connect_unix(msg, sock, &retdata, sock0) < 0){ #if 0 if (errno == ESHUTDOWN) /* Maybe could reconnect on a higher layer, but lets fail loud and proud */ cligen_exiting_set(cli_cligen(h), 1); #endif goto done; } break; case AF_INET: if ((port = clicon_sock_port(h)) < 0){ clicon_err(OE_FATAL, 0, "CLICON_SOCK option not set"); goto done; } if (port < 0){ clicon_err(OE_FATAL, 0, "CLICON_SOCK_PORT not set"); goto done; } if (clicon_rpc_connect_inet(msg, sock, port, &retdata, sock0) < 0) goto done; break; } clicon_debug(1, "%s retdata:%s", __FUNCTION__, retdata); if (retdata){ yspec = clicon_dbspec_yang(h); if (xml_parse_string(retdata, yspec, &xret) < 0) goto done; } if (xret0){ *xret0 = xret; xret = NULL; } retval = 0; done: if (retdata) free(retdata); if (xret) xml_free(xret); return retval; }