This is a basic improvement for allowing simple
option setting when uri are to be written.
It allows to set contextually the default scheme.
Bug-AGL: SPEC-2968
Signed-off-by: Jose Bollo <jose.bollo@iot.bzh>
Change-Id: I9d7be96743c47b3dd788a35b0b3642387613bacb
*
* @param uri the searched uri
* @param offset where to store the prefix length
*
* @param uri the searched uri
* @param offset where to store the prefix length
+ * @param scheme the default scheme to use if none is set in uri (can be NULL)
*
* @return the found entry or the default one
*/
*
* @return the found entry or the default one
*/
-static struct entry *get_entry(const char *uri, int *offset)
+static struct entry *get_entry(const char *uri, int *offset, const char *scheme)
- int l, i = (int)(sizeof entries / sizeof * entries);
- for (;;) {
- if (!i) {
- l = 0;
- break;
- }
+ /* search as prefix of URI */
+ i = (int)(sizeof entries / sizeof * entries);
+ while (i) {
- l = (int)strlen(entries[i].prefix);
- if (!strncmp(uri, entries[i].prefix, l))
- break;
+ len = (int)strlen(entries[i].prefix);
+ if (!strncmp(uri, entries[i].prefix, len))
+ goto end; /* found */
+ }
+
+ /* not a prefix of uri */
+ len = 0;
+
+ /* search default scheme if given and valid */
+ if (scheme && *scheme) {
+ deflen = (int)strlen(scheme);
+ deflen += (scheme[deflen - 1] != ':'); /* add virtual trailing colon */
+ i = (int)(sizeof entries / sizeof * entries);
+ while (i) {
+ i--;
+ if (deflen == (int)strlen(entries[i].prefix)
+ && !strncmp(scheme, entries[i].prefix, deflen - 1))
+ goto end; /* found */
+ }
*
* @param uri the specification of the socket
* @param server 0 for client, server otherwise
*
* @param uri the specification of the socket
* @param server 0 for client, server otherwise
+ * @param scheme the default scheme to use if none is set in uri (can be NULL)
*
* @return the file descriptor number of the socket or -1 in case of error
*/
*
* @return the file descriptor number of the socket or -1 in case of error
*/
-static int open_uri(const char *uri, int server)
+static int open_uri(const char *uri, int server, const char *scheme)
{
int fd, offset;
struct entry *e;
const char *api;
/* search for the entry */
{
int fd, offset;
struct entry *e;
const char *api;
/* search for the entry */
- e = get_entry(uri, &offset);
+ e = get_entry(uri, &offset, scheme);
/* get the names */
uri += offset;
/* get the names */
uri += offset;
*
* @param uri the specification of the socket
* @param server 0 for client, server otherwise
*
* @param uri the specification of the socket
* @param server 0 for client, server otherwise
+ * @param scheme the default scheme to use if none is set in uri (can be NULL)
*
* @return the file descriptor number of the socket or -1 in case of error
*/
*
* @return the file descriptor number of the socket or -1 in case of error
*/
-int afb_socket_open(const char *uri, int server)
+int afb_socket_open_scheme(const char *uri, int server, const char *scheme)
- int fd = open_uri(uri, server);
+ int fd = open_uri(uri, server, scheme);
if (fd < 0)
ERROR("can't open %s socket for %s", server ? "server" : "client", uri);
return fd;
if (fd < 0)
ERROR("can't open %s socket for %s", server ? "server" : "client", uri);
return fd;
*
* @param uri the specification of the socket
* @param server 0 for client, server otherwise
*
* @param uri the specification of the socket
* @param server 0 for client, server otherwise
+ * @param scheme the default scheme to use if none is set in uri (can be NULL)
*
* @return the fdev of the socket or NULL in case of error
*/
*
* @return the fdev of the socket or NULL in case of error
*/
-struct fdev *afb_socket_open_fdev(const char *uri, int server)
+struct fdev *afb_socket_open_fdev_scheme(const char *uri, int server, const char *scheme)
{
struct fdev *fdev;
int fd;
{
struct fdev *fdev;
int fd;
- fd = afb_socket_open(uri, server);
+ fd = afb_socket_open_scheme(uri, server, scheme);
if (fd < 0)
fdev = NULL;
else {
if (fd < 0)
fdev = NULL;
else {
const char *api;
struct entry *entry;
const char *api;
struct entry *entry;
- entry = get_entry(uri, &offset);
+ entry = get_entry(uri, &offset, NULL);
uri += offset;
uri += (entry->type == Type_Unix && *uri == '@');
api = strstr(uri, as_api);
uri += offset;
uri += (entry->type == Type_Unix && *uri == '@');
api = strstr(uri, as_api);
-extern int afb_socket_open(const char *uri, int server);
+extern int afb_socket_open_scheme(const char *uri, int server, const char *scheme);
-extern struct fdev *afb_socket_open_fdev(const char *uri, int server);
+extern struct fdev *afb_socket_open_fdev_scheme(const char *uri, int server, const char *scheme);
extern const char *afb_socket_api(const char *uri);
extern const char *afb_socket_api(const char *uri);
+
+static inline int afb_socket_open(const char *uri, int server)
+{
+ return afb_socket_open_scheme(uri, server, 0);
+}
+
+static inline struct fdev *afb_socket_open_fdev(const char *uri, int server)
+{
+ return afb_socket_open_fdev_scheme(uri, server, 0);
+}