[Feature] add GA346 baseline version
Change-Id: Ic62933698569507dcf98240cdf5d9931ae34348f
diff --git a/src/apps/atom-base/progs/property/libprop/LICENSE b/src/apps/atom-base/progs/property/libprop/LICENSE
new file mode 100644
index 0000000..77f59ed
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/LICENSE
@@ -0,0 +1,31 @@
+Copyright Statement:
+
+This software/firmware and related documentation ("MediaTek Software") are
+protected under relevant copyright laws. The information contained herein is
+confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+the prior written permission of MediaTek inc. and/or its licensors, any
+reproduction, modification, use or disclosure of MediaTek Software, and
+information contained herein, in whole or in part, shall be strictly
+prohibited.
+
+MediaTek Inc. (C) 2015. All rights reserved.
+
+BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
diff --git a/src/apps/atom-base/progs/property/libprop/Makefile.am b/src/apps/atom-base/progs/property/libprop/Makefile.am
new file mode 100644
index 0000000..0f20ded
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/Makefile.am
@@ -0,0 +1,14 @@
+AUTOMAKE_OPTIONS=foreign subdir-objects
+
+lib_LTLIBRARIES = libprop.la
+libprop_la_SOURCES = ./prop_api.c \
+ ./prop_debug.c \
+ ./request.c \
+ ./utility.c
+include_HEADERS = ./prop_api.h \
+ ./request.h \
+ ./utility.h \
+ ./cutils/properties.h
+
+libprop_la_LDFLAGS = -weak -shared
+libprop_la_LIBADD = -lm -lrt -lpthread -lc
diff --git a/src/apps/atom-base/progs/property/libprop/configure.ac b/src/apps/atom-base/progs/property/libprop/configure.ac
new file mode 100644
index 0000000..0322a7e
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/configure.ac
@@ -0,0 +1,8 @@
+AC_INIT([gpshal], [1.0])
+AM_INIT_AUTOMAKE([foreign])
+AC_CONFIG_HEADER(defines.h)
+AC_PROG_CC
+AC_DISABLE_STATIC
+LT_INIT
+AC_CONFIG_FILES([Makefile])
+AC_OUTPUT
diff --git a/src/apps/atom-base/progs/property/libprop/cutils/properties.h b/src/apps/atom-base/progs/property/libprop/cutils/properties.h
new file mode 100644
index 0000000..d46e90c
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/cutils/properties.h
@@ -0,0 +1,87 @@
+/* Copyright Statement:
+
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+
+ * MediaTek Inc. (C) 2015. All rights reserved.
+
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+#ifndef __CUTILS_PROPERTIES_H
+#define __CUTILS_PROPERTIES_H
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* System properties are *small* name value pairs managed by the
+** property service. If your data doesn't fit in the provided
+** space it is not appropriate for a system property.
+**
+** WARNING: system/bionic/include/sys/system_properties.h also defines
+** these, but with different names. (TODO: fix that)
+*/
+#define PROPERTY_KEY_MAX 64
+#define PROPERTY_VALUE_MAX 92
+
+/* property_get: returns the length of the value which will never be
+** greater than PROPERTY_VALUE_MAX - 1 and will always be zero terminated.
+** (the length does not include the terminating zero).
+**
+** If the property read fails or returns an empty value, the default
+** value is used (if nonnull).
+*/
+int property_get(const char *key, char *value, const char *default_value);
+
+/* property_set: returns 0 on success, < 0 on failure
+*/
+int property_set(const char *key, const char *value);
+
+int property_list(void (*propfn)(const char *key, const char *value, void *cookie), void *cookie);
+
+
+#ifdef HAVE_SYSTEM_PROPERTY_SERVER
+/*
+ * We have an external property server instead of built-in libc support.
+ * Used by the simulator.
+ */
+#define SYSTEM_PROPERTY_PIPE_NAME "/tmp/android-sysprop"
+
+enum {
+ kSystemPropertyUnknown = 0,
+ kSystemPropertyGet,
+ kSystemPropertySet,
+ kSystemPropertyList
+};
+#endif /*HAVE_SYSTEM_PROPERTY_SERVER*/
+
+
+#ifdef __cplusplus
+}
+#endif
+
+#endif
diff --git a/src/apps/atom-base/progs/property/libprop/prop_api.c b/src/apps/atom-base/progs/property/libprop/prop_api.c
new file mode 100644
index 0000000..7fa2b08
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/prop_api.c
@@ -0,0 +1,182 @@
+/* Copyright Statement:
+
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+
+ * MediaTek Inc. (C) 2015. All rights reserved.
+
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include "cutils/properties.h"
+#include "request.h"
+#include "prop_debug.h"
+
+/*******************************************************************************/
+/* LIBSNCFG functions for Android Property Mechanism */
+/*******************************************************************************/
+int _property_check(const char *key, const char *value)
+{
+ if (key == 0) {
+ PROP_DEBUG_PRINT(PROP_DEBUG_ERROR, "[PropSet] key==0 return directly\n");
+ return -1;
+ }
+
+ if (strlen(key) >= PROPERTY_KEY_MAX) {
+ PROP_DEBUG_PRINT(PROP_DEBUG_ERROR, "[PropSet] key=%s size:%zd >= max:%d\n",
+ key, strlen(key), PROPERTY_KEY_MAX);
+ return -1;
+ }
+
+ if (strlen(value) >= PROPERTY_VALUE_MAX) {
+ PROP_DEBUG_PRINT(PROP_DEBUG_ERROR, "[PropSet] value=%s size:%zd >= max:%d\n",
+ value, strlen(value), PROPERTY_VALUE_MAX);
+ return -1;
+ }
+
+ return 0;
+}
+
+int property_get(const char *key, char *value, const char *default_value)
+{
+ struct sncfg_request request;
+ int ret_len = 1;
+
+ /*check validaty*/
+ if ((key == 0) || (value == 0)) {
+ PROP_DEBUG_PRINT(PROP_DEBUG_ERROR, "[PropSet] key==0 return directly\n");
+ return -1;
+ }
+
+ if (strlen(key) >= PROPERTY_KEY_MAX) {
+ PROP_DEBUG_PRINT(PROP_DEBUG_ERROR, "[PropSet] key=%s size:%zd >= max:%d\n",
+ key, strlen(key), PROPERTY_KEY_MAX);
+ return -1;
+ }
+
+ /*send socket to get the value*/
+ bzero(&request, sizeof(struct sncfg_request));
+ request.magic = SNCFG_REQUEST_MAGIC;
+ request.type = SNCFG_REQUEST_TYPE_PROP_GET;
+ request.key = (char *)key;
+ if (request_for_sncfg(&request) < 0) {
+ ret_len = 0;
+ } else if (NULL == request.value) {
+ ret_len = 0;
+ }
+
+ /*
+ * 1. normal case: use db's value.
+ * 2. other case: use default value.
+ */
+ if (ret_len>0) {
+ ret_len = strlen(request.value);
+ if (ret_len >= PROPERTY_VALUE_MAX) {
+ ret_len = PROPERTY_VALUE_MAX - 1;
+ }
+ strncpy(value, request.value, ret_len);
+ value[ret_len] = '\0';
+ } else {
+ if (default_value) {
+ ret_len = strlen(default_value);
+ if (ret_len >= PROPERTY_VALUE_MAX) {
+ ret_len = PROPERTY_VALUE_MAX - 1;
+ }
+ memcpy(value, default_value, ret_len);
+ value[ret_len] = '\0';
+ } else {
+ value[0] = '\0';
+ }
+ }
+
+ return ret_len;
+}
+
+int property_set(const char *key, const char *in_value)
+{
+ struct sncfg_request request;
+ char *value = "";
+
+ if (in_value != NULL)
+ value = in_value;
+
+ if (_property_check(key, value) < 0) {
+ return -1;
+ }
+
+ bzero(&request, sizeof(struct sncfg_request));
+ request.magic = SNCFG_REQUEST_MAGIC;
+ request.type = SNCFG_REQUEST_TYPE_PROP_SET;
+ request.key = (char *)key;
+ request.value = (char *)value;
+ if (request_for_sncfg(&request) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int property_reload(void)
+{
+ struct sncfg_request request;
+
+ bzero(&request, sizeof(struct sncfg_request));
+
+ request.magic = SNCFG_REQUEST_MAGIC;
+ request.type = SNCFG_REQUEST_TYPE_PROP_RELOAD;
+ if (request_for_sncfg(&request) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int property_debug(char *key, char *in_value)
+{
+ struct sncfg_request request;
+ char *value = "";
+
+ if (in_value != NULL)
+ value = in_value;
+
+ if (_property_check(key, value) < 0) {
+ return -1;
+ }
+
+ bzero(&request, sizeof(struct sncfg_request));
+ request.magic = SNCFG_REQUEST_MAGIC;
+ request.type = SNCFG_REQUEST_TYPE_PROP_DEBUG;
+ request.key = key;
+ request.value = value;
+ if (request_for_sncfg(&request) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
diff --git a/src/apps/atom-base/progs/property/libprop/prop_api.h b/src/apps/atom-base/progs/property/libprop/prop_api.h
new file mode 100644
index 0000000..60756f7
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/prop_api.h
@@ -0,0 +1,43 @@
+/* Copyright Statement:
+
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+
+ * MediaTek Inc. (C) 2015. All rights reserved.
+
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+#ifdef SNCFG_PROPERTY
+
+#ifndef _PROP_API_H
+#define _PROP_API_H
+
+
+
+#endif
+
+#endif
diff --git a/src/apps/atom-base/progs/property/libprop/prop_debug.c b/src/apps/atom-base/progs/property/libprop/prop_debug.c
new file mode 100644
index 0000000..35bbc68
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/prop_debug.c
@@ -0,0 +1,62 @@
+/* Copyright Statement:
+
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+
+ * MediaTek Inc. (C) 2015. All rights reserved.
+
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+#include <stdio.h>
+#include "prop_debug.h"
+
+unsigned int prop_debug_level = PROP_DEBUG_ERROR;
+
+char *prop_debug_name[] =
+ {
+ "",
+ "TEST! ",
+ "FAIL! ",
+ "WARN! ",
+ "TRACE! ",
+ "INFO! ",
+ "LOUD! ",
+ };
+
+int prop_debug_set(unsigned int level)
+{
+ if ((level>=PROP_DEBUG_OFF) && (level <=PROP_DEBUG_LOUD)) {
+ prop_debug_level = level;
+ }
+
+ return 0;
+}
+
+int prop_debug_get(void)
+{
+ return prop_debug_level;
+}
diff --git a/src/apps/atom-base/progs/property/libprop/prop_debug.h b/src/apps/atom-base/progs/property/libprop/prop_debug.h
new file mode 100644
index 0000000..d66d55b
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/prop_debug.h
@@ -0,0 +1,90 @@
+/* Copyright Statement:
+
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+
+ * MediaTek Inc. (C) 2015. All rights reserved.
+
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+#ifndef __PROP_DEBUG_H
+#define __PROP_DEBUG_H
+#include <syslog.h>
+
+#define PROP_DEBUG_OFF 0
+#define PROP_DEBUG_TEST 1
+#define PROP_DEBUG_ERROR 2
+#define PROP_DEBUG_WARN 3
+#define PROP_DEBUG_TRACE 4
+#define PROP_DEBUG_INFO 5
+#define PROP_DEBUG_LOUD 6
+
+extern unsigned int prop_debug_level;
+extern char *prop_debug_name[];
+int prop_debug_set(unsigned int level);
+int prop_debug_get(void);
+
+#if 0
+
+#define PROP_DEBUG_PRINT(level, str, args...) \
+ do { \
+ if(level<=prop_debug_level) \
+ { \
+ printf("\n\r[SNCFGD-PROP] %s - %s ", __FUNCTION__, prop_debug_name[level]); \
+ printf(str, ##args); \
+ } \
+ } while(0)
+
+#define PROP_DEBUG_LOG(level, str, args...) \
+ do { \
+ if(level<=prop_debug_level) \
+ { \
+ printf("\n\r[SNCFGD-PROP] %s - %s ", __FUNCTION__, prop_debug_name[level]); \
+ printf(str, ##args); \
+ } \
+ } while(0)
+#else
+
+#define PROP_DEBUG_PRINT(level, str, args...) \
+ do { \
+ if(level<=prop_debug_level) \
+ { \
+ syslog(LOG_DEBUG, "[PROP][%s:%d]: " str "\n", __FUNCTION__, __LINE__, ## args);\
+ } \
+ } while(0)
+
+#define PROP_DEBUG_LOG(level, str, args...) \
+ do { \
+ if(level<=prop_debug_level) \
+ { \
+ syslog(LOG_DEBUG, "[PROP][%s:%d]: " str "\n", __FUNCTION__, __LINE__, ## args);\
+ } \
+ } while(0)
+
+#endif
+
+#endif
diff --git a/src/apps/atom-base/progs/property/libprop/request.c b/src/apps/atom-base/progs/property/libprop/request.c
new file mode 100644
index 0000000..d72531d
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/request.c
@@ -0,0 +1,264 @@
+/* Copyright Statement:
+
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+
+ * MediaTek Inc. (C) 2015. All rights reserved.
+
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <stddef.h>
+#include <string.h>
+#include <errno.h>
+#include <assert.h>
+#include <unistd.h>
+#include <fcntl.h>
+#include <time.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <sys/un.h>
+#include <syslog.h>
+#include "utility.h"
+#include "request.h"
+
+/*******************************************************************************/
+/* REQUEST local definitions */
+/*******************************************************************************/
+
+/*******************************************************************************/
+/* REQUEST local prototypes */
+/*******************************************************************************/
+
+/*******************************************************************************/
+/* REQUEST local variables */
+/*******************************************************************************/
+
+/*******************************************************************************/
+/* REQUEST local functions */
+/*******************************************************************************/
+static int pack_request_string(char **p, char **next, const char *roof)
+{
+ if (*p == NULL) {
+ return 0;
+ } else {
+ size_t len = strlen(*p) + 1;
+
+ if ((roof - *next) < (ptrdiff_t)len) {
+ return -1;
+ } else {
+ strcpy(*next, *p);
+ *next += len;
+ *p = (char *)0x12345678;
+ return 0;
+ }
+ }
+}
+
+static int unpack_request_string(char **p, char **next, const char *roof)
+{
+ if (*p == NULL) {
+ return 0;
+ } else if (*p == (char *)0x12345678) {
+ char *end = memchr(*next, '\0', roof - *next);
+
+ if (end == NULL) {
+ return -1;
+ } else {
+ *p = *next;
+ *next = end + 1;
+ return 0;
+ }
+ }
+ return -1;
+}
+
+/*******************************************************************************/
+/* REQUEST functions */
+/*******************************************************************************/
+int pack_request(struct sncfg_request *request)
+{
+ int size;
+ char *next, *roof;
+
+ next = request->string + request->reservedLen;
+ roof = next + sizeof(request->string);
+
+ if (request->magic != SNCFG_REQUEST_MAGIC) {
+ return -1;
+ }
+
+ if (request->type >= SNCFG_REQUEST_TYPE_RESERVED) {
+ return -1;
+ }
+
+ if (pack_request_string(&request->key, &next, roof) < 0 ||
+ pack_request_string(&request->value, &next, roof) < 0) {
+ return -1;
+ }
+
+ size = next - (char *)request;
+ return size;
+}
+
+int unpack_request(struct sncfg_request *request, int size)
+{
+ char *next, *roof;
+
+ next = request->string + request->reservedLen;
+ roof = (char *)request + size;
+
+ if (roof < next) {
+ return -1;
+ }
+
+ if (request->magic != SNCFG_REQUEST_MAGIC) {
+ return -1;
+ }
+
+ if (request->type >= SNCFG_REQUEST_TYPE_RESERVED) {
+ return -1;
+ }
+
+ if (unpack_request_string(&request->key, &next, roof) < 0 ||
+ unpack_request_string(&request->value, &next, roof) < 0) {
+ return -1;
+ }
+
+ return 0;
+}
+
+int connect_request(void)
+{
+ int sock;
+ struct sockaddr_un addr = { AF_UNIX, SNCFG_REQUEST_UNIX_SOCKET };
+
+ if (access(addr.sun_path, R_OK | W_OK) < 0) {
+ return -1;
+ }
+
+ sock = socket(AF_UNIX, SOCK_STREAM, 0);
+ if (sock == -1) {
+ return -1;
+ }
+
+ struct timeval tm;
+ tm.tv_sec = 8; /* 8 Secs Timeout */
+ tm.tv_usec = 0;
+
+ if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const void *)&tm, sizeof(tm)) < 0) {
+ fprintf(stderr, "[LIBSNCFG][%d] Can't setsockopt SO_SNDTIMEO 8 seconds for connect ... %s !!\r\n", getpid(), strerror(errno));
+ syslog(LOG_WARNING, "[LIBSNCFG][%d] Can't setsockopt SO_SNDTIMEO 8 seconds for connect ... %s !!", getpid(), strerror(errno));
+ close(sock);
+ return -1;
+ }
+ if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const void *)&tm, sizeof(tm)) < 0) {
+ fprintf(stderr, "[LIBSNCFG][%d] Can't setsockopt SO_RCVTIMEO 8 seconds for connect ... %s !!\r\n", getpid(), strerror(errno));
+ syslog(LOG_WARNING, "[LIBSNCFG][%d] Can't setsockopt SO_RCVTIMEO 8 seconds for connect ... %s !!", getpid(), strerror(errno));
+ close(sock);
+ return -1;
+ }
+
+ if (connect(sock, (struct sockaddr *)&addr,
+ offsetof(struct sockaddr_un, sun_path) + strlen(addr.sun_path)) < 0) {
+ close(sock);
+ return -1;
+ }
+
+ return sock;
+}
+
+int accept_request(int sockfd)
+{
+ int sock;
+ socklen_t addrlen;
+ struct sockaddr_un addr;
+
+ addrlen = sizeof(addr);
+ sock = accept(sockfd, (struct sockaddr *)&addr, &addrlen);
+ if (sock == -1) {
+ return -1;
+ }
+
+ if (fcntl(sock, F_SETFD, FD_CLOEXEC) < 0) {
+ close(sock);
+ return -1;
+ }
+
+ struct timeval tm;
+ tm.tv_sec = 8; /* 8 Secs Timeout */
+ tm.tv_usec = 0;
+
+ if (setsockopt(sock, SOL_SOCKET, SO_SNDTIMEO, (const void *)&tm, sizeof(tm)) < 0) {
+ fprintf(stderr, "[LIBSNCFG][%d] Can't setsockopt SO_SNDTIMEO 8 seconds for accept ... %s !!\r\n", getpid(), strerror(errno));
+ syslog(LOG_WARNING, "[LIBSNCFG][%d] Can't setsockopt SO_SNDTIMEO 8 seconds for accept ... %s !!", getpid(), strerror(errno));
+ close(sock);
+ return -1;
+ }
+ if (setsockopt(sock, SOL_SOCKET, SO_RCVTIMEO, (const void *)&tm, sizeof(tm)) < 0) {
+ fprintf(stderr, "[LIBSNCFG][%d] Can't setsockopt SO_RCVTIMEO 8 seconds for accept ... %s !!\r\n", getpid(), strerror(errno));
+ syslog(LOG_WARNING, "[LIBSNCFG][%d] Can't setsockopt SO_RCVTIMEO 8 seconds for accept ... %s !!", getpid(), strerror(errno));
+ close(sock);
+ return -1;
+ }
+
+ return sock;
+}
+
+int request_for_sncfg(struct sncfg_request *request)
+{
+ int sock, size;
+
+ size = pack_request(request);
+ if (size < 0) {
+ return -1;
+ }
+
+ sock = connect_request();
+ if (sock < 0) {
+ return -1;
+ }
+
+ if (safe_write(sock, request, size) != size) {
+ close(sock);
+ return -1;
+ }
+
+ size = safe_read(sock, request, sizeof(struct sncfg_request));
+
+ if (size < 0 ||
+ unpack_request(request, size) < 0 ||
+ request->status < 0) {
+ /* request processing failed */
+ close(sock);
+ return -1;
+ }
+
+ close(sock);
+ return 0;
+}
diff --git a/src/apps/atom-base/progs/property/libprop/request.h b/src/apps/atom-base/progs/property/libprop/request.h
new file mode 100644
index 0000000..87eec5c
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/request.h
@@ -0,0 +1,102 @@
+/* Copyright Statement:
+
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+
+ * MediaTek Inc. (C) 2015. All rights reserved.
+
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+#ifndef __REQUEST_H__
+#define __REQUEST_H__
+
+
+/*******************************************************************************/
+/* REQUEST definitions */
+/*******************************************************************************/
+#define SNCFG_REQUEST_MAGIC 0x2287
+#define SNCFG_REQUEST_UNIX_SOCKET "/var/run/sncfg.socket"
+
+#ifdef __MEM_COSTDOWN__
+#define SNCFG_REQUEST_MAX_SIZE 512
+#else
+#define SNCFG_REQUEST_MAX_SIZE 4096
+#endif
+
+
+/*******************************************************************************/
+/* REQUEST prototypes */
+/*******************************************************************************/
+enum {
+ SNCFG_REQUEST_TYPE_PROP_SET,
+ SNCFG_REQUEST_TYPE_PROP_GET,
+ SNCFG_REQUEST_TYPE_PROP_RELOAD,
+ SNCFG_REQUEST_TYPE_PROP_DEBUG,
+ SNCFG_REQUEST_TYPE_PROP_CTRLSTOP_SIGNAL,
+ SNCFG_REQUEST_TYPE_PROP_TEST,
+
+ SNCFG_REQUEST_TYPE_RESERVED
+};
+
+
+struct sncfg_request {
+ unsigned short magic;
+ unsigned short type;
+ int status;
+ int reservedLen;
+ char *key;
+ char *value;
+ char string[SNCFG_REQUEST_MAX_SIZE]; /* enough ?? */
+};
+
+struct request_list {
+ struct request_list *prev, *next;
+};
+
+struct req {
+ struct request_list next;
+ int sock;
+ int child_pid;
+ struct sncfg_request request;
+};
+
+
+/*******************************************************************************/
+/* REQUEST variables */
+/*******************************************************************************/
+
+
+/*******************************************************************************/
+/* REQUEST functions */
+/*******************************************************************************/
+extern int pack_request(struct sncfg_request *request);
+extern int unpack_request(struct sncfg_request *request, int size);
+extern int connect_request(void);
+extern int accept_request(int sockfd);
+extern int request_for_sncfg(struct sncfg_request *request);
+
+#endif // __REQUEST_H__
diff --git a/src/apps/atom-base/progs/property/libprop/utility.c b/src/apps/atom-base/progs/property/libprop/utility.c
new file mode 100644
index 0000000..265aa28
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/utility.c
@@ -0,0 +1,186 @@
+/* Copyright Statement:
+
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+
+ * MediaTek Inc. (C) 2015. All rights reserved.
+
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+#include <stdio.h>
+#include <string.h>
+#include <signal.h>
+#include <stdlib.h>
+#include <errno.h>
+#include <unistd.h>
+#include <sched.h>
+#include <sys/types.h>
+#include <sys/wait.h>
+#include <syslog.h>
+#include "utility.h"
+
+/*******************************************************************************/
+/* UTILITY local definitions */
+/*******************************************************************************/
+
+/*******************************************************************************/
+/* UTILITY local prototypes */
+/*******************************************************************************/
+
+/*******************************************************************************/
+/* UTILITY local variables */
+/*******************************************************************************/
+int libsncfg_rw_block = 1;
+
+/*******************************************************************************/
+/* UTILITY local functions */
+/*******************************************************************************/
+
+/*******************************************************************************/
+/* UTILITY functions */
+/*******************************************************************************/
+int safe_close(int fd)
+{
+ int ret;
+
+ do {
+ ret = close(fd);
+ } while (ret < 0 && errno == EINTR);
+
+ if (ret < 0) {
+ int errnoTmp = errno;
+
+ fprintf(stderr, "[LIBSNCFG][%d] close(%d) @ safe_close() failed : %s !!\n", getpid(), fd, strerror(errnoTmp));
+ syslog(LOG_WARNING, "[LIBSNCFG][%d] close(%d) @ safe_close() failed : %s !!", getpid(), fd, strerror(errnoTmp));
+ }
+ return ret;
+}
+
+
+ssize_t safe_read(int fd, void *buf, size_t count)
+{
+ ssize_t n;
+
+again:
+ do {
+ n = read(fd, buf, count);
+ } while (n < 0 && errno == EINTR);
+
+ if (n < 0) {
+ int errnoTmp = errno;
+
+ fprintf(stderr, "[LIBSNCFG][%d] read(%d) @ safe_read() failed : %s !!\n", getpid(), fd, strerror(errnoTmp));
+ syslog(LOG_WARNING, "[LIBSNCFG][%d] read(%d) @ safe_read() failed : %s !!", getpid(), fd, strerror(errnoTmp));
+ if ((errnoTmp == EWOULDBLOCK || errnoTmp == EAGAIN) && libsncfg_rw_block) {
+ goto again;
+ }
+ }
+ return n;
+}
+
+
+ssize_t safe_write(int fd, const void *buf, size_t count)
+{
+ ssize_t n;
+
+again:
+ do {
+ n = write(fd, buf, count);
+ if (n == 0) {
+ fprintf(stderr, "[LIBSNCFG][%d] write(%d) @ safe_write : write zero byte !!\n", getpid(), fd);
+ syslog(LOG_WARNING, "[LIBSNCFG][%d] write(%d) @ safe_write : write zero byte !!", getpid(), fd);
+ }
+ } while (n < 0 && errno == EINTR);
+
+ if (n < 0) {
+ int errnoTmp = errno;
+
+ fprintf(stderr, "[LIBSNCFG][%d] write(%d) @ safe_write() failed : %s !!\n", getpid(), fd, strerror(errnoTmp));
+ syslog(LOG_WARNING, "[LIBSNCFG][%d] write(%d) @ safe_write() failed : %s !!", getpid(), fd, strerror(errnoTmp));
+ if ((errno == EWOULDBLOCK || errno == EAGAIN) && libsncfg_rw_block) {
+ goto again;
+ }
+ }
+ return n;
+}
+
+char *dupstr(char* s)
+{
+ char *r;
+
+ r = malloc (strlen (s) + 1);
+ if (r)
+ strcpy (r, s);
+ return (r);
+}
+
+int nonrt_system(const char *cmd)
+{
+ int wait_val, pid;
+ sig_t save_quit, save_int, save_chld;
+ struct sched_param sched;
+
+ if (cmd == 0) {
+ return 1;
+ }
+
+ save_quit = signal(SIGQUIT, SIG_IGN);
+ save_int = signal(SIGINT, SIG_IGN);
+ save_chld = signal(SIGCHLD, SIG_DFL);
+
+ if ((pid = vfork()) < 0) {
+ signal(SIGQUIT, save_quit);
+ signal(SIGINT, save_int);
+ signal(SIGCHLD, save_chld);
+ return -1;
+ }
+ if (pid == 0) {
+ signal(SIGQUIT, SIG_DFL);
+ signal(SIGINT, SIG_DFL);
+ signal(SIGCHLD, SIG_DFL);
+
+ /* child, can only call thread safe functions before exec ... */
+ sched.sched_priority = 0;
+ if (sched_setscheduler(0, SCHED_OTHER, &sched) == -1) {
+ exit(127);
+ }
+ execl("/bin/sh", "sh", "-c", cmd, (char *) 0);
+ exit(127);
+ }
+ /* Signals are not absolutly guarenteed with vfork */
+ signal(SIGQUIT, SIG_IGN);
+ signal(SIGINT, SIG_IGN);
+
+ if (wait4(pid, &wait_val, 0, 0) == -1) {
+ wait_val = -1;
+ }
+
+ signal(SIGQUIT, save_quit);
+ signal(SIGINT, save_int);
+ signal(SIGCHLD, save_chld);
+ return wait_val;
+}
diff --git a/src/apps/atom-base/progs/property/libprop/utility.h b/src/apps/atom-base/progs/property/libprop/utility.h
new file mode 100644
index 0000000..5495171
--- /dev/null
+++ b/src/apps/atom-base/progs/property/libprop/utility.h
@@ -0,0 +1,63 @@
+/* Copyright Statement:
+
+ * This software/firmware and related documentation ("MediaTek Software") are
+ * protected under relevant copyright laws. The information contained herein is
+ * confidential and proprietary to MediaTek Inc. and/or its licensors. Without
+ * the prior written permission of MediaTek inc. and/or its licensors, any
+ * reproduction, modification, use or disclosure of MediaTek Software, and
+ * information contained herein, in whole or in part, shall be strictly
+ * prohibited.
+
+ * MediaTek Inc. (C) 2015. All rights reserved.
+
+ * BY OPENING THIS FILE, RECEIVER HEREBY UNEQUIVOCALLY ACKNOWLEDGES AND AGREES
+ * THAT THE SOFTWARE/FIRMWARE AND ITS DOCUMENTATIONS ("MEDIATEK SOFTWARE")
+ * RECEIVED FROM MEDIATEK AND/OR ITS REPRESENTATIVES ARE PROVIDED TO RECEIVER
+ * ON AN "AS-IS" BASIS ONLY. MEDIATEK EXPRESSLY DISCLAIMS ANY AND ALL
+ * WARRANTIES, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE IMPLIED
+ * WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE OR
+ * NONINFRINGEMENT. NEITHER DOES MEDIATEK PROVIDE ANY WARRANTY WHATSOEVER WITH
+ * RESPECT TO THE SOFTWARE OF ANY THIRD PARTY WHICH MAY BE USED BY,
+ * INCORPORATED IN, OR SUPPLIED WITH THE MEDIATEK SOFTWARE, AND RECEIVER AGREES
+ * TO LOOK ONLY TO SUCH THIRD PARTY FOR ANY WARRANTY CLAIM RELATING THERETO.
+ * RECEIVER EXPRESSLY ACKNOWLEDGES THAT IT IS RECEIVER'S SOLE RESPONSIBILITY TO
+ * OBTAIN FROM ANY THIRD PARTY ALL PROPER LICENSES CONTAINED IN MEDIATEK
+ * SOFTWARE. MEDIATEK SHALL ALSO NOT BE RESPONSIBLE FOR ANY MEDIATEK SOFTWARE
+ * RELEASES MADE TO RECEIVER'S SPECIFICATION OR TO CONFORM TO A PARTICULAR
+ * STANDARD OR OPEN FORUM. RECEIVER'S SOLE AND EXCLUSIVE REMEDY AND MEDIATEK'S
+ * ENTIRE AND CUMULATIVE LIABILITY WITH RESPECT TO THE MEDIATEK SOFTWARE
+ * RELEASED HEREUNDER WILL BE, AT MEDIATEK'S OPTION, TO REVISE OR REPLACE THE
+ * MEDIATEK SOFTWARE AT ISSUE, OR REFUND ANY SOFTWARE LICENSE FEES OR SERVICE
+ * CHARGE PAID BY RECEIVER TO MEDIATEK FOR SUCH MEDIATEK SOFTWARE AT ISSUE.
+ */
+
+#ifndef __UTILITY_H__
+#define __UTILITY_H__
+
+
+/*******************************************************************************/
+/* UTILITY definitions */
+/*******************************************************************************/
+
+
+/*******************************************************************************/
+/* UTILITY prototypes */
+/*******************************************************************************/
+
+
+/*******************************************************************************/
+/* UTILITY variables */
+/*******************************************************************************/
+
+
+/*******************************************************************************/
+/* UTILITY functions */
+/*******************************************************************************/
+extern int safe_close(int fd);
+extern ssize_t safe_read(int fd, void *buf, size_t count);
+extern ssize_t safe_write(int fd, const void *buf, size_t count);
+extern char *dupstr(char* s);
+extern int nonrt_system(const char *cmd);
+
+
+#endif // __UTILITY_H__