ASR_BASE
Change-Id: Icf3719cc0afe3eeb3edc7fa80a2eb5199ca9dda1
diff --git a/marvell/services/piped/piped_util.c b/marvell/services/piped/piped_util.c
new file mode 100644
index 0000000..3e2b683
--- /dev/null
+++ b/marvell/services/piped/piped_util.c
@@ -0,0 +1,218 @@
+
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <unistd.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <stdio.h>
+#include <fcntl.h>
+#include <string.h>
+
+#include "piped.h"
+#include "piped_util.h"
+#include "piped_uci.h"
+
+void pd_path_init(struct pd_path *p)
+{
+ strcpy(p->buf, MPIPE_PATH);
+ p->iptr = p->buf + sizeof(MPIPE_PATH) - 1;
+ p->fptr = NULL;
+}
+
+void pd_path_set_iface(struct pd_path *p, const char *ifname)
+{
+ strcpy(p->iptr, ifname);
+ strcat(p->iptr, "/");
+ p->fptr = p->iptr + strlen(ifname) + 1;
+}
+
+void pd_path_set_file(struct pd_path *p, const char *fname)
+{
+ strcpy(p->fptr, fname);
+}
+
+int __pd_write_str(char *path, const char *s)
+{
+ int fd = open(path, O_WRONLY);
+
+ if (fd == -1) {
+ PD_ERR(__pd_write_str, "Failed to open file: %s\n", path);
+ return 1;
+ }
+
+ if (write(fd, s, strlen(s)) == -1) {
+ PD_ERR(__pd_write_str1, "Failed to write to file: %s\n", path);
+ return 1;
+ }
+
+ if (close(fd)) {
+ PD_ERR(__pd_write_str2, "Failed to close file: %s\n", path);
+ return 1;
+ }
+
+ return 0;
+}
+
+int pd_write_str(struct pd_path *p, const char *s)
+{
+ return __pd_write_str(p->buf, s);
+}
+
+int __pd_write_bool(char *buf, bool b)
+{
+ char s[2];
+ s[0] = b ? '1' : '0';
+ s[1] = '\0';
+
+ return __pd_write_str(buf, s);
+}
+
+int pd_write_bool(struct pd_path *p, bool b)
+{
+ return __pd_write_bool(p->buf, b);
+}
+
+int __pd_read(char *path, char *buf, int len)
+{
+ FILE *fp = fopen(path, "r");
+ size_t rc = 0;
+ if (fp != NULL) {
+ rc = fread(buf, sizeof(char), len - 1, fp);
+ if (!rc)
+ {
+ PD_ERR(__pd_read, "Failed to read file: %s\n", path);
+ }
+ else
+ {
+ buf[++rc] = '\0';
+ strtok(buf, "\n");
+ }
+ fclose(fp);
+ }
+ /* trim newline */
+ return !rc;
+}
+
+int pd_read(struct pd_path *p, char *buf, int len)
+{
+ return __pd_read(p->buf, buf, len);
+}
+
+int __pd_read_bool(char *path, bool *ans)
+{
+ int ret, tmp;
+ char buf[4];
+ if ((ret = __pd_read(path, buf, 4)))
+ return ret;
+
+ sscanf(buf, "%d", &tmp);
+
+ if (tmp)
+ *ans = true;
+ else
+ *ans = false;
+ return 0;
+}
+
+int pd_read_bool(struct pd_path *p, bool *ans)
+{
+ return __pd_read_bool(p->buf, ans);
+}
+
+int pd_file_exists(struct pd_path *p)
+{
+ return (access(p->buf, F_OK) != -1);
+}
+
+int validate_ip(const char *addr, int family)
+{
+ unsigned char buf[sizeof(struct in6_addr)];
+
+ if (family != AF_INET6 && family != AF_INET)
+ return 1;
+
+ return inet_pton(family, addr, buf) != 1;
+}
+
+int ipv6_split_pref(const char *ip6addr, char *addr_buf, char *pref_buf)
+{
+ char *del_ptr;
+ int del_idx;
+
+ if (!ip6addr)
+ return 1;
+
+ del_ptr = strchr(ip6addr, '/');
+
+ if (!del_ptr)
+ return 1;
+
+ strcpy(pref_buf, del_ptr + 1);
+ del_idx = (int)(del_ptr - ip6addr);
+
+ strncpy(addr_buf, ip6addr, del_idx);
+ addr_buf[del_idx] = '\0';
+
+ return 0;
+}
+
+int validate_prefixlen(const char *preflen)
+{
+ int prefixlen = atoi(preflen);
+ return (prefixlen < 0 || prefixlen > 128);
+}
+
+int str_starts_with(const char *str, const char *pre)
+{
+ int prelen = strlen(pre);
+ int strelen = strlen(str);
+
+ if (strelen < prelen)
+ return 0;
+ return strncmp(pre, str, prelen) == 0;
+}
+
+int ipv4_change_oct(int oct)
+{
+ return oct ^ 0xFF;
+}
+
+void ipv4_get_alias(const char *ip1, char *ip2)
+{
+ int ip[4];
+ if (sscanf(ip1, IPV4_FMT, &ip[0], &ip[1], &ip[2], &ip[3]) != 4 ) {
+ strcpy(ip2, EMPTY_IPV4);
+ return;
+ }
+ if (ip[3] != 255 && ip[3] != 0)
+ sprintf(ip2, IPV4_FMT, ip[0], ip[1], ip[2], ipv4_change_oct(ip[3]));
+ else {
+ if (ip[2] != 255 && ip[2] != 0)
+ sprintf(ip2, IPV4_FMT, ip[0], ip[1], ipv4_change_oct(ip[2]), ipv4_change_oct(ip[3]));
+ else
+ sprintf(ip2, IPV4_FMT, ip[0], ipv4_change_oct(ip[1]), ipv4_change_oct(ip[2]), ipv4_change_oct(ip[3]));
+ }
+
+}
+
+int ipv4_get_last_oct(const char *ip1)
+{
+ int ip[4];
+ sscanf(ip1, IPV4_FMT, &ip[0], &ip[1], &ip[2], &ip[3]);
+ return ip[3];
+}
+
+int ipv4_get_third_oct(const char *ip1)
+{
+ int ip[4];
+ sscanf(ip1, IPV4_FMT, &ip[0], &ip[1], &ip[2], &ip[3]);
+ return ip[2];
+}
+
+int ipv4_get_second_oct(const char *ip1)
+{
+ int ip[4];
+ sscanf(ip1, IPV4_FMT, &ip[0], &ip[1], &ip[2], &ip[3]);
+ return ip[1];
+}
+