mirror of
https://github.com/Evolution-X-Devices/device_google_redfin
synced 2026-01-27 19:13:26 +00:00
Create aosp_redfin target
am: 1c2dbd8222
Change-Id: Iffedd8d04c2e9d657424ab656b1c7eb55e72a487
This commit is contained in:
6
Android.bp
Normal file
6
Android.bp
Normal file
@@ -0,0 +1,6 @@
|
||||
soong_namespace {
|
||||
imports: [
|
||||
"hardware/google/interfaces",
|
||||
"hardware/google/pixel",
|
||||
],
|
||||
}
|
||||
22
Android.mk
Normal file
22
Android.mk
Normal file
@@ -0,0 +1,22 @@
|
||||
#
|
||||
# Copyright 2018 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
ifeq ($(USES_DEVICE_GOOGLE_REDFIN),true)
|
||||
subdir_makefiles=$(call first-makefiles-under,$(LOCAL_PATH))
|
||||
$(foreach mk,$(subdir_makefiles),$(info including $(mk) ...)$(eval include $(mk)))
|
||||
endif
|
||||
21
AndroidProducts.mk
Normal file
21
AndroidProducts.mk
Normal file
@@ -0,0 +1,21 @@
|
||||
#
|
||||
# Copyright 2018 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
PRODUCT_MAKEFILES := \
|
||||
$(LOCAL_DIR)/aosp_redfin.mk \
|
||||
|
||||
COMMON_LUNCH_CHOICES := \
|
||||
aosp_redfin-userdebug \
|
||||
259
BoardConfig-common.mk
Normal file
259
BoardConfig-common.mk
Normal file
@@ -0,0 +1,259 @@
|
||||
#
|
||||
# Copyright (C) 2016 The Android Open-Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
include build/make/target/board/BoardConfigMainlineCommon.mk
|
||||
|
||||
TARGET_BOARD_PLATFORM := lito
|
||||
TARGET_BOARD_INFO_FILE := device/google/redfin/board-info.txt
|
||||
USES_DEVICE_GOOGLE_REDFIN := true
|
||||
TARGET_ARCH := arm64
|
||||
TARGET_ARCH_VARIANT := armv8-2a
|
||||
TARGET_CPU_ABI := arm64-v8a
|
||||
TARGET_CPU_ABI2 :=
|
||||
TARGET_CPU_VARIANT := cortex-a76
|
||||
|
||||
TARGET_2ND_ARCH := arm
|
||||
TARGET_2ND_ARCH_VARIANT := armv8-a
|
||||
TARGET_2ND_CPU_ABI := armeabi-v7a
|
||||
TARGET_2ND_CPU_ABI2 := armeabi
|
||||
TARGET_2ND_CPU_VARIANT := cortex-a76
|
||||
|
||||
BUILD_BROKEN_ENG_DEBUG_TAGS := true
|
||||
|
||||
TARGET_BOARD_COMMON_PATH := device/google/redfin/sm7250
|
||||
|
||||
BOARD_KERNEL_CMDLINE += console=ttyMSM0,115200n8 androidboot.console=ttyMSM0 printk.devkmsg=on
|
||||
BOARD_KERNEL_CMDLINE += msm_rtb.filter=0x237
|
||||
BOARD_KERNEL_CMDLINE += ehci-hcd.park=3
|
||||
BOARD_KERNEL_CMDLINE += service_locator.enable=1
|
||||
BOARD_KERNEL_CMDLINE += androidboot.memcg=1 cgroup.memory=nokmem
|
||||
BOARD_KERNEL_CMDLINE += lpm_levels.sleep_disabled=1 # STOPSHIP b/113233473
|
||||
BOARD_KERNEL_CMDLINE += usbcore.autosuspend=7
|
||||
BOARD_KERNEL_CMDLINE += androidboot.usbcontroller=a600000.dwc3 swiotlb=2048
|
||||
BOARD_KERNEL_CMDLINE += androidboot.selinux=permissive # STOPSHIP b/113232677
|
||||
BOARD_KERNEL_CMDLINE += androidboot.boot_devices=soc/1d84000.ufshc
|
||||
|
||||
BOARD_KERNEL_BASE := 0x00000000
|
||||
BOARD_KERNEL_PAGESIZE := 4096
|
||||
|
||||
BOARD_INCLUDE_DTB_IN_BOOTIMG := true
|
||||
BOARD_BOOT_HEADER_VERSION := 2
|
||||
BOARD_MKBOOTIMG_ARGS += --header_version $(BOARD_BOOT_HEADER_VERSION)
|
||||
|
||||
# DTBO partition definitions
|
||||
BOARD_PREBUILT_DTBOIMAGE := device/google/redfin-kernel/dtbo.img
|
||||
BOARD_DTBOIMG_PARTITION_SIZE := 8388608
|
||||
|
||||
TARGET_NO_KERNEL := false
|
||||
BOARD_USES_RECOVERY_AS_BOOT := true
|
||||
BOARD_USES_METADATA_PARTITION := true
|
||||
|
||||
AB_OTA_UPDATER := true
|
||||
|
||||
AB_OTA_PARTITIONS += \
|
||||
boot \
|
||||
system \
|
||||
vbmeta \
|
||||
dtbo \
|
||||
product \
|
||||
vbmeta_system
|
||||
|
||||
# Partitions (listed in the file) to be wiped under recovery.
|
||||
TARGET_RECOVERY_WIPE := device/google/redfin/recovery.wipe
|
||||
TARGET_RECOVERY_FSTAB := device/google/redfin/fstab.hardware
|
||||
TARGET_RECOVERY_PIXEL_FORMAT := RGBX_8888
|
||||
TARGET_RECOVERY_UI_LIB := \
|
||||
librecovery_ui_redfin \
|
||||
libnos_citadel_for_recovery \
|
||||
libnos_for_recovery
|
||||
|
||||
# Enable chain partition for system.
|
||||
BOARD_AVB_VBMETA_SYSTEM := system
|
||||
BOARD_AVB_VBMETA_SYSTEM_KEY_PATH := external/avb/test/data/testkey_rsa2048.pem
|
||||
BOARD_AVB_VBMETA_SYSTEM_ALGORITHM := SHA256_RSA2048
|
||||
BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX := $(PLATFORM_SECURITY_PATCH_TIMESTAMP)
|
||||
BOARD_AVB_VBMETA_SYSTEM_ROLLBACK_INDEX_LOCATION := 1
|
||||
|
||||
# product.img
|
||||
BOARD_PRODUCTIMAGE_FILE_SYSTEM_TYPE := ext4
|
||||
|
||||
# userdata.img
|
||||
TARGET_USERIMAGES_USE_F2FS := true
|
||||
BOARD_USERDATAIMAGE_PARTITION_SIZE := 10737418240
|
||||
BOARD_USERDATAIMAGE_FILE_SYSTEM_TYPE := f2fs
|
||||
|
||||
# persist.img
|
||||
BOARD_PERSISTIMAGE_PARTITION_SIZE := 33554432
|
||||
BOARD_PERSISTIMAGE_FILE_SYSTEM_TYPE := ext4
|
||||
|
||||
# boot.img
|
||||
BOARD_BOOTIMAGE_PARTITION_SIZE := 0x04000000
|
||||
|
||||
BOARD_FLASH_BLOCK_SIZE := 131072
|
||||
|
||||
BOARD_ROOT_EXTRA_SYMLINKS := /vendor/lib/dsp:/dsp
|
||||
BOARD_ROOT_EXTRA_SYMLINKS += /mnt/vendor/persist:/persist
|
||||
|
||||
include device/google/redfin-sepolicy/redfin-sepolicy.mk
|
||||
|
||||
TARGET_FS_CONFIG_GEN := device/google/redfin/config.fs
|
||||
|
||||
QCOM_BOARD_PLATFORMS += lito
|
||||
QC_PROP_ROOT := vendor/qcom/sm7250/proprietary
|
||||
QC_PROP_PATH := $(QC_PROP_ROOT)
|
||||
BOARD_HAVE_BLUETOOTH_QCOM := true
|
||||
BOARD_HAVE_QCOM_FM := false
|
||||
BOARD_USES_COMMON_BLUETOOTH_HAL := true
|
||||
|
||||
# Camera
|
||||
TARGET_USES_AOSP := true
|
||||
BOARD_QTI_CAMERA_32BIT_ONLY := false
|
||||
CAMERA_DAEMON_NOT_PRESENT := true
|
||||
TARGET_USES_ION := true
|
||||
|
||||
# GPS
|
||||
TARGET_NO_RPC := true
|
||||
TARGET_USES_HARDWARE_QCOM_GPS := false
|
||||
BOARD_VENDOR_QCOM_GPS_LOC_API_HARDWARE := default
|
||||
BOARD_VENDOR_QCOM_LOC_PDK_FEATURE_SET := true
|
||||
|
||||
# RenderScript
|
||||
OVERRIDE_RS_DRIVER := libRSDriver_adreno.so
|
||||
|
||||
# Sensors
|
||||
USE_SENSOR_MULTI_HAL := true
|
||||
TARGET_SUPPORT_DIRECT_REPORT := true
|
||||
# Enable sensor Version V_2
|
||||
USE_SENSOR_HAL_VER := 2.0
|
||||
|
||||
# wlan
|
||||
BOARD_WLAN_DEVICE := qcwcn
|
||||
BOARD_WPA_SUPPLICANT_DRIVER := NL80211
|
||||
BOARD_HOSTAPD_DRIVER := NL80211
|
||||
WIFI_DRIVER_DEFAULT := qca_cld3
|
||||
WPA_SUPPLICANT_VERSION := VER_0_8_X
|
||||
BOARD_WPA_SUPPLICANT_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
|
||||
BOARD_HOSTAPD_PRIVATE_LIB := lib_driver_cmd_$(BOARD_WLAN_DEVICE)
|
||||
WIFI_HIDL_FEATURE_AWARE := true
|
||||
WIFI_HIDL_FEATURE_DUAL_INTERFACE:= true
|
||||
|
||||
# Audio
|
||||
BOARD_USES_ALSA_AUDIO := true
|
||||
AUDIO_FEATURE_ENABLED_MULTI_VOICE_SESSIONS := true
|
||||
AUDIO_FEATURE_ENABLED_SND_MONITOR := true
|
||||
AUDIO_FEATURE_ENABLED_USB_TUNNEL := true
|
||||
AUDIO_FEATURE_ENABLED_CIRRUS_SPKR_PROTECTION := true
|
||||
BOARD_SUPPORTS_SOUND_TRIGGER := true
|
||||
AUDIO_FEATURE_FLICKER_SENSOR_INPUT := true
|
||||
SOUND_TRIGGER_FEATURE_LPMA_ENABLED := true
|
||||
AUDIO_FEATURE_ENABLED_MAXX_AUDIO := true
|
||||
AUDIO_FEATURE_ENABLED_24BITS_CAMCORDER := true
|
||||
AUDIO_FEATURE_ENABLED_AUDIO_ZOOM := true
|
||||
AUDIO_FEATURE_ENABLED_INSTANCE_ID := true
|
||||
|
||||
# Audio hal flag
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO := true
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO_PLATFORM_8974 := true
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO_POSTPROC := true
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO_VOLUME_LISTENER := true
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO_GET_MMAP_DATA_FD := true
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO_APP_TYPE_CFG := true
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO_ACDB_INIT_V2_CVD := true
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO_MAX_TARGET_SPECIFIC_CHANNEL_CNT := "4"
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO_INCALL_MUSIC_ENABLED := true
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO_MULTIPLE_HW_VARIANTS_ENABLED := true
|
||||
TARGET_USES_HARDWARE_QCOM_AUDIO_INCALL_STEREO_CAPTURE_ENABLED := true
|
||||
|
||||
# Graphics
|
||||
TARGET_USES_GRALLOC1 := true
|
||||
TARGET_USES_HWC2 := true
|
||||
|
||||
VSYNC_EVENT_PHASE_OFFSET_NS := 2000000
|
||||
SF_VSYNC_EVENT_PHASE_OFFSET_NS := 6000000
|
||||
|
||||
# Display
|
||||
TARGET_USES_DISPLAY_RENDER_INTENTS := true
|
||||
TARGET_USES_COLOR_METADATA := true
|
||||
TARGET_USES_DRM_PP := true
|
||||
|
||||
# Misc
|
||||
TARGET_USES_HARDWARE_QCOM_BOOTCTRL := true
|
||||
|
||||
|
||||
# Vendor Interface Manifest
|
||||
DEVICE_MANIFEST_FILE := device/google/redfin/manifest.xml
|
||||
DEVICE_MATRIX_FILE := device/google/redfin/compatibility_matrix.xml
|
||||
DEVICE_FRAMEWORK_COMPATIBILITY_MATRIX_FILE := device/google/redfin/device_framework_matrix.xml
|
||||
DEVICE_FRAMEWORK_MANIFEST_FILE := device/google/redfin/framework_manifest.xml
|
||||
|
||||
# Use mke2fs to create ext4 images
|
||||
TARGET_USES_MKE2FS := true
|
||||
|
||||
BOARD_EXT4_SHARE_DUP_BLOCKS := true
|
||||
|
||||
# Kernel modules
|
||||
ifeq (,$(filter-out redfin_kasan, $(TARGET_PRODUCT)))
|
||||
BOARD_VENDOR_KERNEL_MODULES += \
|
||||
$(wildcard device/google/redfin-kernel/kasan/*.ko)
|
||||
else ifeq (,$(filter-out redfin_kernel_debug_memory, $(TARGET_PRODUCT)))
|
||||
BOARD_VENDOR_KERNEL_MODULES += \
|
||||
$(wildcard device/google/redfin-kernel/debug_memory/*.ko)
|
||||
else ifeq (,$(filter-out redfin_kernel_debug_locking, $(TARGET_PRODUCT)))
|
||||
BOARD_VENDOR_KERNEL_MODULES += \
|
||||
$(wildcard device/google/redfin-kernel/debug_locking/*.ko)
|
||||
else ifeq (,$(filter-out redfin_kernel_debug_hang, $(TARGET_PRODUCT)))
|
||||
BOARD_VENDOR_KERNEL_MODULES += \
|
||||
$(wildcard device/google/redfin-kernel/debug_hang/*.ko)
|
||||
else ifeq (,$(filter-out redfin_kernel_debug_api, $(TARGET_PRODUCT)))
|
||||
BOARD_VENDOR_KERNEL_MODULES += \
|
||||
$(wildcard device/google/redfin-kernel/debug_api/*.ko)
|
||||
else
|
||||
BOARD_VENDOR_KERNEL_MODULES += \
|
||||
$(wildcard device/google/redfin-kernel/*.ko)
|
||||
endif
|
||||
|
||||
BOARD_SUPER_PARTITION_SIZE := 9755951104
|
||||
BOARD_SUPER_PARTITION_GROUPS := google_dynamic_partitions
|
||||
BOARD_GOOGLE_DYNAMIC_PARTITIONS_PARTITION_LIST := \
|
||||
system \
|
||||
vendor \
|
||||
product
|
||||
|
||||
#BOARD_GOOGLE_DYNAMIC_PARTITIONS_SIZE is set to BOARD_SUPER_PARTITION_SIZE / 2 - 4MB
|
||||
BOARD_GOOGLE_DYNAMIC_PARTITIONS_SIZE := 4873781248
|
||||
|
||||
# Set error limit to BOARD_SUPER_PARTITON_SIZE - 500MB
|
||||
BOARD_SUPER_PARTITION_ERROR_LIMIT := 9231663104
|
||||
|
||||
# DTB
|
||||
ifeq (,$(filter-out redfin_kasan, $(TARGET_PRODUCT)))
|
||||
BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel/kasan
|
||||
else ifeq (,$(filter-out redfin_kernel_debug_memory, $(TARGET_PRODUCT)))
|
||||
BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel/debug_memory
|
||||
else ifeq (,$(filter-out redfin_kernel_debug_locking, $(TARGET_PRODUCT)))
|
||||
BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel/debug_locking
|
||||
else ifeq (,$(filter-out redfin_kernel_debug_hang, $(TARGET_PRODUCT)))
|
||||
BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel/debug_hang
|
||||
else ifeq (,$(filter-out redfin_kernel_debug_api, $(TARGET_PRODUCT)))
|
||||
BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel/debug_api
|
||||
else
|
||||
BOARD_PREBUILT_DTBIMAGE_DIR := device/google/redfin-kernel
|
||||
endif
|
||||
|
||||
# Testing related defines
|
||||
#BOARD_PERFSETUP_SCRIPT := platform_testing/scripts/perf-setup/r3-setup.sh
|
||||
|
||||
-include vendor/google_devices/redfin/proprietary/BoardConfigVendor.mk
|
||||
90
CleanSpec.mk
Normal file
90
CleanSpec.mk
Normal file
@@ -0,0 +1,90 @@
|
||||
# Copyright 2018 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
# If you don't need to do a full clean build but would like to touch
|
||||
# a file or delete some intermediate files, add a clean step to the end
|
||||
# of the list. These steps will only be run once, if they haven't been
|
||||
# run before.
|
||||
#
|
||||
# E.g.:
|
||||
# $(call add-clean-step, touch -c external/sqlite/sqlite3.h)
|
||||
# $(call add-clean-step, rm -rf $(PRODUCT_OUT)/obj/STATIC_LIBRARIES/libz_intermediates)
|
||||
#
|
||||
# Always use "touch -c" and "rm -f" or "rm -rf" to gracefully deal with
|
||||
# files that are missing or have been moved.
|
||||
#
|
||||
# Use $(PRODUCT_OUT) to get to the "out/target/product/blah/" directory.
|
||||
# Use $(OUT_DIR) to refer to the "out" directory.
|
||||
#
|
||||
# If you need to re-do something that's already mentioned, just copy
|
||||
# the command and add it to the bottom of the list. E.g., if a change
|
||||
# that you made last week required touching a file and a change you
|
||||
# made today requires touching the same file, just copy the old
|
||||
# touch step and add it to the end of the list.
|
||||
#
|
||||
# ************************************************
|
||||
# NEWER CLEAN STEPS MUST BE AT THE END OF THE LIST
|
||||
# ************************************************
|
||||
|
||||
# For example:
|
||||
#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/APPS/AndroidTests_intermediates)
|
||||
#$(call add-clean-step, rm -rf $(OUT_DIR)/target/common/obj/JAVA_LIBRARIES/core_intermediates)
|
||||
#$(call add-clean-step, find $(OUT_DIR) -type f -name "IGTalkSession*" -print0 | xargs -0 rm -f)
|
||||
#$(call add-clean-step, rm -rf $(PRODUCT_OUT)/data/*)
|
||||
|
||||
|
||||
# Remove default android.hardware.health@2.0-service
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.health@2.0-service)
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.health@2.0-service.rc)
|
||||
|
||||
# Remove healthd
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/bin/healthd)
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/init/healthd.rc)
|
||||
|
||||
# Move libnfc-nci.conf to /vendor
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/system/etc/libnfc-nci.conf)
|
||||
|
||||
# Remove /firmware which used to be a symlink to /vendor/firmware_mnt
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/root/firmware)
|
||||
|
||||
# Remove thermalHAL 1.0
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.thermal@1.0-service.redfin.rc)
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.thermal@1.0-service.redfin)
|
||||
|
||||
# Remove default android.hardware.composer@2.2
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.graphics.composer@2.2-service)
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.graphics.composer@2.2-service.rc)
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/lib64/hw/android.hardware.graphics.composer@2.2-impl.so)
|
||||
|
||||
# Remove default android.hardware.graphics.composer@2.3-service
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.graphics.composer@2.3-service)
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.graphics.composer@2.3-service.rc)
|
||||
|
||||
# Remove super_empty.img
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/super_empty.img)
|
||||
|
||||
# Remove Vibrator HAL 1.2
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.vibrator@1.2-service.redfin.rc)
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/bin/hw/android.hardware.vibrator@1.2-service.redfin)
|
||||
|
||||
# Remove Misnamed Vibrator VINTF Fragment
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/vintf/manifest/manifest.xml)
|
||||
|
||||
# Rename power HAL
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/init/android.hardware.power@1.3-service.redfin-libperfmgr.rc)
|
||||
|
||||
# Remove VR permission
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/permissions/android.hardware.vr.headtracking.xml)
|
||||
$(call add-clean-step, rm -rf $(PRODUCT_OUT)/vendor/etc/permissions/android.hardware.vr.high_performance.xml)
|
||||
429
WCNSS_qcom_cfg.ini
Normal file
429
WCNSS_qcom_cfg.ini
Normal file
@@ -0,0 +1,429 @@
|
||||
# This file allows user to override the factory
|
||||
# defaults for the WLAN Driver
|
||||
|
||||
#############################################
|
||||
# Power related configurations
|
||||
#############################################
|
||||
# Phy Mode (auto, b, g, n, etc)
|
||||
# Valid values are 0-9, with 0 = Auto, 4 = 11n, 9 = 11ac
|
||||
# 1 = 11abg, 2 = 11b, 3 = 11g, 5 = 11g only, 6 = 11n only
|
||||
# 7 = 11b only 8 = 11ac only.
|
||||
gDot11Mode=0
|
||||
|
||||
#############################################
|
||||
# STA related general configurations
|
||||
#############################################
|
||||
# UAPSD service interval for VO,VI, BE, BK traffic
|
||||
InfraUapsdVoSrvIntv=0
|
||||
InfraUapsdViSrvIntv=0
|
||||
InfraUapsdBeSrvIntv=0
|
||||
InfraUapsdBkSrvIntv=0
|
||||
|
||||
# Flag to allow STA send AddTspec even when ACM is Off
|
||||
gAddTSWhenACMIsOff=1
|
||||
|
||||
#############################################
|
||||
# SAP related configurations
|
||||
#############################################
|
||||
#Enable OBSS protection
|
||||
gEnableApOBSSProt=1
|
||||
|
||||
# Maximum Tx power
|
||||
# gTxPowerCap=30
|
||||
|
||||
# Fragmentation Threshold
|
||||
# gFragmentationThreshold=2346
|
||||
|
||||
# RTS threshold
|
||||
RTSThreshold=1048576
|
||||
|
||||
# 802.11d support
|
||||
g11dSupportEnabled=0
|
||||
|
||||
# DFS Master Capability
|
||||
gEnableDFSMasterCap=1
|
||||
|
||||
gNeighborLookupThreshold=76
|
||||
|
||||
# Legacy (non-ESE, non-802.11r) Fast Roaming Support
|
||||
# To enable, set FastRoamEnabled=1
|
||||
# To disable, set FastRoamEnabled=0
|
||||
FastRoamEnabled=1
|
||||
|
||||
# Check if the AP to which we are roaming is better than current AP in
|
||||
# terms of RSSI. Checking is disabled if set to Zero.Otherwise it will
|
||||
# use this value as to how better the RSSI of the new/roamable AP should
|
||||
# be for roaming
|
||||
RoamRssiDiff=3
|
||||
|
||||
#Channel Bonding
|
||||
gChannelBondingMode5GHz=1
|
||||
|
||||
#Say gGoKeepAlivePeriod(5 seconds) and gGoLinkMonitorPeriod(10 seconds).
|
||||
#For every 10 seconds DUT send Qos Null frame(i.e., Keep Alive frame if link
|
||||
#is idle for last 10 seconds.) For both active and power save clients.
|
||||
|
||||
#Power save clients: DUT set TIM bit from 10th second onwards and till client
|
||||
#honors TIM bit. If doesn't honor for 5 seconds then DUT remove client.
|
||||
|
||||
#Active clients: DUT send Qos Null frame for 10th seconds onwards if it is not
|
||||
#success still we try on 11th second if not tries on 12th and so on till 15th
|
||||
#second. Hence before disconnection DUT will send 5 NULL frames. Hence in any
|
||||
#case DUT will detect client got removed in (10+5) seconds.
|
||||
#i.e., (gGoKeepAlivePeriod + gGoLinkMonitorPeriod)..
|
||||
|
||||
#gGoLinkMonitorPeriod/ gApLinkMonitorPeriod is period where link is idle and
|
||||
#it is period where we send NULL frame.
|
||||
#gApLinkMonitorPeriod = 10
|
||||
#gGoLinkMonitorPeriod = 10
|
||||
|
||||
# Enable DFS channel roam
|
||||
# 0: DISABLE, 1: ENABLED_NORMAL, 2: ENABLED_ACTIVE
|
||||
gAllowDFSChannelRoam=1
|
||||
|
||||
# chain mask related params
|
||||
#
|
||||
# Set txchainmask and rxchainmask
|
||||
# These parameters are used only if gEnable2x2 is 0
|
||||
# Valid values are 1,2
|
||||
# Set gSetTxChainmask1x1=1 or gSetRxChainmask1x1=1 to select chain0.
|
||||
# Set gSetTxChainmask1x1=2 or gSetRxChainmask1x1=2 to select chain1.
|
||||
gSetTxChainmask1x1=1
|
||||
gSetRxChainmask1x1=1
|
||||
|
||||
# MCC to SCC Switch mode:
|
||||
# 0-Disable
|
||||
# 1-Enable
|
||||
# 2-Force SCC if same band, with SAP restart
|
||||
# 3-Force SCC if same band, without SAP restart by sending (E)CSA
|
||||
# 4-Force SCC if same band (or) use SAP mandatory channel for DBS,
|
||||
# without SAP restart by sending (E)CSA
|
||||
gWlanMccToSccSwitchMode = 3
|
||||
|
||||
# 1=enable tx STBC; 0=disable
|
||||
gEnableTXSTBC=1
|
||||
|
||||
# 1=enable rx LDPC; 0=disable
|
||||
gEnableRXLDPC=1
|
||||
|
||||
#Enable/Disable Tx beamformee in SAP mode
|
||||
gEnableTxBFeeSAP=1
|
||||
|
||||
# Enable Tx beamforming in VHT20MHz
|
||||
# Valid values are 0,1. If commented out, the default value is 0.
|
||||
# 0=disable, 1=enable
|
||||
gEnableTxBFin20MHz=1
|
||||
|
||||
# 802.11K support
|
||||
gRrmEnable=1
|
||||
|
||||
#Enable Power Save offload
|
||||
gEnablePowerSaveOffload=2
|
||||
|
||||
# Maximum Receive AMPDU size (VHT only. Valid values:
|
||||
# 0->8k 1->16k 2->32k 3->64k 4->128k)
|
||||
gVhtAmpduLenExponent=7
|
||||
|
||||
# Maximum MPDU length (VHT only. Valid values:
|
||||
# 0->3895 octets, 1->7991 octets, 2->11454 octets)
|
||||
gVhtMpduLen=2
|
||||
|
||||
# Maximum number of wow filters required
|
||||
#gMaxWoWFilters=22
|
||||
|
||||
# WOW Enable/Disable.
|
||||
# 0 - Disable both magic pattern match and pattern byte match.
|
||||
# 1 - Enable magic pattern match on all interfaces.
|
||||
# 2 - Enable pattern byte match on all interfaces.
|
||||
# 3 - Enable both magic pattern and pattern byte match on all interfaces.
|
||||
# Default value of gEnableWoW is 3.
|
||||
# gEnableWoW=0
|
||||
|
||||
#############################################
|
||||
# P2P related configurations
|
||||
#############################################
|
||||
#Enable or Disable p2p device address administered
|
||||
isP2pDeviceAddrAdministrated=0
|
||||
|
||||
# Set Thermal Power limit
|
||||
TxPower2g=10
|
||||
TxPower5g=10
|
||||
|
||||
#Enable VHT on 2.4Ghz
|
||||
gEnableVhtFor24GHzBand=1
|
||||
|
||||
#############################################
|
||||
# Offload related configurations
|
||||
#############################################
|
||||
#Maximum number of offload peers supported
|
||||
# gMaxOffloadPeers=2
|
||||
|
||||
# controlling the following offload patterns
|
||||
# through ini parameter. Default value is 1
|
||||
# to disable set it to zero. ssdp = 0
|
||||
# Setup multicast pattern for mDNS 224.0.0.251,
|
||||
# SSDP 239.255.255.250 and LLMNR 224.0.0.252
|
||||
ssdp=0
|
||||
|
||||
# Regulatory Setting; 0=STRICT; 1=CUSTOM
|
||||
gRegulatoryChangeCountry=1
|
||||
|
||||
# RA filtering rate limit param, the current value would not
|
||||
# help if the lifetime in RA is less than 3*60=3min. Then
|
||||
# we need to change it, though it is uncommon.
|
||||
# gRAFilterEnable=0
|
||||
gRArateLimitInterval=600
|
||||
|
||||
# Disable/Enable GreenAP
|
||||
# 0 to disable, 1 to enable, default: 1
|
||||
gEnableGreenAp=0
|
||||
|
||||
#Enable/Disable LPASS support
|
||||
# 0 to disable, 1 to enable
|
||||
gEnableLpassSupport=1
|
||||
|
||||
# Whether userspace country code setting shld have priority
|
||||
gCountryCodePriority=1
|
||||
|
||||
# Enable or Disable Multi-user MIMO
|
||||
# 1=Enable (default), 0=Disable
|
||||
gEnableMuBformee=1
|
||||
|
||||
# Inactivity time (in ms) to end TX Service Period while in IBSS power save mode
|
||||
gIbssTxSpEndInactivityTime=10
|
||||
|
||||
#############################################
|
||||
# TDLS related configurations
|
||||
#############################################
|
||||
# Enable support for TDLS
|
||||
# 0 - disable
|
||||
# 1 - enable
|
||||
gEnableTDLSSupport=1
|
||||
|
||||
# Enable support for Implicit Trigger of TDLS. That is, wlan driver shall
|
||||
# initiate TDLS Discovery towards a peer whenever setup criteria (throughput
|
||||
# and RSSI) is met and then will initiate teardown when teardown criteria
|
||||
# (idle packet count and RSSI) is met.
|
||||
# 0 - disable
|
||||
# 1 - enable
|
||||
gEnableTDLSImplicitTrigger=1
|
||||
|
||||
# Enable support for TDLS off-channel operation
|
||||
# 0 - disable
|
||||
# 1 - enable
|
||||
# TDLS off-channel operation will be invoked when there is only one
|
||||
# TDLS connection.
|
||||
gEnableTDLSOffChannel=1
|
||||
|
||||
# Tx/Rx Packet threshold for initiating TDLS.
|
||||
# This ini is used to configure the number of Tx/Rx packets during the period of
|
||||
# gTDLSTxStatsPeriod when exceeded, a TDLS Discovery request is triggered.
|
||||
gTDLSTxPacketThreshold=10
|
||||
|
||||
# Number of idle packet.
|
||||
# This ini is used to configure the number of Tx/Rx packet, below which
|
||||
# within last gTDLSTxStatsPeriod period is considered as idle condition.
|
||||
gTDLSIdlePacketThreshold=1
|
||||
|
||||
# VHT Tx/Rx MCS values
|
||||
# Valid values are 0,1,2. If commented out, the default value is 0.
|
||||
# 0=MCS0-7, 1=MCS0-8, 2=MCS0-9
|
||||
gVhtRxMCS=2
|
||||
gVhtTxMCS=2
|
||||
|
||||
# VHT Tx/Rx MCS values for 2x2
|
||||
# Valid values are 0,1,2. If commented out, the default value is 0.
|
||||
# 0=MCS0-7, 1=MCS0-8, 2=MCS0-9
|
||||
gEnable2x2=1
|
||||
gVhtRxMCS2x2=2
|
||||
gVhtTxMCS2x2=2
|
||||
|
||||
#IPA config is a bit mask and following are the configurations.
|
||||
#bit0 IPA Enable
|
||||
#bit1 IPA PRE Filter enable
|
||||
#bit2 IPv6 enable
|
||||
#bit3 IPA Resource Manager (RM) enable
|
||||
#bit4 IPA Clock scaling enable
|
||||
#bit5 IPA uC ENABLE
|
||||
#bit6 IPA uC STA ENABLE
|
||||
#bit8 IPA Real Time Debugging
|
||||
gIPAConfig=0x7d
|
||||
|
||||
# Enable Rx handling options
|
||||
# Rx_thread=1 RPS=2(default for ROME) NAPI=4(default for ihelium)
|
||||
# Rx_thread + NAPI = 5
|
||||
rx_mode=5
|
||||
|
||||
# Enable(Tx) fastpath for data traffic.
|
||||
# 1 - enable(default) 0 - disable
|
||||
gEnableFastPath=1
|
||||
|
||||
# Enable TCP Segmentation Offload
|
||||
# 1 - enable 0 - disable
|
||||
TSOEnable=1
|
||||
|
||||
# Enable Generic Receive Offload
|
||||
# LRO and GRO are exclusive to each other
|
||||
# LRO support is deprecated on latest 4.9(SDM845) kernel
|
||||
# 1 - enable(default) 0 - disable
|
||||
GROEnable=1
|
||||
|
||||
# Enable HT MPDU Density
|
||||
# 4 for 2 micro sec
|
||||
ght_mpdu_density=4
|
||||
|
||||
# Enable flow steering to enable multiple CEs for Rx flows.
|
||||
# Multiple Rx CEs<==>Multiple Rx IRQs<==>probably different CPUs.
|
||||
# Parallel Rx paths.
|
||||
# 1 - enable 0 - disable(default)
|
||||
gEnableFlowSteering=1
|
||||
|
||||
# Time in microseconds after which a NAPI poll must yield
|
||||
ce_service_max_yield_time=500
|
||||
|
||||
#Maximum number of HTT messages to be processed per NAPI poll
|
||||
ce_service_max_rx_ind_flush=1
|
||||
|
||||
# Maximum number of MSDUs the firmware will pack in one HTT_T2H_MSG_TYPE_RX_IN_ORD_PADDR_IND
|
||||
maxMSDUsPerRxInd=8
|
||||
################ Datapath feature set End ################
|
||||
|
||||
################ NAN feature set start ###################
|
||||
|
||||
# Enable NAN discovery (NAN 1.0)
|
||||
# 1 - enable 0 - disable(default)
|
||||
gEnableNanSupport=1
|
||||
################ NAN feature set end #####################
|
||||
|
||||
hostscan_adaptive_dwell_mode=1
|
||||
|
||||
# Create another interface during driver load
|
||||
gEnableConcurrentSTA=wlan1
|
||||
|
||||
#Enable/Disable dual MAC feature
|
||||
# 0 - enable DBS
|
||||
# 1 - disable DBS
|
||||
# 2 - disable DBS for connection but keep DBS for scan
|
||||
# 3 - disable DBS for connection but keep DBS scan with async
|
||||
# scan policy disabled
|
||||
# 4 - enable DBS for connection as well as for scan with async
|
||||
# scan policy disabled
|
||||
# 5 - enable DBS for connection but disable dbs for scan.
|
||||
# 6 - enable DBS for connection but disable simultaneous scan from
|
||||
# upper layer (DBS scan remains enabled in FW).
|
||||
gDualMacFeatureDisable=6
|
||||
|
||||
#Enable/Disable latency mode
|
||||
# 0 disable
|
||||
# 1 enable
|
||||
wlm_latency_enable=1
|
||||
|
||||
# Enable/Disable NUD Tracking within driver
|
||||
gEnableNUDTracking=0
|
||||
|
||||
# Configure hardware filter for DTIM mode
|
||||
# The hardware filter is only effective in DTIM mode.
|
||||
# Use this configuration to blanket drop broadcast/multicast packets at the hardware level
|
||||
# without waking up the firmware
|
||||
#
|
||||
# Takes a bitmap of frame types to drop
|
||||
#
|
||||
# 0 = disable feature
|
||||
# 1 = drop all broadcast frames, except ARP (default)
|
||||
# 2 = drop all multicast frames, except ICMPv6
|
||||
# 3 = drop all broadcast and multicast frames, except ARP and ICMPv6
|
||||
gHwFilterMode=0
|
||||
|
||||
# Enables SNR Monitoring
|
||||
# This ini is used to set default snr monitor
|
||||
gEnableSNRMonitoring=1
|
||||
|
||||
# Control to enable TCP limit output byte
|
||||
# This ini is used to enable dynamic configuration of TCP limit output bytes
|
||||
# tcp_limit_output_bytes param.
|
||||
# Enabling this will let driver post message to cnss-daemon,
|
||||
# accordingly cnss-daemon will modify the tcp_limit_output_bytes.
|
||||
gTcpLimitOutputEnable=0
|
||||
|
||||
# Enable Target Wake Time support.
|
||||
# This ini is used to enable or disable TWT support.
|
||||
enable_twt=0
|
||||
|
||||
# For NLO/PNO, enable MAWC based scan
|
||||
# Enable/Disable the Motion Aided Wireless Connectivity based NLO using this parameter
|
||||
mawc_nlo_enabled=0
|
||||
|
||||
# Force 1x1 when connecting to certain peer
|
||||
# This INI when enabled will force 1x1 connection with certain peer.
|
||||
gForce1x1Exception=0
|
||||
|
||||
# Enable/disable oce feature for STA
|
||||
# This ini is used to enable/disable oce feature for STA
|
||||
oce_sta_enable=0
|
||||
|
||||
# Enable/disable oce feature for SAP
|
||||
# This ini is used to enable/disable oce feature for SAP
|
||||
oce_sap_enable=0
|
||||
|
||||
# Set probe request rate
|
||||
# This ini is used to set probe request rate to 5.5Mbps as per OCE requirement in 2.4G band
|
||||
oce_enable_probe_req_rate=0
|
||||
|
||||
# HE caps Weightage to calculate best candidate
|
||||
# This ini is used to increase/decrease HE caps weightage in best candidate selection.
|
||||
# If AP supports HE caps, AP will get additional weightage with this param.
|
||||
# Weightage will be given only if dot11mode is HE capable.
|
||||
he_caps_weightage=0
|
||||
|
||||
# PCL Weightage to calculate best candidate
|
||||
# This ini is used to increase/decrease PCL weightage in best candidate selection.
|
||||
# If some APs are in PCL list, those AP will get addition weightage.
|
||||
pcl_weightage=0
|
||||
|
||||
# Enable/disable esp feature
|
||||
# This ini is used to enable/disable ESP(Estimated service parameters) IE parsing and decides
|
||||
# whether firmware will include this in its scoring algo.
|
||||
enable_esp_for_roam=0
|
||||
|
||||
# Bitmask to enable 11k offload to FW.
|
||||
# This ini is used to set which of the 11k features is offloaded to FW
|
||||
# Currently Neighbor Report Request is supported for offload and is enabled by default.
|
||||
# B0: Offload 11k neighbor report requests
|
||||
# B1-B31: Reserved
|
||||
11k_offload_enable_bitmask=0
|
||||
|
||||
# Set channel selection logic for different concurrency combinations to DBS or inter band MCC.
|
||||
# Default is DBS for STA+STA and STA+P2P.
|
||||
# 0 - inter-band MCC
|
||||
# 1 - DBS
|
||||
#
|
||||
# BIT 0: STA+STA
|
||||
# BIT 1: STA+P2P
|
||||
# BIT 2-31: Reserved
|
||||
channel_select_logic_conc=0
|
||||
|
||||
# Configure BTM
|
||||
# Bit 0: Enable/Disable the BTM offload. Set this to 1 will enable and 0 will disable BTM offload.
|
||||
# BIT 2, 1: Action on non matching candidate with cache. If a BTM request is received from AP
|
||||
# then the candidate AP's may/may-not be present in the firmware scan cache.
|
||||
# Based on below config firmware will decide whether to forward BTM frame to host or
|
||||
# consume with firmware and proceed with Roaming to candidate AP.
|
||||
#
|
||||
# 00 scan and consume
|
||||
# 01 no scan and forward to host
|
||||
# 10, 11 reserved
|
||||
# BIT 5, 4, 3: Roaming handoff decisions on multiple candidates match
|
||||
# 000 match if exact BSSIDs are found
|
||||
# 001 match if at least one top priority BSSID only
|
||||
# 010, 011, 100, 101, 110, 111 reserved
|
||||
# BIT 6: Set this to 1 will send BTM query frame and 0 not sent.
|
||||
# BIT 7-31: Reserved
|
||||
btm_offload_config=0
|
||||
|
||||
#Timer waiting for interface up from the upper layer
|
||||
gInterfaceChangeWait=1000
|
||||
|
||||
END
|
||||
|
||||
# Note: Configuration parser would not read anything past the END marker
|
||||
|
||||
47
aosp_redfin.mk
Normal file
47
aosp_redfin.mk
Normal file
@@ -0,0 +1,47 @@
|
||||
#
|
||||
# Copyright 2018 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
# Inherit from the common Open Source product configuration
|
||||
$(call inherit-product, $(SRC_TARGET_DIR)/product/core_64_bit.mk)
|
||||
$(call inherit-product, $(SRC_TARGET_DIR)/product/mainline.mk)
|
||||
|
||||
$(call inherit-product, device/google/redfin/device-redfin.mk)
|
||||
$(call inherit-product-if-exists, vendor/google_devices/redfin/proprietary/device-vendor.mk)
|
||||
$(call inherit-product-if-exists, vendor/google_devices/redfin/prebuilts/device-vendor-redfin.mk)
|
||||
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.config.ringtone=Ring_Synth_04.ogg \
|
||||
ro.com.android.dataroaming=true \
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
PhotoTable \
|
||||
WallpaperPicker \
|
||||
WAPPushManager \
|
||||
|
||||
# Don't build super.img.
|
||||
PRODUCT_BUILD_SUPER_PARTITION := false
|
||||
|
||||
# b/113232673 STOPSHIP deal with Qualcomm stuff later
|
||||
# PRODUCT_RESTRICT_VENDOR_FILES := all
|
||||
|
||||
PRODUCT_MANUFACTURER := Google
|
||||
PRODUCT_BRAND := Android
|
||||
PRODUCT_NAME := aosp_redfin
|
||||
PRODUCT_DEVICE := redfin
|
||||
PRODUCT_MODEL := AOSP on redfin
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
device/sample/etc/apns-full-conf.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/apns-conf.xml
|
||||
1
board-info.txt
Normal file
1
board-info.txt
Normal file
@@ -0,0 +1 @@
|
||||
require board=redfin
|
||||
58
compatibility_matrix.xml
Normal file
58
compatibility_matrix.xml
Normal file
@@ -0,0 +1,58 @@
|
||||
<compatibility-matrix version="1.0" type="device">
|
||||
<hal format="hidl" optional="false">
|
||||
<name>android.frameworks.schedulerservice</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>ISchedulingPolicyService</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="false">
|
||||
<name>android.frameworks.sensorservice</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>ISensorManager</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="false">
|
||||
<name>android.hidl.allocator</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IAllocator</name>
|
||||
<instance>ashmem</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="false">
|
||||
<name>android.hidl.manager</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IServiceManager</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="false">
|
||||
<name>android.hidl.memory</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IMapper</name>
|
||||
<instance>ashmem</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="false">
|
||||
<name>android.hidl.token</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>ITokenManager</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="false">
|
||||
<name>android.system.wifi.keystore</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IKeystore</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
</compatibility-matrix>
|
||||
91
config.fs
Normal file
91
config.fs
Normal file
@@ -0,0 +1,91 @@
|
||||
# Copyright (C) 2018 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
# This file is used to define the properties of the filesystem
|
||||
# images generated by build tools (mkbootfs and mkyaffs2image) and
|
||||
# by the device side of adb.
|
||||
|
||||
[AID_VENDOR_QDSS]
|
||||
value:2902
|
||||
|
||||
[AID_VENDOR_RFS]
|
||||
value:2903
|
||||
|
||||
[AID_VENDOR_RFS_SHARED]
|
||||
value:2904
|
||||
|
||||
[AID_VENDOR_ADPL_ODL]
|
||||
value:2905
|
||||
|
||||
[AID_VENDOR_QRTR]
|
||||
value:2906
|
||||
|
||||
[AID_VENDOR_AIRBRUSH]
|
||||
value:2907
|
||||
|
||||
[vendor/bin/pm-service]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: NET_BIND_SERVICE
|
||||
|
||||
[vendor/bin/cnss-daemon]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: NET_BIND_SERVICE
|
||||
|
||||
[vendor/bin/imsdatadaemon]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: NET_BIND_SERVICE
|
||||
|
||||
[vendor/bin/imsrcsd]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_RADIO
|
||||
caps: NET_BIND_SERVICE BLOCK_SUSPEND WAKE_ALARM
|
||||
|
||||
[vendor/bin/cnd]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: NET_BIND_SERVICE BLOCK_SUSPEND NET_ADMIN
|
||||
|
||||
[vendor/bin/ims_rtp_daemon]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_RADIO
|
||||
caps: NET_BIND_SERVICE
|
||||
|
||||
[vendor/bin/hw/android.hardware.health@2.0-service.redfin]
|
||||
mode: 0755
|
||||
user: AID_SYSTEM
|
||||
group: AID_SYSTEM
|
||||
caps: WAKE_ALARM
|
||||
|
||||
[vendor/bin/loc_launcher]
|
||||
mode: 0755
|
||||
user: AID_GPS
|
||||
group: AID_GPS
|
||||
caps: SETUID SETGID
|
||||
|
||||
[system/vendor/bin/loc_launcher]
|
||||
mode: 0755
|
||||
user: AID_GPS
|
||||
group: AID_GPS
|
||||
caps: SETUID SETGID
|
||||
|
||||
58
default-permissions.xml
Normal file
58
default-permissions.xml
Normal file
@@ -0,0 +1,58 @@
|
||||
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
|
||||
|
||||
<!-- Copyright (C) 2019 Google Inc.
|
||||
|
||||
Licensed under the Apache License, Version 2.0 (the "License");
|
||||
you may not use this file except in compliance with the License.
|
||||
You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
<!--
|
||||
This file contains permissions to be granted by default. Default
|
||||
permissions are granted to special platform components and to apps
|
||||
that are approved to get default grants. The special components
|
||||
are apps that are expected tto work out-of-the-box as they provide
|
||||
core use cases such as default dialer, default email, etc. These
|
||||
grants are managed by the platform. The apps that are additionally
|
||||
approved for default grants are ones that provide carrier specific
|
||||
functionality, ones legally required at some location, ones providing
|
||||
alternative disclosure and opt-out UI, ones providing highlight features
|
||||
of a dedicated device, etc. This file contains only the latter exceptions.
|
||||
Fixed permissions cannot be controlled by the user and need a special
|
||||
approval. Typically these are to ensure either legally mandated functions
|
||||
or the app is considered a part of the OS.
|
||||
-->
|
||||
|
||||
<exceptions>
|
||||
|
||||
<!-- This is an example of an exception:
|
||||
<exception
|
||||
package="foo.bar.permission"
|
||||
<permission name="android.permission.READ_CONTACTS" fixed="true"/>
|
||||
<permission name="android.permission.READ_CALENDAR" fixed="false"/>
|
||||
</exception>
|
||||
-->
|
||||
|
||||
<exception
|
||||
package="com.google.intelligence.sense">
|
||||
<!-- Record Audio -->
|
||||
<permission name="android.permission.RECORD_AUDIO" fixed="false"/>
|
||||
</exception>
|
||||
|
||||
<exception package="com.google.android.settings.intelligence">
|
||||
<!-- Calendar -->
|
||||
<permission name="android.permission.READ_CALENDAR" fixed="true"/>
|
||||
<!-- Location -->
|
||||
<permission name="android.permission.ACCESS_FINE_LOCATION" fixed="true"/>
|
||||
<permission name="android.permission.ACCESS_BACKGROUND_LOCATION" fixed="true"/>
|
||||
</exception>
|
||||
|
||||
</exceptions>
|
||||
66
device-common.mk
Normal file
66
device-common.mk
Normal file
@@ -0,0 +1,66 @@
|
||||
#
|
||||
# Copyright (C) 2018 The Android Open-Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
# define hardware platform
|
||||
PRODUCT_PLATFORM := sm7250
|
||||
|
||||
include device/google/redfin/device.mk
|
||||
|
||||
# Set Vendor SPL to match platform
|
||||
VENDOR_SECURITY_PATCH = $(PLATFORM_SECURITY_PATCH)
|
||||
|
||||
# A2DP offload enabled for compilation
|
||||
AUDIO_FEATURE_ENABLED_A2DP_OFFLOAD := true
|
||||
|
||||
# A2DP offload supported
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.bluetooth.a2dp_offload.supported=true
|
||||
|
||||
# A2DP offload disabled (UI toggle property)
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.bluetooth.a2dp_offload.disabled=false
|
||||
|
||||
# A2DP offload DSP supported encoder list
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.bluetooth.a2dp_offload.cap=sbc-aac-aptx-aptxhd-ldac
|
||||
|
||||
# Enable AAC frame ctl for A2DP sinks
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.vendor.bt.aac_frm_ctl.enabled=true
|
||||
|
||||
# Set lmkd options
|
||||
PRODUCT_PRODUCT_PROPERTIES += \
|
||||
ro.config.low_ram = false \
|
||||
ro.lmk.kill_heaviest_task = true \
|
||||
ro.lmk.kill_timeout_ms = 100 \
|
||||
ro.lmk.use_minfree_levels = true \
|
||||
ro.lmk.log_stats = true \
|
||||
|
||||
# Modem logging file
|
||||
PRODUCT_COPY_FILES += \
|
||||
device/google/redfin/init.logging.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).logging.rc
|
||||
|
||||
# Pixelstats broken mic detection
|
||||
PRODUCT_PROPERTY_OVERRIDES += vendor.audio.mic_break=true
|
||||
|
||||
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.use_color_management=true
|
||||
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.has_wide_color_display=true
|
||||
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.has_HDR_display=true
|
||||
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += ro.surface_flinger.set_idle_timer_ms=50
|
||||
|
||||
# MIDI feature
|
||||
PRODUCT_COPY_FILES += \
|
||||
frameworks/native/data/etc/android.software.midi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.midi.xml
|
||||
23
device-redfin.mk
Normal file
23
device-redfin.mk
Normal file
@@ -0,0 +1,23 @@
|
||||
#
|
||||
# Copyright 2016 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
PRODUCT_HARDWARE := redfin
|
||||
|
||||
include device/google/redfin/device-common.mk
|
||||
|
||||
DEVICE_PACKAGE_OVERLAYS += device/google/redfin/redfin/overlay
|
||||
|
||||
# Audio XMLs for redfin
|
||||
784
device.mk
Normal file
784
device.mk
Normal file
@@ -0,0 +1,784 @@
|
||||
#
|
||||
# Copyright (C) 2018 The Android Open-Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
LOCAL_PATH := device/google/redfin
|
||||
|
||||
PRODUCT_VENDOR_MOVE_ENABLED := true
|
||||
|
||||
PRODUCT_SOONG_NAMESPACES += \
|
||||
hardware/google/av \
|
||||
hardware/google/interfaces \
|
||||
hardware/google/pixel \
|
||||
device/google/redfin \
|
||||
hardware/qcom/sm7250 \
|
||||
vendor/google/airbrush/floral \
|
||||
vendor/google/biometrics/face \
|
||||
vendor/google/darwinn \
|
||||
hardware/qcom/sm7250/display \
|
||||
vendor/google/camera \
|
||||
vendor/qcom/sm7250 \
|
||||
vendor/google/interfaces
|
||||
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
keyguard.no_require_sim=true
|
||||
|
||||
# enable cal by default on accel sensor
|
||||
PRODUCT_PRODUCT_PROPERTIES += \
|
||||
persist.vendor.debug.sensors.accel_cal=1
|
||||
|
||||
# The default value of this variable is false and should only be set to true when
|
||||
# the device allows users to retain eSIM profiles after factory reset of user data.
|
||||
PRODUCT_PRODUCT_PROPERTIES += \
|
||||
masterclear.allow_retain_esim_profiles_after_fdr=true
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
device/google/redfin/default-permissions.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/default-permissions/default-permissions.xml \
|
||||
frameworks/native/data/etc/handheld_core_hardware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/handheld_core_hardware.xml \
|
||||
frameworks/native/data/etc/android.software.verified_boot.xml:$(TARGET_COPY_OUT_PRODUCT)/etc/permissions/android.software.verified_boot.xml
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
messaging
|
||||
|
||||
TARGET_PRODUCT_PROP := $(LOCAL_PATH)/product.prop
|
||||
|
||||
$(call inherit-product, $(LOCAL_PATH)/utils.mk)
|
||||
|
||||
# Installs gsi keys into ramdisk, to boot a GSI with verified boot.
|
||||
$(call inherit-product, $(SRC_TARGET_DIR)/product/gsi_keys.mk)
|
||||
|
||||
ifeq ($(wildcard vendor/google_devices/redfin/proprietary/device-vendor-redfin.mk),)
|
||||
BUILD_WITHOUT_VENDOR := true
|
||||
endif
|
||||
|
||||
ifeq ($(TARGET_PREBUILT_KERNEL),)
|
||||
LOCAL_KERNEL := device/google/redfin-kernel/Image.lz4
|
||||
else
|
||||
LOCAL_KERNEL := $(TARGET_PREBUILT_KERNEL)
|
||||
endif
|
||||
PRODUCT_VENDOR_KERNEL_HEADERS := device/google/redfin-kernel/sm7250/kernel-headers
|
||||
|
||||
|
||||
PRODUCT_CHARACTERISTICS := nosdcard
|
||||
PRODUCT_SHIPPING_API_LEVEL := 28
|
||||
|
||||
DEVICE_PACKAGE_OVERLAYS += $(LOCAL_PATH)/overlay
|
||||
|
||||
#
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_KERNEL):kernel \
|
||||
$(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_RECOVERY)/root/first_stage_ramdisk/fstab.$(PRODUCT_PLATFORM) \
|
||||
$(LOCAL_PATH)/fstab.hardware:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.$(PRODUCT_PLATFORM) \
|
||||
$(LOCAL_PATH)/fstab.persist:$(TARGET_COPY_OUT_VENDOR)/etc/fstab.persist \
|
||||
$(LOCAL_PATH)/init.hardware.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).rc \
|
||||
$(LOCAL_PATH)/init.power.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).power.rc \
|
||||
$(LOCAL_PATH)/init.radio.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.radio.sh \
|
||||
$(LOCAL_PATH)/init.hardware.usb.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).usb.rc \
|
||||
$(LOCAL_PATH)/init.insmod.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.insmod.sh \
|
||||
$(LOCAL_PATH)/init.qcom.wlan.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.qcom.wlan.sh \
|
||||
$(LOCAL_PATH)/init.sensors.sh:$(TARGET_COPY_OUT_VENDOR)/bin/init.sensors.sh \
|
||||
$(LOCAL_PATH)/sensors.hals.conf:$(TARGET_COPY_OUT_VENDOR)/etc/sensors/hals.conf \
|
||||
$(LOCAL_PATH)/thermal-engine-$(PRODUCT_HARDWARE).conf:$(TARGET_COPY_OUT_VENDOR)/etc/thermal-engine-$(PRODUCT_HARDWARE).conf \
|
||||
$(LOCAL_PATH)/ueventd.rc:$(TARGET_COPY_OUT_VENDOR)/ueventd.rc
|
||||
|
||||
|
||||
MSM_VIDC_TARGET_LIST := lito # Get the color format from kernel headers
|
||||
MASTER_SIDE_CP_TARGET_LIST := lito # ION specific settings
|
||||
|
||||
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/init.hardware.mpssrfs.rc.userdebug:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).mpssrfs.rc
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/init.hardware.diag.rc.userdebug:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).diag.rc
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/init.hardware.chamber.rc.userdebug:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.$(PRODUCT_PLATFORM).chamber.rc
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/init.hardware.ipa.rc.userdebug:$(TARGET_COPY_OUT_VENDOR)/etc/init/init.$(PRODUCT_PLATFORM).ipa.rc
|
||||
else
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/init.hardware.mpssrfs.rc.user:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).mpssrfs.rc
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/init.hardware.diag.rc.user:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.$(PRODUCT_PLATFORM).diag.rc
|
||||
endif
|
||||
|
||||
# A/B support
|
||||
PRODUCT_PACKAGES += \
|
||||
otapreopt_script \
|
||||
cppreopts.sh \
|
||||
update_engine \
|
||||
update_verifier
|
||||
|
||||
# Use Sdcardfs
|
||||
PRODUCT_PRODUCT_PROPERTIES += \
|
||||
ro.sys.sdcardfs=1
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
bootctrl.lito
|
||||
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.cp_system_other_odex=1
|
||||
|
||||
AB_OTA_POSTINSTALL_CONFIG += \
|
||||
RUN_POSTINSTALL_system=true \
|
||||
POSTINSTALL_PATH_system=system/bin/otapreopt_script \
|
||||
FILESYSTEM_TYPE_system=ext4 \
|
||||
POSTINSTALL_OPTIONAL_system=true
|
||||
|
||||
# Enable update engine sideloading by including the static version of the
|
||||
# boot_control HAL and its dependencies.
|
||||
PRODUCT_STATIC_BOOT_CONTROL_HAL := \
|
||||
bootctrl.lito \
|
||||
libgptutils \
|
||||
libz \
|
||||
libcutils
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
update_engine_sideload \
|
||||
sg_write_buffer \
|
||||
f2fs_io \
|
||||
check_f2fs
|
||||
|
||||
AB_OTA_POSTINSTALL_CONFIG += \
|
||||
RUN_POSTINSTALL_vendor=true \
|
||||
POSTINSTALL_PATH_vendor=bin/checkpoint_gc \
|
||||
FILESYSTEM_TYPE_vendor=ext4 \
|
||||
POSTINSTALL_OPTIONAL_vendor=true
|
||||
|
||||
# Userdata Checkpointing OTA GC
|
||||
PRODUCT_PACKAGES += \
|
||||
checkpoint_gc
|
||||
|
||||
# The following modules are included in debuggable builds only.
|
||||
PRODUCT_PACKAGES_DEBUG += \
|
||||
bootctl \
|
||||
r.vendor \
|
||||
update_engine_client
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
frameworks/native/data/etc/android.hardware.camera.flash-autofocus.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.flash-autofocus.xml \
|
||||
frameworks/native/data/etc/android.hardware.camera.front.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.front.xml \
|
||||
frameworks/native/data/etc/android.hardware.camera.full.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.full.xml\
|
||||
frameworks/native/data/etc/android.hardware.camera.raw.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.camera.raw.xml\
|
||||
frameworks/native/data/etc/android.hardware.bluetooth.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth.xml \
|
||||
frameworks/native/data/etc/android.hardware.bluetooth_le.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.bluetooth_le.xml \
|
||||
frameworks/native/data/etc/android.hardware.biometrics.face.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.biometrics.face.xml\
|
||||
frameworks/native/data/etc/android.hardware.sensor.accelerometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.accelerometer.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.assist.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.assist.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.compass.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.compass.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.gyroscope.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.gyroscope.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.light.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.light.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.proximity.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.proximity.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.barometer.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.barometer.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.stepcounter.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepcounter.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.stepdetector.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.stepdetector.xml \
|
||||
frameworks/native/data/etc/android.hardware.sensor.hifi_sensors.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.sensor.hifi_sensors.xml \
|
||||
frameworks/native/data/etc/android.hardware.location.gps.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.location.gps.xml \
|
||||
frameworks/native/data/etc/android.hardware.telephony.gsm.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.gsm.xml \
|
||||
frameworks/native/data/etc/android.hardware.telephony.cdma.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.cdma.xml \
|
||||
frameworks/native/data/etc/android.hardware.telephony.ims.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.ims.xml \
|
||||
frameworks/native/data/etc/android.hardware.touchscreen.multitouch.jazzhand.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.touchscreen.multitouch.jazzhand.xml \
|
||||
frameworks/native/data/etc/android.hardware.wifi.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.xml \
|
||||
frameworks/native/data/etc/android.hardware.wifi.direct.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.direct.xml \
|
||||
frameworks/native/data/etc/android.hardware.wifi.aware.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.aware.xml \
|
||||
frameworks/native/data/etc/android.hardware.wifi.passpoint.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.passpoint.xml \
|
||||
frameworks/native/data/etc/android.hardware.wifi.rtt.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.wifi.rtt.xml \
|
||||
frameworks/native/data/etc/android.software.sip.voip.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.sip.voip.xml \
|
||||
frameworks/native/data/etc/android.hardware.usb.accessory.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.accessory.xml \
|
||||
frameworks/native/data/etc/android.hardware.usb.host.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.usb.host.xml \
|
||||
frameworks/native/data/etc/android.hardware.opengles.aep.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.opengles.aep.xml \
|
||||
frameworks/native/data/etc/android.hardware.nfc.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.xml \
|
||||
frameworks/native/data/etc/android.hardware.nfc.hce.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.hce.xml \
|
||||
frameworks/native/data/etc/android.hardware.nfc.hcef.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.hcef.xml \
|
||||
frameworks/native/data/etc/android.hardware.vulkan.level-1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.level.xml \
|
||||
frameworks/native/data/etc/android.hardware.vulkan.compute-0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.compute.xml \
|
||||
frameworks/native/data/etc/android.hardware.vulkan.version-1_1.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.vulkan.version.xml \
|
||||
frameworks/native/data/etc/android.hardware.telephony.carrierlock.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.telephony.carrierlock.xml \
|
||||
frameworks/native/data/etc/android.hardware.strongbox_keystore.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.strongbox_keystore.xml \
|
||||
frameworks/native/data/etc/android.hardware.nfc.uicc.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.uicc.xml \
|
||||
frameworks/native/data/etc/android.hardware.nfc.ese.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.hardware.nfc.ese.xml
|
||||
|
||||
# Audio fluence, ns, aec property, voice and media volume steps
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.qc.sdk.audio.fluencetype=fluencepro \
|
||||
persist.audio.fluence.voicecall=true \
|
||||
persist.audio.fluence.speaker=true \
|
||||
persist.audio.fluence.voicecomm=true \
|
||||
persist.audio.fluence.voicerec=false \
|
||||
ro.config.vc_call_vol_steps=7 \
|
||||
ro.config.media_vol_steps=25 \
|
||||
|
||||
# Audio Features
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
vendor.audio.feature.external_dsp.enable=true \
|
||||
vendor.audio.feature.external_speaker.enable=true \
|
||||
vendor.audio.feature.concurrent_capture.enable=false \
|
||||
vendor.audio.feature.a2dp_offload.enable=true \
|
||||
vendor.audio.feature.hfp.enable=true \
|
||||
vendor.audio.feature.hwdep_cal.enable=true \
|
||||
vendor.audio.feature.incall_music.enable=true \
|
||||
vendor.audio.feature.maxx_audio.enable=true \
|
||||
vendor.audio.feature.spkr_prot.enable=true \
|
||||
vendor.audio.feature.usb_offload.enable=true \
|
||||
vendor.audio.feature.audiozoom.enable=true \
|
||||
vendor.audio.feature.snd_mon.enable=true \
|
||||
|
||||
# MaxxAudio effect and add rotation monitor
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.audio.monitorRotation=true
|
||||
|
||||
# Iaxxx streming and factory binary
|
||||
PRODUCT_PACKAGES += \
|
||||
libtunnel \
|
||||
libodsp \
|
||||
adnc_strm.primary.default \
|
||||
sound_trigger.primary.lito
|
||||
|
||||
# Add Oslo test for debug rom
|
||||
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
|
||||
PRODUCT_PACKAGES += \
|
||||
tunneling_hal_test \
|
||||
sensor_param_test \
|
||||
oslo_config_test \
|
||||
odsp_api_test \
|
||||
crash_event_logger \
|
||||
dump_debug_info \
|
||||
get_pwr_stats \
|
||||
crash_trigger_test
|
||||
endif
|
||||
|
||||
# graphics
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.opengles.version=196610
|
||||
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.vendor.display.foss=1 \
|
||||
ro.vendor.display.paneltype=2 \
|
||||
ro.vendor.display.sensortype=2 \
|
||||
vendor.display.foss.config=1 \
|
||||
vendor.display.foss.config_path=/vendor/etc/FOSSConfig.xml
|
||||
|
||||
# camera google face detection
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.camera.googfd.enable=1
|
||||
|
||||
# camera disable FaceSSD temporarily
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.camera.facessd.enable=0
|
||||
|
||||
# camera hal buffer management
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.camera.managebuffer.enable=1
|
||||
|
||||
# Lets the vendor library that Google Camera HWL is enabled
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.camera.google_hwl.enabled=true \
|
||||
persist.camera.google_hwl.name=libgooglecamerahwl_impl.so
|
||||
|
||||
# OEM Unlock reporting
|
||||
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
|
||||
ro.oem_unlock_supported=1
|
||||
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.vendor.cne.feature=1 \
|
||||
persist.vendor.data.iwlan.enable=true \
|
||||
persist.radio.RATE_ADAPT_ENABLE=1 \
|
||||
persist.radio.ROTATION_ENABLE=1 \
|
||||
persist.radio.VT_ENABLE=1 \
|
||||
persist.radio.VT_HYBRID_ENABLE=1 \
|
||||
persist.vendor.radio.apm_sim_not_pwdn=1 \
|
||||
persist.vendor.radio.custom_ecc=1 \
|
||||
persist.vendor.radio.data_ltd_sys_ind=1 \
|
||||
persist.radio.videopause.mode=1 \
|
||||
persist.vendor.radio.multisim_switch_support=true \
|
||||
persist.vendor.radio.sib16_support=1 \
|
||||
persist.vendor.radio.data_con_rprt=true \
|
||||
persist.vendor.radio.relay_oprt_change=1 \
|
||||
persist.vendor.radio.no_wait_for_card=1 \
|
||||
persist.vendor.radio.sap_silent_pin=1 \
|
||||
persist.rcs.supported=1 \
|
||||
vendor.rild.libpath=/vendor/lib64/libril-qc-hal-qmi.so \
|
||||
ro.hardware.keystore_desede=true \
|
||||
|
||||
# Disable snapshot timer
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.vendor.radio.snapshot_enabled=0 \
|
||||
persist.vendor.radio.snapshot_timer=0
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
hwcomposer.lito \
|
||||
android.hardware.graphics.composer@2.3-service-sm7250 \
|
||||
gralloc.lito \
|
||||
android.hardware.graphics.mapper@3.0-impl-qti-display \
|
||||
vendor.qti.hardware.display.allocator-service
|
||||
|
||||
# RenderScript HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.renderscript@1.0-impl
|
||||
|
||||
# Light HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
lights.lito \
|
||||
hardware.google.light@1.0-service
|
||||
|
||||
# Memtrack HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
memtrack.lito \
|
||||
android.hardware.memtrack@1.0-impl \
|
||||
android.hardware.memtrack@1.0-service
|
||||
|
||||
# Bluetooth HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.bluetooth@1.0-impl-qti \
|
||||
android.hardware.bluetooth@1.0-service-qti
|
||||
|
||||
#Bluetooth SAR HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
vendor.qti.hardware.bluetooth_sar@1.0-impl
|
||||
|
||||
# Bluetooth SoC
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
vendor.qcom.bluetooth.soc=cherokee
|
||||
|
||||
# Property for loading BDA from device tree
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.vendor.bt.bdaddr_path=/proc/device-tree/chosen/cdt/cdb2/bt_addr
|
||||
|
||||
# Bluetooth WiPower
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.vendor.bluetooth.emb_wp_mode=false \
|
||||
ro.vendor.bluetooth.wipower=false
|
||||
|
||||
# DRM HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.drm@1.0-impl \
|
||||
android.hardware.drm@1.0-service \
|
||||
android.hardware.drm@1.2-service.clearkey \
|
||||
android.hardware.drm@1.2-service.widevine
|
||||
|
||||
# NFC and Secure Element packages
|
||||
PRODUCT_PACKAGES += \
|
||||
NfcNci \
|
||||
Tag \
|
||||
SecureElement \
|
||||
android.hardware.nfc@1.2-service.st \
|
||||
android.hardware.secure_element@1.0-service.st
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
device/google/redfin/nfc/libnfc-hal-st.conf:$(TARGET_COPY_OUT_VENDOR)/etc/libnfc-hal-st.conf \
|
||||
device/google/redfin/nfc/libese-hal-st.conf:$(TARGET_COPY_OUT_VENDOR)/etc/libese-hal-st.conf \
|
||||
device/google/redfin/nfc/libnfc-nci.conf:$(TARGET_COPY_OUT_PRODUCT)/etc/libnfc-nci.conf
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.usb@1.2-service.redfin
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.health@2.0-service.redfin
|
||||
|
||||
# Storage health HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.health.storage@1.0-service
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
libmm-omxcore \
|
||||
libOmxCore \
|
||||
libstagefrighthw \
|
||||
libOmxVdec \
|
||||
libOmxVdecHevc \
|
||||
libOmxVenc \
|
||||
libc2dcolorconvert
|
||||
|
||||
# Enable Codec 2.0
|
||||
PRODUCT_PACKAGES += \
|
||||
libqcodec2 \
|
||||
vendor.qti.media.c2@1.0-service \
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.camera.provider@2.4-impl-google \
|
||||
android.hardware.camera.provider@2.4-service-google \
|
||||
camera.lito \
|
||||
libgooglecamerahal \
|
||||
libgooglecamerahwl_impl \
|
||||
libgoogle_camera_hal_tests \
|
||||
libqomx_core \
|
||||
libmmjpeg_interface \
|
||||
libmmcamera_interface \
|
||||
libcameradepthcalibrator
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
sensors.$(PRODUCT_HARDWARE) \
|
||||
android.hardware.sensors@2.0-impl \
|
||||
android.hardware.sensors@2.0-service \
|
||||
android.hardware.sensors@2.0-service.rc
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
fs_config_dirs \
|
||||
fs_config_files
|
||||
|
||||
# Context hub HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.contexthub@1.0-impl.generic \
|
||||
android.hardware.contexthub@1.0-service
|
||||
|
||||
# Boot control HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.boot@1.0-impl \
|
||||
android.hardware.boot@1.0-service \
|
||||
|
||||
# Vibrator HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.vibrator@1.3-service.redfin \
|
||||
|
||||
# Thermal HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.thermal@2.0-service.pixel \
|
||||
|
||||
# Thermal HAL config
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/thermal_info_config_$(PRODUCT_HARDWARE).json:$(TARGET_COPY_OUT_VENDOR)/etc/thermal_info_config.json \
|
||||
|
||||
#GNSS HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
libgps.utils \
|
||||
libgnss \
|
||||
liblocation_api \
|
||||
android.hardware.gnss@2.0-impl-qti \
|
||||
android.hardware.gnss@2.0-service-qti
|
||||
|
||||
# Wireless Charger HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
vendor.google.wireless_charger@1.0
|
||||
|
||||
ENABLE_VENDOR_RIL_SERVICE := true
|
||||
|
||||
HOSTAPD := hostapd
|
||||
HOSTAPD += hostapd_cli
|
||||
PRODUCT_PACKAGES += $(HOSTAPD)
|
||||
|
||||
WPA := wpa_supplicant.conf
|
||||
WPA += wpa_supplicant_wcn.conf
|
||||
WPA += wpa_supplicant
|
||||
PRODUCT_PACKAGES += $(WPA)
|
||||
|
||||
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
|
||||
PRODUCT_PACKAGES += wpa_cli
|
||||
endif
|
||||
|
||||
# Wifi
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.wifi@1.0-service \
|
||||
wificond \
|
||||
libwpa_client
|
||||
|
||||
# WLAN driver configuration files
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/wpa_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wpa_supplicant_overlay.conf \
|
||||
$(LOCAL_PATH)/p2p_supplicant_overlay.conf:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/p2p_supplicant_overlay.conf \
|
||||
$(LOCAL_PATH)/wifi_concurrency_cfg.txt:$(TARGET_COPY_OUT_VENDOR)/etc/wifi/wifi_concurrency_cfg.txt \
|
||||
$(LOCAL_PATH)/WCNSS_qcom_cfg.ini:$(TARGET_COPY_OUT_VENDOR)/firmware/wlan/qca_cld/WCNSS_qcom_cfg.ini \
|
||||
|
||||
LIB_NL := libnl_2
|
||||
PRODUCT_PACKAGES += $(LIB_NL)
|
||||
|
||||
# Factory OTA
|
||||
PRODUCT_PACKAGES += \
|
||||
FactoryOta
|
||||
|
||||
# Audio effects
|
||||
PRODUCT_PACKAGES += \
|
||||
libvolumelistener \
|
||||
libqcomvisualizer \
|
||||
libqcomvoiceprocessing \
|
||||
libqcomvoiceprocessingdescriptors \
|
||||
libqcompostprocbundle
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
audio.primary.lito \
|
||||
audio.a2dp.default \
|
||||
audio.usb.default \
|
||||
audio.r_submix.default \
|
||||
libaudio-resampler \
|
||||
audio.hearing_aid.default \
|
||||
audio.bluetooth.default
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.audio@5.0-impl:32 \
|
||||
android.hardware.audio.effect@5.0-impl:32 \
|
||||
android.hardware.broadcastradio@1.0-impl \
|
||||
android.hardware.soundtrigger@2.2-impl \
|
||||
android.hardware.bluetooth.audio@2.0-impl \
|
||||
android.hardware.audio@2.0-service
|
||||
|
||||
# Modules for Audio HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
libcirrusspkrprot \
|
||||
libsndmonitor \
|
||||
libmalistener \
|
||||
liba2dpoffload \
|
||||
btaudio_offload_if \
|
||||
libmaxxaudio \
|
||||
libaudiozoom
|
||||
|
||||
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
|
||||
PRODUCT_PACKAGES += \
|
||||
tinyplay \
|
||||
tinycap \
|
||||
tinymix \
|
||||
tinypcminfo \
|
||||
cplay
|
||||
endif
|
||||
|
||||
# Audio hal xmls
|
||||
|
||||
# Audio Policy tables
|
||||
|
||||
# Audio ACDB data
|
||||
|
||||
# Audio ACDB workspace files for QACT
|
||||
|
||||
# Audio speaker tunning config data
|
||||
|
||||
# Audio audiozoom config data
|
||||
|
||||
# and ensure that the xaac decoder is built
|
||||
PRODUCT_PACKAGES += \
|
||||
libstagefright_soft_xaacdec.vendor
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/media_codecs.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs.xml \
|
||||
frameworks/av/media/libstagefright/data/media_codecs_google_audio.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_audio.xml \
|
||||
frameworks/av/media/libstagefright/data/media_codecs_google_telephony.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_telephony.xml \
|
||||
frameworks/av/media/libstagefright/data/media_codecs_google_video.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_codecs_google_video.xml \
|
||||
$(LOCAL_PATH)/media_profiles_V1_0.xml:$(TARGET_COPY_OUT_VENDOR)/etc/media_profiles_V1_0.xml
|
||||
|
||||
# Vendor seccomp policy files for media components:
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/seccomp_policy/mediacodec.policy:$(TARGET_COPY_OUT_VENDOR)/etc/seccomp_policy/mediacodec.policy
|
||||
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
audio.snd_card.open.retries=50
|
||||
|
||||
|
||||
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
|
||||
# Subsystem ramdump
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.vendor.sys.ssr.enable_ramdumps=1
|
||||
endif
|
||||
|
||||
# Subsystem silent restart
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.vendor.sys.ssr.restart_level=modem,SDXPRAIRIE,adsp,slpi
|
||||
|
||||
# setup dalvik vm configs
|
||||
$(call inherit-product, frameworks/native/build/phone-xhdpi-2048-dalvik-heap.mk)
|
||||
|
||||
# Use the default charger mode images
|
||||
PRODUCT_PACKAGES += \
|
||||
charger_res_images
|
||||
|
||||
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
|
||||
# b/36703476: Set default log size to 1M
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.logd.size=1M
|
||||
# b/114766334: persist all logs by default rotating on 30 files of 1MiB
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
logd.logpersistd=logcatd \
|
||||
logd.logpersistd.size=30
|
||||
endif
|
||||
|
||||
# Dumpstate HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.dumpstate@1.0-service.redfin
|
||||
|
||||
# Citadel
|
||||
PRODUCT_PACKAGES += \
|
||||
citadeld \
|
||||
citadel_updater \
|
||||
android.hardware.authsecret@1.0-service.citadel \
|
||||
android.hardware.oemlock@1.0-service.citadel \
|
||||
android.hardware.weaver@1.0-service.citadel \
|
||||
android.hardware.keymaster@4.0-service.citadel \
|
||||
wait_for_strongbox
|
||||
|
||||
# Citadel debug stuff
|
||||
PRODUCT_PACKAGES_DEBUG += \
|
||||
test_citadel
|
||||
|
||||
# Storage: for factory reset protection feature
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.frp.pst=/dev/block/bootdevice/by-name/frp
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
vndk-sp
|
||||
|
||||
PRODUCT_ENFORCE_RRO_TARGETS := *
|
||||
|
||||
# Override heap growth limit due to high display density on device
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
dalvik.vm.heapgrowthlimit=256m
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/hidl/android.hidl.base@1.0.so-32:system/lib/android.hidl.base@1.0.so \
|
||||
$(LOCAL_PATH)/hidl/android.hidl.base@1.0.so-64:system/lib64/android.hidl.base@1.0.so \
|
||||
$(LOCAL_PATH)/hidl/android.hidl.base@1.0.so-32:vendor/lib/android.hidl.base@1.0.so \
|
||||
$(LOCAL_PATH)/hidl/android.hidl.base@1.0.so-64:vendor/lib64/android.hidl.base@1.0.so \
|
||||
|
||||
PRODUCT_PACKAGES += \
|
||||
ipacm \
|
||||
IPACM_cfg.xml
|
||||
|
||||
#Set default CDMA subscription to RUIM
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.telephony.default_cdma_sub=0
|
||||
|
||||
# Set display color mode to Adaptive by default
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.sys.sf.color_saturation=1.0 \
|
||||
persist.sys.sf.native_mode=2 \
|
||||
persist.sys.sf.color_mode=9
|
||||
|
||||
# Keymaster configuration
|
||||
PRODUCT_COPY_FILES += \
|
||||
frameworks/native/data/etc/android.software.device_id_attestation.xml:$(TARGET_COPY_OUT_VENDOR)/etc/permissions/android.software.device_id_attestation.xml
|
||||
|
||||
# Enable modem logging
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.radio.log_loc="/data/vendor/modem_dump" \
|
||||
ro.radio.log_prefix="modem_log_"
|
||||
|
||||
# Enable modem logging for debug
|
||||
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.vendor.sys.modem.diag.mdlog=true \
|
||||
persist.vendor.sys.modem.diag.mdlog_br_num=5
|
||||
else
|
||||
endif
|
||||
|
||||
# Preopt SystemUI
|
||||
PRODUCT_DEXPREOPT_SPEED_APPS += \
|
||||
SystemUIGoogle
|
||||
|
||||
# Enable stats logging in LMKD
|
||||
TARGET_LMKD_STATS_LOG := true
|
||||
PRODUCT_PRODUCT_PROPERTIES += \
|
||||
ro.lmk.log_stats=true
|
||||
|
||||
# default usb oem functions
|
||||
ifneq (,$(filter userdebug eng, $(TARGET_BUILD_VARIANT)))
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
persist.vendor.usb.usbradio.config=diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl_gsi,rmnet_gsi
|
||||
endif
|
||||
|
||||
# Early phase offset configuration for SurfaceFlinger (b/75985430)
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
debug.sf.early_phase_offset_ns=500000
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
debug.sf.early_app_phase_offset_ns=500000
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
debug.sf.early_gl_phase_offset_ns=3000000
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
debug.sf.early_gl_app_phase_offset_ns=15000000
|
||||
|
||||
# Do not skip init trigger by default
|
||||
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
|
||||
vendor.skip.init=0
|
||||
|
||||
BOARD_USES_QCNE := true
|
||||
|
||||
#per device
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/redfin/init.redfin.rc:$(TARGET_COPY_OUT_VENDOR)/etc/init/hw/init.redfin.rc
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/sec_config:$(TARGET_COPY_OUT_VENDOR)/etc/sec_config
|
||||
|
||||
# power HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.power@1.3-service.pixel-libperfmgr
|
||||
|
||||
# Disable ro.adb.secure for the factory build to work around dead touchscreens
|
||||
# Bug: 116250643
|
||||
PRODUCT_PRODUCT_PROPERTIES += \
|
||||
ro.adb.secure=0
|
||||
|
||||
# GPS configuration file
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/gps.conf:$(TARGET_COPY_OUT_VENDOR)/etc/gps.conf
|
||||
|
||||
# default atrace HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.atrace@1.0-service
|
||||
|
||||
# Reliability reporting
|
||||
PRODUCT_PACKAGES += \
|
||||
pixelstats-vendor
|
||||
|
||||
PRODUCT_USE_DYNAMIC_PARTITIONS := true
|
||||
|
||||
# fastbootd
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.fastboot@1.0-impl.pixel \
|
||||
fastbootd
|
||||
|
||||
# insmod files
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/init.insmod.redfin.cfg:$(TARGET_COPY_OUT_VENDOR)/etc/init.insmod.redfin.cfg
|
||||
|
||||
# Use /product/etc/fstab.postinstall to mount system_other
|
||||
PRODUCT_PRODUCT_PROPERTIES += \
|
||||
ro.postinstall.fstab.prefix=/product
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/fstab.postinstall:$(TARGET_COPY_OUT_PRODUCT)/etc/fstab.postinstall
|
||||
|
||||
# powerstats HAL
|
||||
PRODUCT_PACKAGES += \
|
||||
android.hardware.power.stats@1.0-service.pixel
|
||||
|
||||
# Recovery
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/init.recovery.device.rc:recovery/root/init.recovery.redfin.rc
|
||||
|
||||
# Do not skip init trigger by default
|
||||
PRODUCT_DEFAULT_PROPERTY_OVERRIDES += \
|
||||
vendor.skip.init=0
|
||||
|
||||
# Oslo feature flag
|
||||
PRODUCT_PRODUCT_PROPERTIES += \
|
||||
ro.vendor.aware_available=true
|
||||
|
||||
QTI_TELEPHONY_UTILS := qti-telephony-utils
|
||||
QTI_TELEPHONY_UTILS += qti_telephony_utils.xml
|
||||
PRODUCT_PACKAGES += $(QTI_TELEPHONY_UTILS)
|
||||
|
||||
HIDL_WRAPPER := qti-telephony-hidl-wrapper
|
||||
HIDL_WRAPPER += qti_telephony_hidl_wrapper.xml
|
||||
PRODUCT_PACKAGES += $(HIDL_WRAPPER)
|
||||
|
||||
# Increment the SVN for any official public releases
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.vendor.build.svn=1
|
||||
|
||||
# ZRAM writeback
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
ro.zram.mark_idle_delay_mins=60 \
|
||||
ro.zram.first_wb_delay_mins=180 \
|
||||
ro.zram.periodic_wb_delay_hours=24
|
||||
|
||||
# Disable SPU usage
|
||||
PRODUCT_PROPERTY_OVERRIDES += \
|
||||
vendor.gatekeeper.disable_spu = true
|
||||
|
||||
PRODUCT_COPY_FILES += \
|
||||
$(LOCAL_PATH)/powerhint.json:$(TARGET_COPY_OUT_VENDOR)/etc/powerhint.json
|
||||
241
device_framework_matrix.xml
Normal file
241
device_framework_matrix.xml
Normal file
@@ -0,0 +1,241 @@
|
||||
<compatibility-matrix version="1.0" type="framework">
|
||||
<hal format="hidl" optional="true">
|
||||
<name>com.qualcomm.qti.imscmservice</name>
|
||||
<version>2.1</version>
|
||||
<interface>
|
||||
<name>IImsCmService</name>
|
||||
<instance>qti.ims.connectionmanagerservice</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>com.qualcomm.qti.uceservice</name>
|
||||
<version>2.0</version>
|
||||
<interface>
|
||||
<name>IUceService</name>
|
||||
<instance>com.qualcomm.qti.uceservice</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl">
|
||||
<name>vendor.qti.data.factory</name>
|
||||
<transport>hwbinder</transport>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IFactory</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>com.quicinc.cne.api</name>
|
||||
<version>1.1</version>
|
||||
<interface>
|
||||
<name>IApiService</name>
|
||||
<instance>cnd</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>com.quicinc.cne.server</name>
|
||||
<version>2.1</version>
|
||||
<interface>
|
||||
<name>IServer</name>
|
||||
<instance>cnd</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>hardware.google.media.c2</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IComponentStore</name>
|
||||
<instance>default</instance>
|
||||
<instance>software</instance>
|
||||
</interface>
|
||||
<interface>
|
||||
<name>IConfigurable</name>
|
||||
<instance>default</instance>
|
||||
<instance>software</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>android.hardware.radio.config</name>
|
||||
<version>1.1</version>
|
||||
<interface>
|
||||
<name>IRadioConfig</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.display.config</name>
|
||||
<version>1.1</version>
|
||||
<interface>
|
||||
<name>IDisplayConfig</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.google.radioext</name>
|
||||
<version>1.1</version>
|
||||
<interface>
|
||||
<name>IRadioExt</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.google.wireless_charger</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IWirelessCharger</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.google.airbrush.manager</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IAirbrushManager</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.radio.am</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IQcRilAudio</name>
|
||||
<instance>slot1</instance>
|
||||
<instance>slot2</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.radio.atcmdfwd</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IAtCmdFwd</name>
|
||||
<instance>AtCmdFwdService</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.radio.ims</name>
|
||||
<version>1.4</version>
|
||||
<interface>
|
||||
<name>IImsRadio</name>
|
||||
<instance>imsradio0</instance>
|
||||
<instance>imsradio1</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.radio.lpa</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IUimLpa</name>
|
||||
<instance>UimLpa0</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.radio.qcrilhook</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IQtiOemHook</name>
|
||||
<instance>oemhook0</instance>
|
||||
<instance>oemhook1</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.radio.uim</name>
|
||||
<version>1.1</version>
|
||||
<interface>
|
||||
<name>IUim</name>
|
||||
<instance>Uim0</instance>
|
||||
<instance>Uim1</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.radio.uim_remote_client</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IUimRemoteServiceClient</name>
|
||||
<instance>uimRemoteClient0</instance>
|
||||
<instance>uimRemoteClient1</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.radio.uim_remote_server</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IUimRemoteServiceServer</name>
|
||||
<instance>uimRemoteServer0</instance>
|
||||
<instance>uimRemoteServer1</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.tui_comm</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>ITuiComm</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.display.allocator</name>
|
||||
<version>3.0</version>
|
||||
<interface>
|
||||
<name>IQtiAllocator</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.display.mapper</name>
|
||||
<version>3.0</version>
|
||||
<interface>
|
||||
<name>IQtiMapper</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.display.mapperextensions</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IQtiMapperExtensions</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.imsrtpservice</name>
|
||||
<version>2.0</version>
|
||||
<interface>
|
||||
<name>IRTPService</name>
|
||||
<instance>imsrtpservice</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.ims.callinfo</name>
|
||||
<transport>hwbinder</transport>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IService</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>hardware.google.light</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>ILight</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.qti.hardware.bluetooth_sar</name>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IBluetoothSar</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
<hal format="hidl" optional="true">
|
||||
<name>vendor.google.wifi_ext</name>
|
||||
<transport>hwbinder</transport>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IWifiExt</name>
|
||||
<instance>default</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
</compatibility-matrix>
|
||||
43
dumpstate/Android.mk
Normal file
43
dumpstate/Android.mk
Normal file
@@ -0,0 +1,43 @@
|
||||
#
|
||||
# Copyright 2016 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
LOCAL_PATH:= $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := android.hardware.dumpstate@1.0-service.redfin
|
||||
LOCAL_INIT_RC := android.hardware.dumpstate@1.0-service.redfin.rc
|
||||
LOCAL_MODULE_RELATIVE_PATH := hw
|
||||
|
||||
LOCAL_SRC_FILES := \
|
||||
DumpstateDevice.cpp \
|
||||
service.cpp
|
||||
|
||||
LOCAL_SHARED_LIBRARIES := \
|
||||
android.hardware.dumpstate@1.0 \
|
||||
libbase \
|
||||
libcutils \
|
||||
libdumpstateutil \
|
||||
libhidlbase \
|
||||
libhidltransport \
|
||||
libhwbinder \
|
||||
liblog \
|
||||
libutils
|
||||
|
||||
LOCAL_CFLAGS := -Werror -Wall
|
||||
|
||||
LOCAL_MODULE_TAGS := optional
|
||||
LOCAL_PROPRIETARY_MODULE := true
|
||||
|
||||
include $(BUILD_EXECUTABLE)
|
||||
488
dumpstate/DumpstateDevice.cpp
Executable file
488
dumpstate/DumpstateDevice.cpp
Executable file
@@ -0,0 +1,488 @@
|
||||
/*
|
||||
* Copyright 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
#define LOG_TAG "dumpstate"
|
||||
|
||||
#include "DumpstateDevice.h"
|
||||
|
||||
#include <android-base/properties.h>
|
||||
#include <android-base/unique_fd.h>
|
||||
#include <cutils/properties.h>
|
||||
#include <hidl/HidlBinderSupport.h>
|
||||
|
||||
#include <log/log.h>
|
||||
#include <string.h>
|
||||
|
||||
#define _SVID_SOURCE
|
||||
#include <dirent.h>
|
||||
|
||||
#include "DumpstateUtil.h"
|
||||
|
||||
#define MODEM_LOG_PREFIX_PROPERTY "ro.radio.log_prefix"
|
||||
#define MODEM_LOG_LOC_PROPERTY "ro.radio.log_loc"
|
||||
#define MODEM_LOGGING_SWITCH "persist.radio.smlog_switch"
|
||||
|
||||
#define DIAG_MDLOG_PERSIST_PROPERTY "persist.vendor.sys.modem.diag.mdlog"
|
||||
#define DIAG_MDLOG_PROPERTY "vendor.sys.modem.diag.mdlog"
|
||||
#define DIAG_MDLOG_STATUS_PROPERTY "vendor.sys.modem.diag.mdlog_on"
|
||||
|
||||
#define DIAG_MDLOG_NUMBER_BUGREPORT "persist.vendor.sys.modem.diag.mdlog_br_num"
|
||||
|
||||
#define UFS_BOOTDEVICE "ro.boot.bootdevice"
|
||||
|
||||
#define TCPDUMP_NUMBER_BUGREPORT "persist.vendor.tcpdump.log.br_num"
|
||||
#define TCPDUMP_PERSIST_PROPERTY "persist.vendor.tcpdump.log.alwayson"
|
||||
|
||||
#define MODEM_EFS_DUMP_PROPERTY "vendor.sys.modem.diag.efsdump"
|
||||
|
||||
using android::os::dumpstate::CommandOptions;
|
||||
using android::os::dumpstate::DumpFileToFd;
|
||||
using android::os::dumpstate::PropertiesHelper;
|
||||
using android::os::dumpstate::RunCommandToFd;
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace dumpstate {
|
||||
namespace V1_0 {
|
||||
namespace implementation {
|
||||
|
||||
#define DIAG_LOG_PREFIX "diag_log_"
|
||||
#define TCPDUMP_LOG_PREFIX "tcpdump"
|
||||
#define EXTENDED_LOG_PREFIX "extended_log_"
|
||||
|
||||
void DumpstateDevice::dumpLogs(int fd, std::string srcDir, std::string destDir,
|
||||
int maxFileNum, const char *logPrefix) {
|
||||
struct dirent **dirent_list = NULL;
|
||||
int num_entries = scandir(srcDir.c_str(),
|
||||
&dirent_list,
|
||||
0,
|
||||
(int (*)(const struct dirent **, const struct dirent **)) alphasort);
|
||||
if (!dirent_list) {
|
||||
return;
|
||||
} else if (num_entries <= 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
int copiedFiles = 0;
|
||||
|
||||
for (int i = num_entries - 1; i >= 0; i--) {
|
||||
ALOGD("Found %s\n", dirent_list[i]->d_name);
|
||||
|
||||
if (0 != strncmp(dirent_list[i]->d_name, logPrefix, strlen(logPrefix))) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if ((copiedFiles >= maxFileNum) && (maxFileNum != -1)) {
|
||||
ALOGD("Skipped %s\n", dirent_list[i]->d_name);
|
||||
continue;
|
||||
}
|
||||
|
||||
copiedFiles++;
|
||||
|
||||
CommandOptions options = CommandOptions::WithTimeout(120).Build();
|
||||
std::string srcLogFile = srcDir + "/" + dirent_list[i]->d_name;
|
||||
std::string destLogFile = destDir + "/" + dirent_list[i]->d_name;
|
||||
|
||||
std::string copyCmd = "/vendor/bin/cp " + srcLogFile + " " + destLogFile;
|
||||
|
||||
ALOGD("Copying %s to %s\n", srcLogFile.c_str(), destLogFile.c_str());
|
||||
RunCommandToFd(fd, "CP DIAG LOGS", { "/vendor/bin/sh", "-c", copyCmd.c_str() }, options);
|
||||
}
|
||||
|
||||
while (num_entries--) {
|
||||
free(dirent_list[num_entries]);
|
||||
}
|
||||
|
||||
free(dirent_list);
|
||||
}
|
||||
|
||||
void DumpstateDevice::dumpModem(int fd, int fdModem)
|
||||
{
|
||||
std::string modemLogDir = android::base::GetProperty(MODEM_LOG_LOC_PROPERTY, "");
|
||||
if (modemLogDir.empty()) {
|
||||
ALOGD("No modem log place is set");
|
||||
return;
|
||||
}
|
||||
|
||||
std::string filePrefix = android::base::GetProperty(MODEM_LOG_PREFIX_PROPERTY, "");
|
||||
|
||||
if (filePrefix.empty()) {
|
||||
ALOGD("Modem log prefix is not set");
|
||||
return;
|
||||
}
|
||||
|
||||
const std::string modemLogCombined = modemLogDir + "/" + filePrefix + "all.tar";
|
||||
const std::string modemLogAllDir = modemLogDir + "/modem_log";
|
||||
|
||||
RunCommandToFd(fd, "MKDIR MODEM LOG", {"/vendor/bin/mkdir", "-p", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build());
|
||||
|
||||
if (!PropertiesHelper::IsUserBuild()) {
|
||||
char cmd[256] = { 0 };
|
||||
|
||||
RunCommandToFd(fd, "MODEM RFS INFO", {"/vendor/bin/find /data/vendor/rfs/mpss/OEMFI/"}, CommandOptions::WithTimeout(2).Build());
|
||||
RunCommandToFd(fd, "MODEM DIAG SYSTEM PROPERTIES", {"/vendor/bin/getprop | grep vendor.sys.modem.diag"}, CommandOptions::WithTimeout(2).Build());
|
||||
|
||||
android::base::SetProperty(MODEM_EFS_DUMP_PROPERTY, "true");
|
||||
|
||||
const std::string diagLogDir = "/data/vendor/radio/diag_logs/logs";
|
||||
const std::string tcpdumpLogDir = "/data/vendor/tcpdump_logger/logs";
|
||||
const std::string extendedLogDir = "/data/vendor/radio/extended_logs";
|
||||
const std::vector <std::string> rilAndNetmgrLogs
|
||||
{
|
||||
"/data/vendor/radio/ril_log0",
|
||||
"/data/vendor/radio/ril_log0_old",
|
||||
"/data/vendor/radio/ril_log1",
|
||||
"/data/vendor/radio/ril_log1_old",
|
||||
"/data/vendor/radio/qmi_fw_log",
|
||||
"/data/vendor/radio/qmi_fw_log_old",
|
||||
"/data/vendor/radio/imsdatadaemon_log",
|
||||
"/data/vendor/radio/imsdatadaemon_log_old",
|
||||
"/data/vendor/netmgr/netmgr_log",
|
||||
"/data/vendor/netmgr/netmgr_log_old",
|
||||
"/data/vendor/radio/power_anomaly_data.txt",
|
||||
"/data/vendor/radio/diag_logs/diag_trace.txt",
|
||||
"/data/vendor/radio/diag_logs/diag_trace_old.txt",
|
||||
"/data/vendor/radio/diag_logs/logs/diag_poweron_log.qmdl",
|
||||
"/data/vendor/radio/metrics_data",
|
||||
"/data/vendor/ssrlog/ssr_log.txt",
|
||||
"/data/vendor/ssrlog/ssr_log_old.txt",
|
||||
"/data/vendor/rfs/mpss/modem_efs"
|
||||
};
|
||||
|
||||
bool smlogEnabled = android::base::GetBoolProperty(MODEM_LOGGING_SWITCH, false) && !access("/vendor/bin/smlog_dump", X_OK);
|
||||
bool diagLogEnabled = android::base::GetBoolProperty(DIAG_MDLOG_PERSIST_PROPERTY, false);
|
||||
bool tcpdumpEnabled = android::base::GetBoolProperty(TCPDUMP_PERSIST_PROPERTY, false);
|
||||
|
||||
if (smlogEnabled) {
|
||||
RunCommandToFd(fd, "SMLOG DUMP", {"smlog_dump", "-d", "-o", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(10).Build());
|
||||
} else if (diagLogEnabled) {
|
||||
bool diagLogStarted = android::base::GetBoolProperty( DIAG_MDLOG_STATUS_PROPERTY, false);
|
||||
|
||||
if (diagLogStarted) {
|
||||
android::base::SetProperty(DIAG_MDLOG_PROPERTY, "false");
|
||||
ALOGD("Stopping diag_mdlog...\n");
|
||||
if (android::base::WaitForProperty(DIAG_MDLOG_STATUS_PROPERTY, "false", std::chrono::seconds(20))) {
|
||||
ALOGD("diag_mdlog exited");
|
||||
} else {
|
||||
ALOGE("Waited mdlog timeout after 20 second");
|
||||
}
|
||||
} else {
|
||||
ALOGD("diag_mdlog is not running");
|
||||
}
|
||||
|
||||
dumpLogs(fd, diagLogDir, modemLogAllDir, android::base::GetIntProperty(DIAG_MDLOG_NUMBER_BUGREPORT, 100), DIAG_LOG_PREFIX);
|
||||
|
||||
if (diagLogStarted) {
|
||||
ALOGD("Restarting diag_mdlog...");
|
||||
android::base::SetProperty(DIAG_MDLOG_PROPERTY, "true");
|
||||
}
|
||||
}
|
||||
|
||||
if (tcpdumpEnabled) {
|
||||
dumpLogs(fd, tcpdumpLogDir, modemLogAllDir, android::base::GetIntProperty(TCPDUMP_NUMBER_BUGREPORT, 5), TCPDUMP_LOG_PREFIX);
|
||||
}
|
||||
|
||||
for (const auto& logFile : rilAndNetmgrLogs) {
|
||||
RunCommandToFd(fd, "CP MODEM LOG", {"/vendor/bin/cp", logFile.c_str(), modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build());
|
||||
}
|
||||
|
||||
//Dump IPA log
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"cat /d/ipc_logging/ipa/log > %s/ipa_log",
|
||||
modemLogAllDir.c_str());
|
||||
RunCommandToFd(fd, "Dump IPA log", {"/vendor/bin/sh", "-c", cmd});
|
||||
|
||||
// Dump esoc-mdm log
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"cat /sys/kernel/debug/ipc_logging/esoc-mdm/log > %s/esoc-mdm_log.txt",
|
||||
modemLogAllDir.c_str());
|
||||
RunCommandToFd(fd, "ESOC-MDM LOG", {"/vendor/bin/sh", "-c", cmd});
|
||||
|
||||
// Dump pcie0 log
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"cat /sys/kernel/debug/ipc_logging/pcie0-long/log > %s/pcie0-long_log.txt",
|
||||
modemLogAllDir.c_str());
|
||||
RunCommandToFd(fd, "PCIE0-LONG LOG", {"/vendor/bin/sh", "-c", cmd});
|
||||
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"cat /sys/kernel/debug/ipc_logging/pcie0-short/log > %s/pcie0-short_log.txt",
|
||||
modemLogAllDir.c_str());
|
||||
RunCommandToFd(fd, "PCIE0-SHORT LOG", {"/vendor/bin/sh", "-c", cmd});
|
||||
|
||||
dumpLogs(fd, extendedLogDir, modemLogAllDir, 100, EXTENDED_LOG_PREFIX);
|
||||
android::base::SetProperty(MODEM_EFS_DUMP_PROPERTY, "false");
|
||||
}
|
||||
|
||||
RunCommandToFd(fd, "TAR LOG", {"/vendor/bin/tar", "cvf", modemLogCombined.c_str(), "-C", modemLogAllDir.c_str(), "."}, CommandOptions::WithTimeout(120).Build());
|
||||
RunCommandToFd(fd, "CHG PERM", {"/vendor/bin/chmod", "a+w", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build());
|
||||
|
||||
std::vector<uint8_t> buffer(65536);
|
||||
android::base::unique_fd fdLog(TEMP_FAILURE_RETRY(open(modemLogCombined.c_str(), O_RDONLY | O_CLOEXEC | O_NONBLOCK)));
|
||||
|
||||
if (fdLog >= 0) {
|
||||
while (1) {
|
||||
ssize_t bytes_read = TEMP_FAILURE_RETRY(read(fdLog, buffer.data(), buffer.size()));
|
||||
|
||||
if (bytes_read == 0) {
|
||||
break;
|
||||
} else if (bytes_read < 0) {
|
||||
ALOGD("read(%s): %s\n", modemLogCombined.c_str(), strerror(errno));
|
||||
break;
|
||||
}
|
||||
|
||||
ssize_t result = TEMP_FAILURE_RETRY(write(fdModem, buffer.data(), bytes_read));
|
||||
|
||||
if (result != bytes_read) {
|
||||
ALOGD("Failed to write %ld bytes, actually written: %ld", bytes_read, result);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
RunCommandToFd(fd, "RM MODEM DIR", { "/vendor/bin/rm", "-r", modemLogAllDir.c_str()}, CommandOptions::WithTimeout(2).Build());
|
||||
RunCommandToFd(fd, "RM LOG", { "/vendor/bin/rm", modemLogCombined.c_str()}, CommandOptions::WithTimeout(2).Build());
|
||||
}
|
||||
|
||||
static void DumpTouch(int fd) {
|
||||
const char touch_spi_path[] = "/sys/class/spi_master/spi1/spi1.0";
|
||||
char cmd[256];
|
||||
|
||||
snprintf(cmd, sizeof(cmd), "%s/appid", touch_spi_path);
|
||||
if (!access(cmd, R_OK)) {
|
||||
// Touch firmware version
|
||||
DumpFileToFd(fd, "STM touch firmware version", cmd);
|
||||
|
||||
// Touch controller status
|
||||
snprintf(cmd, sizeof(cmd), "%s/status", touch_spi_path);
|
||||
DumpFileToFd(fd, "STM touch status", cmd);
|
||||
|
||||
// Mutual raw data
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"echo 13 00 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
|
||||
touch_spi_path, touch_spi_path);
|
||||
RunCommandToFd(fd, "Mutual Raw", {"/vendor/bin/sh", "-c", cmd});
|
||||
|
||||
// Mutual strength data
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"echo 17 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
|
||||
touch_spi_path, touch_spi_path);
|
||||
RunCommandToFd(fd, "Mutual Strength", {"/vendor/bin/sh", "-c", cmd});
|
||||
|
||||
// Self raw data
|
||||
snprintf(cmd, sizeof(cmd),
|
||||
"echo 15 00 > %s/stm_fts_cmd && cat %s/stm_fts_cmd",
|
||||
touch_spi_path, touch_spi_path);
|
||||
RunCommandToFd(fd, "Self Raw", {"/vendor/bin/sh", "-c", cmd});
|
||||
}
|
||||
|
||||
if (!access("/proc/fts/driver_test", R_OK)) {
|
||||
RunCommandToFd(fd, "Mutual Raw Data",
|
||||
{"/vendor/bin/sh", "-c",
|
||||
"echo 23 00 > /proc/fts/driver_test && "
|
||||
"cat /proc/fts/driver_test"});
|
||||
RunCommandToFd(fd, "Mutual Baseline Data",
|
||||
{"/vendor/bin/sh", "-c",
|
||||
"echo 23 03 > /proc/fts/driver_test && "
|
||||
"cat /proc/fts/driver_test"});
|
||||
RunCommandToFd(fd, "Mutual Strength Data",
|
||||
{"/vendor/bin/sh", "-c",
|
||||
"echo 23 02 > /proc/fts/driver_test && "
|
||||
"cat /proc/fts/driver_test"});
|
||||
RunCommandToFd(fd, "Self Raw Data",
|
||||
{"/vendor/bin/sh", "-c",
|
||||
"echo 24 00 > /proc/fts/driver_test && "
|
||||
"cat /proc/fts/driver_test"});
|
||||
RunCommandToFd(fd, "Self Baseline Data",
|
||||
{"/vendor/bin/sh", "-c",
|
||||
"echo 24 03 > /proc/fts/driver_test && "
|
||||
"cat /proc/fts/driver_test"});
|
||||
RunCommandToFd(fd, "Self Strength Data",
|
||||
{"/vendor/bin/sh", "-c",
|
||||
"echo 24 02 > /proc/fts/driver_test && "
|
||||
"cat /proc/fts/driver_test"});
|
||||
RunCommandToFd(fd, "Mutual Compensation",
|
||||
{"/vendor/bin/sh", "-c",
|
||||
"echo 32 10 > /proc/fts/driver_test && "
|
||||
"cat /proc/fts/driver_test"});
|
||||
RunCommandToFd(fd, "Self Compensation",
|
||||
{"/vendor/bin/sh", "-c",
|
||||
"echo 33 12 > /proc/fts/driver_test && "
|
||||
"cat /proc/fts/driver_test"});
|
||||
}
|
||||
}
|
||||
|
||||
static void DumpF2FS(int fd) {
|
||||
DumpFileToFd(fd, "F2FS", "/sys/kernel/debug/f2fs/status");
|
||||
DumpFileToFd(fd, "F2FS - fragmentation", "/proc/fs/f2fs/dm-3/segment_info");
|
||||
}
|
||||
|
||||
static void DumpUFS(int fd) {
|
||||
DumpFileToFd(fd, "UFS model", "/sys/block/sda/device/model");
|
||||
DumpFileToFd(fd, "UFS rev", "/sys/block/sda/device/rev");
|
||||
DumpFileToFd(fd, "UFS size", "/sys/block/sda/size");
|
||||
DumpFileToFd(fd, "UFS show_hba", "/sys/kernel/debug/ufshcd0/show_hba");
|
||||
DumpFileToFd(fd, "UFS err_stats", "/sys/kernel/debug/ufshcd0/stats/err_stats");
|
||||
DumpFileToFd(fd, "UFS io_stats", "/sys/kernel/debug/ufshcd0/stats/io_stats");
|
||||
DumpFileToFd(fd, "UFS req_stats", "/sys/kernel/debug/ufshcd0/stats/req_stats");
|
||||
|
||||
std::string bootdev = android::base::GetProperty(UFS_BOOTDEVICE, "");
|
||||
if (!bootdev.empty()) {
|
||||
DumpFileToFd(fd, "UFS Slow IO Read", "/sys/devices/platform/soc/" + bootdev + "/slowio_read_cnt");
|
||||
DumpFileToFd(fd, "UFS Slow IO Write", "/sys/devices/platform/soc/" + bootdev + "/slowio_write_cnt");
|
||||
DumpFileToFd(fd, "UFS Slow IO Unmap", "/sys/devices/platform/soc/" + bootdev + "/slowio_unmap_cnt");
|
||||
DumpFileToFd(fd, "UFS Slow IO Sync", "/sys/devices/platform/soc/" + bootdev + "/slowio_sync_cnt");
|
||||
|
||||
std::string ufs_health = "for f in $(find /sys/devices/platform/soc/" + bootdev + "/health -type f); do if [[ -r $f && -f $f ]]; then echo --- $f; cat $f; echo ''; fi; done";
|
||||
RunCommandToFd(fd, "UFS health", {"/vendor/bin/sh", "-c", ufs_health.c_str()});
|
||||
}
|
||||
}
|
||||
|
||||
static void DumpVibrator(int fd) {
|
||||
const std::string dir = "/sys/class/leds/vibrator/device/";
|
||||
const std::vector<std::string> files {
|
||||
"asp_enable",
|
||||
"comp_enable",
|
||||
"cp_dig_scale",
|
||||
"cp_trigger_duration",
|
||||
"cp_trigger_index",
|
||||
"cp_trigger_q_sub",
|
||||
"cp_trigger_queue",
|
||||
"dig_scale",
|
||||
"exc_enable",
|
||||
"f0_stored",
|
||||
"fw_rev",
|
||||
"heartbeat",
|
||||
"hw_reset",
|
||||
"leds/vibrator/activate",
|
||||
"leds/vibrator/duration",
|
||||
"leds/vibrator/state",
|
||||
"num_waves",
|
||||
"q_stored",
|
||||
"redc_comp_enable",
|
||||
"redc_stored",
|
||||
"standby_timeout",
|
||||
"vbatt_max",
|
||||
"vbatt_min",
|
||||
};
|
||||
|
||||
for (const auto &file : files) {
|
||||
DumpFileToFd(fd, "Vibrator", dir+file);
|
||||
}
|
||||
}
|
||||
|
||||
// Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow.
|
||||
Return<void> DumpstateDevice::dumpstateBoard(const hidl_handle& handle) {
|
||||
// Exit when dump is completed since this is a lazy HAL.
|
||||
addPostCommandTask([]() {
|
||||
exit(0);
|
||||
});
|
||||
|
||||
if (handle == nullptr || handle->numFds < 1) {
|
||||
ALOGE("no FDs\n");
|
||||
return Void();
|
||||
}
|
||||
|
||||
int fd = handle->data[0];
|
||||
if (fd < 0) {
|
||||
ALOGE("invalid FD: %d\n", handle->data[0]);
|
||||
return Void();
|
||||
}
|
||||
|
||||
RunCommandToFd(fd, "VENDOR PROPERTIES", {"/vendor/bin/getprop"});
|
||||
DumpFileToFd(fd, "SoC serial number", "/sys/devices/soc0/serial_number");
|
||||
DumpFileToFd(fd, "CPU present", "/sys/devices/system/cpu/present");
|
||||
DumpFileToFd(fd, "CPU online", "/sys/devices/system/cpu/online");
|
||||
DumpTouch(fd);
|
||||
|
||||
DumpF2FS(fd);
|
||||
DumpUFS(fd);
|
||||
|
||||
DumpFileToFd(fd, "INTERRUPTS", "/proc/interrupts");
|
||||
DumpFileToFd(fd, "Sleep Stats", "/sys/power/system_sleep/stats");
|
||||
DumpFileToFd(fd, "Power Management Stats", "/sys/power/rpmh_stats/master_stats");
|
||||
DumpFileToFd(fd, "WLAN Power Stats", "/sys/kernel/wlan/power_stats");
|
||||
DumpFileToFd(fd, "LL-Stats", "/d/wlan0/ll_stats");
|
||||
DumpFileToFd(fd, "WLAN Connect Info", "/d/wlan0/connect_info");
|
||||
DumpFileToFd(fd, "WLAN Offload Info", "/d/wlan0/offload_info");
|
||||
DumpFileToFd(fd, "WLAN Roaming Stats", "/d/wlan0/roam_stats");
|
||||
DumpFileToFd(fd, "ICNSS Stats", "/d/icnss/stats");
|
||||
DumpFileToFd(fd, "SMD Log", "/d/ipc_logging/smd/log");
|
||||
RunCommandToFd(fd, "ION HEAPS", {"/vendor/bin/sh", "-c", "for d in $(ls -d /d/ion/*); do for f in $(ls $d); do echo --- $d/$f; cat $d/$f; done; done"});
|
||||
DumpFileToFd(fd, "dmabuf info", "/d/dma_buf/bufinfo");
|
||||
DumpFileToFd(fd, "dmabuf process info", "/d/dma_buf/dmaprocs");
|
||||
RunCommandToFd(fd, "Temperatures", {"/vendor/bin/sh", "-c", "for f in /sys/class/thermal/thermal* ; do type=`cat $f/type` ; temp=`cat $f/temp` ; echo \"$type: $temp\" ; done"});
|
||||
RunCommandToFd(fd, "Cooling Device Current State", {"/vendor/bin/sh", "-c", "for f in /sys/class/thermal/cooling* ; do type=`cat $f/type` ; temp=`cat $f/cur_state` ; echo \"$type: $temp\" ; done"});
|
||||
RunCommandToFd(
|
||||
fd, "LMH info",
|
||||
{"/vendor/bin/sh", "-c",
|
||||
"for f in /sys/bus/platform/drivers/msm_lmh_dcvs/*qcom,limits-dcvs@*/lmh_freq_limit; do "
|
||||
"state=`cat $f` ; echo \"$f: $state\" ; done"});
|
||||
RunCommandToFd(fd, "CPU time-in-state", {"/vendor/bin/sh", "-c", "for cpu in /sys/devices/system/cpu/cpu*; do f=$cpu/cpufreq/stats/time_in_state; if [ ! -f $f ]; then continue; fi; echo $f:; cat $f; done"});
|
||||
RunCommandToFd(fd, "CPU cpuidle", {"/vendor/bin/sh", "-c", "for cpu in /sys/devices/system/cpu/cpu*; do for d in $cpu/cpuidle/state*; do if [ ! -d $d ]; then continue; fi; echo \"$d: `cat $d/name` `cat $d/desc` `cat $d/time` `cat $d/usage`\"; done; done"});
|
||||
RunCommandToFd(fd, "Airbrush debug info", {"/vendor/bin/sh", "-c", "for f in `ls /sys/devices/platform/soc/c84000.i2c/i2c-4/4-0066/@(*curr|temperature|vbat|total_power)`; do echo \"$f: `cat $f`\" ; done; file=/d/airbrush/airbrush_sm/chip_state; echo \"$file: `cat $file`\""});
|
||||
DumpFileToFd(fd, "MDP xlogs", "/data/vendor/display/mdp_xlog");
|
||||
DumpFileToFd(fd, "TCPM logs", "/d/tcpm/usbpd0");
|
||||
DumpFileToFd(fd, "PD Engine", "/d/pd_engine/usbpd0");
|
||||
DumpFileToFd(fd, "ipc-local-ports", "/d/msm_ipc_router/dump_local_ports");
|
||||
RunCommandToFd(fd, "USB Device Descriptors", {"/vendor/bin/sh", "-c", "cd /sys/bus/usb/devices/1-1 && cat product && cat bcdDevice; cat descriptors | od -t x1 -w16 -N96"});
|
||||
RunCommandToFd(fd, "Power supply properties", {"/vendor/bin/sh", "-c", "for f in `ls /sys/class/power_supply/*/uevent` ; do echo \"------ $f\\n`cat $f`\\n\" ; done"});
|
||||
RunCommandToFd(fd, "PMIC Votables", {"/vendor/bin/sh", "-c", "cat /sys/kernel/debug/pmic-votable/*/status"});
|
||||
DumpFileToFd(fd, "Battery cycle count", "/d/google_battery/cycle_count_bins");
|
||||
DumpFileToFd(fd, "Maxim FG History", "/dev/maxfg_history");
|
||||
DumpFileToFd(fd, "Maxim FG registers", "/d/regmap/1-0036/registers");
|
||||
DumpFileToFd(fd, "Maxim FG NV RAM", "/d/regmap/1-000b/registers");
|
||||
RunCommandToFd(fd, "Google Charger", {"/vendor/bin/sh", "-c", "cd /d/google_charger/; for f in `ls pps_*` ; do echo \"$f: `cat $f`\" ; done"});
|
||||
RunCommandToFd(fd, "Google Battery", {"/vendor/bin/sh", "-c", "cd /d/google_battery/; for f in `ls ssoc_*` ; do echo \"$f: `cat $f`\" ; done"});
|
||||
DumpFileToFd(fd, "WLC VER", "/sys/devices/platform/soc/a88000.i2c/i2c-0/0-0061/version");
|
||||
DumpFileToFd(fd, "WLC STATUS", "/sys/devices/platform/soc/a88000.i2c/i2c-0/0-0061/status");
|
||||
|
||||
RunCommandToFd(fd, "eSIM Status", {"/vendor/bin/sh", "-c", "od -t x1 /sys/firmware/devicetree/base/chosen/cdt/cdb2/esim"});
|
||||
DumpFileToFd(fd, "Modem Stat", "/data/vendor/modem_stat/debug.txt");
|
||||
DumpFileToFd(fd, "Pixel trace", "/d/tracing/instances/pixel-trace/trace");
|
||||
|
||||
// Slower dump put later in case stuck the rest of dump
|
||||
// Timeout after 3s as TZ log missing EOF
|
||||
RunCommandToFd(fd, "QSEE logs", {"/vendor/bin/sh", "-c", "/vendor/bin/timeout 3 cat /d/tzdbg/qsee_log"});
|
||||
if (handle->numFds < 2) {
|
||||
ALOGE("no FD for modem\n");
|
||||
} else {
|
||||
int fdModem = handle->data[1];
|
||||
dumpModem(fd, fdModem);
|
||||
}
|
||||
|
||||
// Citadel info (only enabled on -eng and -userdebug builds)
|
||||
if (!PropertiesHelper::IsUserBuild()) {
|
||||
RunCommandToFd(fd, "Citadel ID", {"/vendor/bin/hw/citadel_updater", "--id"});
|
||||
RunCommandToFd(fd, "Citadel VER", {"/vendor/bin/hw/citadel_updater", "-lv"});
|
||||
RunCommandToFd(fd, "Citadel SELFTEST", {"/vendor/bin/hw/citadel_updater", "--selftest"});
|
||||
}
|
||||
|
||||
DumpVibrator(fd);
|
||||
|
||||
// Dump various events in WiFi data path
|
||||
DumpFileToFd(fd, "WLAN DP Trace", "/d/wlan/dpt_stats/dump_set_dpt_logs");
|
||||
|
||||
// Keep this at the end as very long on not for humans
|
||||
DumpFileToFd(fd, "WLAN FW Log Symbol Table", "/vendor/firmware/Data.msc");
|
||||
|
||||
return Void();
|
||||
}
|
||||
|
||||
} // namespace implementation
|
||||
} // namespace V1_0
|
||||
} // namespace dumpstate
|
||||
} // namespace hardware
|
||||
} // namespace android
|
||||
54
dumpstate/DumpstateDevice.h
Normal file
54
dumpstate/DumpstateDevice.h
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (C) 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#ifndef ANDROID_HARDWARE_DUMPSTATE_V1_0_DUMPSTATEDEVICE_H
|
||||
#define ANDROID_HARDWARE_DUMPSTATE_V1_0_DUMPSTATEDEVICE_H
|
||||
|
||||
#include <android/hardware/dumpstate/1.0/IDumpstateDevice.h>
|
||||
#include <hidl/MQDescriptor.h>
|
||||
#include <hidl/Status.h>
|
||||
#include <string>
|
||||
|
||||
namespace android {
|
||||
namespace hardware {
|
||||
namespace dumpstate {
|
||||
namespace V1_0 {
|
||||
namespace implementation {
|
||||
|
||||
using ::android::hardware::dumpstate::V1_0::IDumpstateDevice;
|
||||
using ::android::hardware::hidl_array;
|
||||
using ::android::hardware::hidl_handle;
|
||||
using ::android::hardware::hidl_string;
|
||||
using ::android::hardware::hidl_vec;
|
||||
using ::android::hardware::Return;
|
||||
using ::android::hardware::Void;
|
||||
using ::android::sp;
|
||||
|
||||
struct DumpstateDevice : public IDumpstateDevice {
|
||||
// Methods from ::android::hardware::dumpstate::V1_0::IDumpstateDevice follow.
|
||||
Return<void> dumpstateBoard(const hidl_handle& h) override;
|
||||
|
||||
void dumpLogs(int fd, std::string srcDir, std::string destDir, int maxFileNum,
|
||||
const char *logPrefix);
|
||||
void dumpModem(int fd, int fdModem);
|
||||
};
|
||||
|
||||
} // namespace implementation
|
||||
} // namespace V1_0
|
||||
} // namespace dumpstate
|
||||
} // namespace hardware
|
||||
} // namespace android
|
||||
|
||||
#endif // ANDROID_HARDWARE_DUMPSTATE_V1_0_DUMPSTATEDEVICE_H
|
||||
10
dumpstate/android.hardware.dumpstate@1.0-service.redfin.rc
Normal file
10
dumpstate/android.hardware.dumpstate@1.0-service.redfin.rc
Normal file
@@ -0,0 +1,10 @@
|
||||
service vendor.dumpstate-1-0 /vendor/bin/hw/android.hardware.dumpstate@1.0-service.redfin
|
||||
class hal
|
||||
user system
|
||||
group system vendor_rfs
|
||||
interface android.hardware.dumpstate@1.0::IDumpstateDevice default
|
||||
oneshot
|
||||
disabled
|
||||
|
||||
on boot
|
||||
chmod 0444 /sys/kernel/debug/tzdbg/qsee_log
|
||||
43
dumpstate/service.cpp
Normal file
43
dumpstate/service.cpp
Normal file
@@ -0,0 +1,43 @@
|
||||
/*
|
||||
* Copyright (C) 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#define LOG_TAG "android.hardware.dumpstate@1.0-service.redfin"
|
||||
|
||||
#include <hidl/HidlSupport.h>
|
||||
#include <hidl/HidlTransportSupport.h>
|
||||
|
||||
#include "DumpstateDevice.h"
|
||||
|
||||
using ::android::hardware::configureRpcThreadpool;
|
||||
using ::android::hardware::dumpstate::V1_0::IDumpstateDevice;
|
||||
using ::android::hardware::dumpstate::V1_0::implementation::DumpstateDevice;
|
||||
using ::android::hardware::joinRpcThreadpool;
|
||||
using ::android::sp;
|
||||
|
||||
|
||||
int main(int /* argc */, char* /* argv */ []) {
|
||||
sp<IDumpstateDevice> dumpstate = new DumpstateDevice;
|
||||
configureRpcThreadpool(1, true);
|
||||
|
||||
android::status_t status = dumpstate->registerAsService();
|
||||
|
||||
if (status != android::OK)
|
||||
{
|
||||
ALOGE("Could not register DumpstateDevice service (%d).", status);
|
||||
return -1;
|
||||
}
|
||||
|
||||
joinRpcThreadpool();
|
||||
}
|
||||
39
framework_manifest.xml
Normal file
39
framework_manifest.xml
Normal file
@@ -0,0 +1,39 @@
|
||||
<!-- Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
* Neither the name of The Linux Foundation nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
-->
|
||||
<manifest version="1.0" type="framework">
|
||||
<!-- atfwd -->
|
||||
<hal format="hidl">
|
||||
<name>vendor.qti.hardware.radio.atcmdfwd</name>
|
||||
<transport>hwbinder</transport>
|
||||
<version>1.0</version>
|
||||
<interface>
|
||||
<name>IAtCmdFwd</name>
|
||||
<instance>AtCmdFwdService</instance>
|
||||
</interface>
|
||||
</hal>
|
||||
</manifest>
|
||||
12
fstab.hardware
Normal file
12
fstab.hardware
Normal file
@@ -0,0 +1,12 @@
|
||||
# Android fstab file.
|
||||
|
||||
#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
|
||||
system /system ext4 ro,barrier=1 wait,slotselect,avb=vbmeta_system,logical,first_stage_mount
|
||||
vendor /vendor ext4 ro,barrier=1 wait,slotselect,avb=vbmeta,logical,first_stage_mount
|
||||
product /product ext4 ro,barrier=1 wait,slotselect,avb,logical,first_stage_mount
|
||||
/dev/block/by-name/metadata /metadata ext4 noatime,nosuid,nodev,discard,sync wait,formattable,first_stage_mount
|
||||
/dev/block/bootdevice/by-name/modem /vendor/firmware_mnt vfat ro,shortname=lower,uid=0,gid=1000,dmask=227,fmask=337,context=u:object_r:firmware_file:s0 wait,slotselect
|
||||
/dev/block/bootdevice/by-name/misc /misc emmc defaults defaults
|
||||
/dev/block/bootdevice/by-name/userdata /data f2fs noatime,nosuid,nodev,discard,reserve_root=32768,resgid=1065,fsync_mode=nobarrier latemount,wait,check,quota,formattable,fileencryption=ice,reservedsize=128M,sysfs_path=/sys/devices/platform/soc/1d84000.ufshc,keydirectory=/metadata/vold/metadata_encryption,checkpoint=fs
|
||||
/devices/platform/soc/a600000.ssusb/a600000.dwc3* auto vfat defaults voldmanaged=usb:auto
|
||||
/dev/block/zram0 none swap defaults zramsize=2147483648,max_comp_streams=8,zram_loopback_path=/data/unencrypted/zram_swap,zram_loopback_size=512M
|
||||
4
fstab.persist
Normal file
4
fstab.persist
Normal file
@@ -0,0 +1,4 @@
|
||||
# Keep persist in an fstab file, since we need to run fsck on it after abnormal shutdown.
|
||||
|
||||
#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
|
||||
/dev/block/platform/soc/1d84000.ufshc/by-name/persist /mnt/vendor/persist ext4 nosuid,nodev,noatime,barrier=1 wait
|
||||
17
fstab.postinstall
Normal file
17
fstab.postinstall
Normal file
@@ -0,0 +1,17 @@
|
||||
#
|
||||
# Copyright (C) 2018 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
|
||||
#<src> <mnt_point> <type> <mnt_flags and options> <fs_mgr_flags>
|
||||
system /postinstall ext4 ro,nosuid,nodev,noexec slotselect_other,logical,avb_keys=/product/etc/security/avb/system_other.avbpubkey
|
||||
297
gps.conf
Normal file
297
gps.conf
Normal file
@@ -0,0 +1,297 @@
|
||||
#Version check for XTRA
|
||||
#DISABLE = 0
|
||||
#AUTO = 1
|
||||
#XTRA2 = 2
|
||||
#XTRA3 = 3
|
||||
XTRA_VERSION_CHECK=0
|
||||
|
||||
# Error Estimate
|
||||
# _SET = 1
|
||||
# _CLEAR = 0
|
||||
ERR_ESTIMATE=0
|
||||
|
||||
#NTP server
|
||||
#NTP_SERVER setting is in modem NV
|
||||
|
||||
#XTRA CA path
|
||||
XTRA_CA_PATH=/system/etc/security/cacerts
|
||||
|
||||
# DEBUG LEVELS: 0 - none, 1 - Error, 2 - Warning, 3 - Info
|
||||
# 4 - Debug, 5 - Verbose
|
||||
# If DEBUG_LEVEL is commented, Android's logging levels will be used
|
||||
DEBUG_LEVEL = 2
|
||||
|
||||
# Intermediate position report, 1=enable, 0=disable
|
||||
INTERMEDIATE_POS=0
|
||||
|
||||
# Below bit mask configures how GPS functionalities
|
||||
# should be locked when user turns off GPS on Settings
|
||||
# Set bit 0x1 if MO GPS functionalities are to be locked
|
||||
# Set bit 0x2 if NI GPS functionalities are to be locked
|
||||
# default – both MO and NI locked for maximal privacy
|
||||
#GPS_LOCK = 3
|
||||
|
||||
# supl version 1.0
|
||||
#SUPL_VER=0x10000
|
||||
|
||||
# Emergency SUPL, 1=enable, 0=disable
|
||||
SUPL_ES=1
|
||||
|
||||
#Choose PDN for Emergency SUPL
|
||||
#1 - Use emergency PDN
|
||||
#0 - Use regular SUPL PDN for Emergency SUPL
|
||||
#USE_EMERGENCY_PDN_FOR_EMERGENCY_SUPL=0
|
||||
|
||||
#SUPL_MODE is a bit mask set in config.xml per carrier by default.
|
||||
#If it is uncommented here, this value will overwrite the value from
|
||||
#config.xml.
|
||||
#MSA=0X2
|
||||
#MSB=0X1
|
||||
#SUPL_MODE=
|
||||
|
||||
# GPS Capabilities bit mask
|
||||
# SCHEDULING = 0x01
|
||||
# MSB = 0x02
|
||||
# MSA = 0x04
|
||||
# ON_DEMAND_TIME = 0x10
|
||||
# GEOFENCE = 0x20
|
||||
# default = ON_DEMAND_TIME | MSA | MSB | SCHEDULING | GEOFENCE
|
||||
CAPABILITIES=0x37
|
||||
|
||||
# Accuracy threshold for intermediate positions
|
||||
# less accurate positions are ignored, 0 for passing all positions
|
||||
# ACCURACY_THRES=5000
|
||||
|
||||
################################
|
||||
##### AGPS server settings #####
|
||||
################################
|
||||
|
||||
# FOR SUPL SUPPORT, set the following
|
||||
# SUPL_HOST=supl.host.com or IP
|
||||
# SUPL_PORT=1234
|
||||
|
||||
# FOR MO SUPL SUPPORT, set the following
|
||||
# MO_SUPL_HOST=supl.host.com or IP
|
||||
# MO_SUPL_PORT=1234
|
||||
|
||||
# FOR C2K PDE SUPPORT, set the following
|
||||
# C2K_HOST=c2k.pde.com or IP
|
||||
# C2K_PORT=1234
|
||||
|
||||
# Bitmask of slots that are available
|
||||
# for write/install to, where 1s indicate writable,
|
||||
# and the default value is 0 where no slots
|
||||
# are writable. For example, AGPS_CERT_WRITABLE_MASK
|
||||
# of b1000001010 makes 3 slots available
|
||||
# and the remaining 7 slots unwritable.
|
||||
#AGPS_CERT_WRITABLE_MASK=0
|
||||
|
||||
####################################
|
||||
# LTE Positioning Profile Settings
|
||||
####################################
|
||||
# 0: Enable RRLP on LTE(Default)
|
||||
# 1: Enable LPP_User_Plane on LTE
|
||||
# 2: Enable LPP_Control_Plane
|
||||
# 3: Enable both LPP_User_Plane and LPP_Control_Plane
|
||||
#LPP_PROFILE = 2
|
||||
|
||||
####################################
|
||||
#Datum Type
|
||||
####################################
|
||||
# 0: WGS-84
|
||||
# 1: PZ-90
|
||||
DATUM_TYPE = 0
|
||||
|
||||
################################
|
||||
# EXTRA SETTINGS
|
||||
################################
|
||||
# NMEA provider (1=Modem Processor, 0=Application Processor)
|
||||
NMEA_PROVIDER=0
|
||||
# Mark if it is a SGLTE target (1=SGLTE, 0=nonSGLTE)
|
||||
SGLTE_TARGET=0
|
||||
|
||||
##################################################
|
||||
# Select Positioning Protocol on A-GLONASS system
|
||||
##################################################
|
||||
# 0x1: RRC CPlane
|
||||
# 0x2: RRLP UPlane
|
||||
# 0x4: LLP Uplane
|
||||
#A_GLONASS_POS_PROTOCOL_SELECT = 0
|
||||
|
||||
##################################################
|
||||
# Select technology for LPPe Control Plane
|
||||
##################################################
|
||||
# 0x1: DBH for LPPe CP
|
||||
# 0x2: WLAN AP Measurements for LPPe CP
|
||||
# 0x4: SRN AP measurement for CP
|
||||
# 0x8: Sensor Barometer Measurement LPPe CP
|
||||
#LPPE_CP_TECHNOLOGY = 0
|
||||
|
||||
##################################################
|
||||
# Select technology for LPPe User Plane
|
||||
##################################################
|
||||
# 0x1: DBH for LPPe UP
|
||||
# 0x2: WLAN AP Measurements for LPPe UP
|
||||
# 0x4: SRN AP measurement for UP
|
||||
# 0x8: Sensor Barometer Measurement LPPe UP
|
||||
#LPPE_UP_TECHNOLOGY = 0
|
||||
|
||||
##################################################
|
||||
# AGPS_CONFIG_INJECT
|
||||
##################################################
|
||||
# enable/disable injection of AGPS configurations:
|
||||
# SUPL_VER
|
||||
# SUPL_HOST
|
||||
# SUPL_PORT
|
||||
# MO_SUPL_HOST
|
||||
# MO_SUPL_PORT
|
||||
# C2K_HOST
|
||||
# C2K_PORT
|
||||
# LPP_PROFILE
|
||||
# A_GLONASS_POS_PROTOCOL_SELECT
|
||||
# 0: disable
|
||||
# 1: enable
|
||||
AGPS_CONFIG_INJECT = 1
|
||||
|
||||
##################################################
|
||||
# GNSS settings for automotive use cases
|
||||
# Configurations in following section are
|
||||
# specific to automotive use cases, others
|
||||
# please do not change, keep the default values
|
||||
##################################################
|
||||
|
||||
# AP Coarse Timestamp Uncertainty
|
||||
##################################################
|
||||
# default : 10
|
||||
# AP time stamp uncertainty, until GNSS receiver
|
||||
# is able to acquire better timing information
|
||||
AP_TIMESTAMP_UNCERTAINTY = 10
|
||||
|
||||
##################################################
|
||||
# QDR engine availability status
|
||||
##################################################
|
||||
# 0 : NO QDR (default)
|
||||
# 1 : QDR enabled
|
||||
# This settings enables QDR Configuration for
|
||||
# automotive use case, if enabled then
|
||||
# DR_AP_Service needs to be enabled in izat.conf
|
||||
#EXTERNAL_DR_ENABLED = 0
|
||||
|
||||
#####################################
|
||||
# DR_SYNC Pulse Availability
|
||||
#####################################
|
||||
# 0 : DR_SYNC pulse not available (default)
|
||||
# 1 : DR_SYNC pulse available
|
||||
# This configuration enables the driver to make use
|
||||
# of PPS events generated by DR_SYNC pulse
|
||||
# Standard Linux PPS driver needs to be enabled
|
||||
DR_SYNC_ENABLED = 0
|
||||
|
||||
#####################################
|
||||
# PPS Device name
|
||||
#####################################
|
||||
PPS_DEVICENAME = /dev/pps0
|
||||
|
||||
#####################################
|
||||
# Ignore PPS at Startup and after long outage
|
||||
#####################################
|
||||
IGNORE_PPS_PULSE_COUNT = 1
|
||||
|
||||
#####################################
|
||||
# Long GNSS RF outage in seconds
|
||||
#####################################
|
||||
GNSS_OUTAGE_DURATION = 10
|
||||
|
||||
#####################################
|
||||
# AP Clock Accuracy
|
||||
#####################################
|
||||
# Quality of APPS processor clock (in PPM).
|
||||
# Value specified is used for calculation of
|
||||
# APPS time stamp uncertainty
|
||||
AP_CLOCK_PPM = 100
|
||||
|
||||
#####################################
|
||||
# MAX ms difference to detect missing pulse
|
||||
#####################################
|
||||
# Specifies time threshold in ms to validate any missing PPS pulses
|
||||
MISSING_PULSE_TIME_DELTA = 900
|
||||
|
||||
#####################################
|
||||
# Propagation time uncertainty
|
||||
#####################################
|
||||
# This settings enables time uncertainty propagation
|
||||
# logic incase of missing PPS pulse
|
||||
PROPAGATION_TIME_UNCERTAINTY = 1
|
||||
|
||||
#######################################
|
||||
# APN / IP Type Configuration
|
||||
# APN and IP Type to use for setting
|
||||
# up WWAN call.
|
||||
# Use below values for IP Type:
|
||||
# v4 = 4
|
||||
# v6 = 6
|
||||
# v4v6 = 10
|
||||
#######################################
|
||||
# INTERNET_APN = abc.xyz
|
||||
# INTERNET_IP_TYPE = 4
|
||||
# SUPL_APN = abc.xyz
|
||||
# SUPL_IP_TYPE = 4
|
||||
|
||||
#####################################
|
||||
# Modem type
|
||||
#####################################
|
||||
# This setting configures modem type
|
||||
# (external=0 or internal=1)
|
||||
# comment out the next line to vote
|
||||
# for the first modem in the list
|
||||
MODEM_TYPE = 0
|
||||
|
||||
##################################################
|
||||
# CONSTRAINED TIME UNCERTAINTY MODE
|
||||
##################################################
|
||||
# 0 : disabled (default)
|
||||
# 1 : enabled
|
||||
# This setting enables GPS engine to keep its time
|
||||
# uncertainty below the specified constraint
|
||||
#CONSTRAINED_TIME_UNCERTAINTY_ENABLED = 0
|
||||
|
||||
# If constrained time uncertainty mode is enabled,
|
||||
# this setting specifies the time uncertainty
|
||||
# threshold that gps engine need to maintain.
|
||||
# In unit of milli-seconds.
|
||||
# Default is 0.0 meaning that modem default value
|
||||
# of time uncertainty threshold will be used.
|
||||
#CONSTRAINED_TIME_UNCERTAINTY_THRESHOLD = 0.0
|
||||
|
||||
# If constrained time uncertainty mode is enabled,
|
||||
# this setting specifies the power budget that
|
||||
# gps engine is allowed to spend to maintain the time
|
||||
# uncertainty.
|
||||
# Default is 0 meaning that GPS engine is not constained
|
||||
# by power budget and can spend as much power as needed.
|
||||
# In unit of 0.1 milli watt second.
|
||||
#CONSTRAINED_TIME_UNCERTAINTY_ENERGY_BUDGET = 0
|
||||
|
||||
##################################################
|
||||
# POSITION ASSISTED CLOCK ESTIMATOR
|
||||
##################################################
|
||||
# 0 : disabled (default)
|
||||
# 1 : enabled
|
||||
# This setting enables GPS engine to estimate clock
|
||||
# bias and drift when the signal from at least 1
|
||||
# SV is available and the UE’s position is known by
|
||||
# other position engines.
|
||||
#POSITION_ASSISTED_CLOCK_ESTIMATOR_ENABLED = 0
|
||||
|
||||
#####################################
|
||||
# proxyAppPackageName
|
||||
#####################################
|
||||
# This is a string that is sent to the framework
|
||||
# in nfwNotifyCb callback
|
||||
PROXY_APP_PACKAGE_NAME = com.google.android.carrierlocation
|
||||
|
||||
#####################################
|
||||
# CP_MTLR_ES
|
||||
#####################################
|
||||
# CP MTLR ES, 1=enable, 0=disable
|
||||
CP_MTLR_ES=1
|
||||
46
gpt-utils/Android.mk
Normal file
46
gpt-utils/Android.mk
Normal file
@@ -0,0 +1,46 @@
|
||||
#
|
||||
# Copyright 2016 The Android Open Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_SRC_FILES := gpt-utils.cpp
|
||||
ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true)
|
||||
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
|
||||
endif
|
||||
LOCAL_SHARED_LIBRARIES := liblog libz
|
||||
LOCAL_MODULE := libgptutils
|
||||
LOCAL_MODULE_OWNER := qti
|
||||
include $(BUILD_STATIC_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_SRC_FILES := gpt-utils.cpp
|
||||
ifeq ($(TARGET_COMPILE_WITH_MSM_KERNEL),true)
|
||||
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES := $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
|
||||
endif
|
||||
LOCAL_SHARED_LIBRARIES += liblog libcutils libz
|
||||
LOCAL_EXPORT_HEADER_LIBRARY_HEADERS := libgptutils_headers
|
||||
LOCAL_MODULE := libgptutils
|
||||
LOCAL_MODULE_OWNER := qti
|
||||
LOCAL_PROPRIETARY_MODULE := true
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := libgptutils_headers
|
||||
LOCAL_EXPORT_C_INCLUDE_DIRS:=$(LOCAL_PATH)
|
||||
include $(BUILD_HEADER_LIBRARY)
|
||||
1542
gpt-utils/gpt-utils.cpp
Normal file
1542
gpt-utils/gpt-utils.cpp
Normal file
File diff suppressed because it is too large
Load Diff
196
gpt-utils/gpt-utils.h
Normal file
196
gpt-utils/gpt-utils.h
Normal file
@@ -0,0 +1,196 @@
|
||||
/*
|
||||
* Copyright (c) 2013, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions are
|
||||
* met:
|
||||
* * Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* * Redistributions in binary form must reproduce the above
|
||||
* copyright notice, this list of conditions and the following
|
||||
* disclaimer in the documentation and/or other materials provided
|
||||
* with the distribution.
|
||||
* * Neither the name of The Linux Foundation nor the names of its
|
||||
* contributors may be used to endorse or promote products derived
|
||||
* from this software without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
* WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
* OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
* IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
*/
|
||||
|
||||
#ifndef __GPT_UTILS_H__
|
||||
#define __GPT_UTILS_H__
|
||||
#include <vector>
|
||||
#include <string>
|
||||
#include <map>
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
#include <unistd.h>
|
||||
#include <stdlib.h>
|
||||
/******************************************************************************
|
||||
* GPT HEADER DEFINES
|
||||
******************************************************************************/
|
||||
#define GPT_SIGNATURE "EFI PART"
|
||||
#define HEADER_SIZE_OFFSET 12
|
||||
#define HEADER_CRC_OFFSET 16
|
||||
#define PRIMARY_HEADER_OFFSET 24
|
||||
#define BACKUP_HEADER_OFFSET 32
|
||||
#define FIRST_USABLE_LBA_OFFSET 40
|
||||
#define LAST_USABLE_LBA_OFFSET 48
|
||||
#define PENTRIES_OFFSET 72
|
||||
#define PARTITION_COUNT_OFFSET 80
|
||||
#define PENTRY_SIZE_OFFSET 84
|
||||
#define PARTITION_CRC_OFFSET 88
|
||||
|
||||
#define TYPE_GUID_OFFSET 0
|
||||
#define TYPE_GUID_SIZE 16
|
||||
#define PTN_ENTRY_SIZE 128
|
||||
#define UNIQUE_GUID_OFFSET 16
|
||||
#define FIRST_LBA_OFFSET 32
|
||||
#define LAST_LBA_OFFSET 40
|
||||
#define ATTRIBUTE_FLAG_OFFSET 48
|
||||
#define PARTITION_NAME_OFFSET 56
|
||||
#define MAX_GPT_NAME_SIZE 72
|
||||
|
||||
/******************************************************************************
|
||||
* AB RELATED DEFINES
|
||||
******************************************************************************/
|
||||
//Bit 48 onwords in the attribute field are the ones where we are allowed to
|
||||
//store our AB attributes.
|
||||
#define AB_FLAG_OFFSET (ATTRIBUTE_FLAG_OFFSET + 6)
|
||||
#define GPT_DISK_INIT_MAGIC 0xABCD
|
||||
#define AB_PARTITION_ATTR_SLOT_ACTIVE (0x1<<2)
|
||||
#define AB_PARTITION_ATTR_BOOT_SUCCESSFUL (0x1<<6)
|
||||
#define AB_PARTITION_ATTR_UNBOOTABLE (0x1<<7)
|
||||
#define AB_SLOT_ACTIVE_VAL 0x3F
|
||||
#define AB_SLOT_INACTIVE_VAL 0x0
|
||||
#define AB_SLOT_ACTIVE 1
|
||||
#define AB_SLOT_INACTIVE 0
|
||||
#define AB_SLOT_A_SUFFIX "_a"
|
||||
#define AB_SLOT_B_SUFFIX "_b"
|
||||
#define PTN_XBL "xbl"
|
||||
#define PTN_SWAP_LIST PTN_XBL, \
|
||||
"abl", "aop", "devcfg", \
|
||||
"dtbo", "hyp", "keymaster", "qupfw", "storsec", \
|
||||
"tz", "vbmeta", "vbmeta_system", "xbl_config"
|
||||
|
||||
#define AB_PTN_LIST PTN_SWAP_LIST, "boot", "system", "vendor", "modem", "product"
|
||||
#define BOOT_DEV_DIR "/dev/block/bootdevice/by-name"
|
||||
|
||||
/******************************************************************************
|
||||
* HELPER MACROS
|
||||
******************************************************************************/
|
||||
#define ARRAY_SIZE(x) (sizeof(x) / sizeof((x)[0]))
|
||||
/******************************************************************************
|
||||
* TYPES
|
||||
******************************************************************************/
|
||||
enum boot_update_stage {
|
||||
UPDATE_MAIN = 1,
|
||||
UPDATE_BACKUP,
|
||||
UPDATE_FINALIZE
|
||||
};
|
||||
|
||||
enum gpt_instance {
|
||||
PRIMARY_GPT = 0,
|
||||
SECONDARY_GPT
|
||||
};
|
||||
|
||||
enum boot_chain {
|
||||
NORMAL_BOOT = 0,
|
||||
BACKUP_BOOT
|
||||
};
|
||||
|
||||
struct gpt_disk {
|
||||
//GPT primary header
|
||||
uint8_t *hdr;
|
||||
//primary header crc
|
||||
uint32_t hdr_crc;
|
||||
//GPT backup header
|
||||
uint8_t *hdr_bak;
|
||||
//backup header crc
|
||||
uint32_t hdr_bak_crc;
|
||||
//Partition entries array
|
||||
uint8_t *pentry_arr;
|
||||
//Partition entries array for backup table
|
||||
uint8_t *pentry_arr_bak;
|
||||
//Size of the pentry array
|
||||
uint32_t pentry_arr_size;
|
||||
//Size of each element in the pentry array
|
||||
uint32_t pentry_size;
|
||||
//CRC of the partition entry array
|
||||
uint32_t pentry_arr_crc;
|
||||
//CRC of the backup partition entry array
|
||||
uint32_t pentry_arr_bak_crc;
|
||||
//Path to block dev representing the disk
|
||||
char devpath[PATH_MAX];
|
||||
//Block size of disk
|
||||
uint32_t block_size;
|
||||
uint32_t is_initialized;
|
||||
};
|
||||
|
||||
/******************************************************************************
|
||||
* FUNCTION PROTOTYPES
|
||||
******************************************************************************/
|
||||
int prepare_boot_update(enum boot_update_stage stage);
|
||||
//GPT disk methods
|
||||
struct gpt_disk* gpt_disk_alloc();
|
||||
//Free previously allocated gpt_disk struct
|
||||
void gpt_disk_free(struct gpt_disk *disk);
|
||||
//Get the details of the disk holding the partition whose name
|
||||
//is passed in via dev
|
||||
int gpt_disk_get_disk_info(const char *dev, struct gpt_disk *disk);
|
||||
|
||||
//Get pointer to partition entry from a allocated gpt_disk structure
|
||||
uint8_t* gpt_disk_get_pentry(struct gpt_disk *disk,
|
||||
const char *partname,
|
||||
enum gpt_instance instance);
|
||||
|
||||
//Update the crc fields of the modified disk structure
|
||||
int gpt_disk_update_crc(struct gpt_disk *disk);
|
||||
|
||||
//Write the contents of struct gpt_disk back to the actual disk
|
||||
int gpt_disk_commit(struct gpt_disk *disk);
|
||||
|
||||
//Return if the current device is UFS based or not
|
||||
int gpt_utils_is_ufs_device();
|
||||
|
||||
//Swtich betwieen using either the primary or the backup
|
||||
//boot LUN for boot. This is required since UFS boot partitions
|
||||
//cannot have a backup GPT which is what we use for failsafe
|
||||
//updates of the other 'critical' partitions. This function will
|
||||
//not be invoked for emmc targets and on UFS targets is only required
|
||||
//to be invoked for XBL.
|
||||
//
|
||||
//The algorithm to do this is as follows:
|
||||
//- Find the real block device(eg: /dev/block/sdb) that corresponds
|
||||
// to the /dev/block/bootdevice/by-name/xbl(bak) symlink
|
||||
//
|
||||
//- Once we have the block device 'node' name(sdb in the above example)
|
||||
// use this node to to locate the scsi generic device that represents
|
||||
// it by checking the file /sys/block/sdb/device/scsi_generic/sgY
|
||||
//
|
||||
//- Once we locate sgY we call the query ioctl on /dev/sgy to switch
|
||||
//the boot lun to either LUNA or LUNB
|
||||
int gpt_utils_set_xbl_boot_partition(enum boot_chain chain);
|
||||
|
||||
//Given a vector of partition names as a input and a reference to a map,
|
||||
//populate the map to indicate which physical disk each of the partitions
|
||||
//sits on. The key in the map is the path to the block device where the
|
||||
//partition lies and the value is a vector of strings indicating which of
|
||||
//the passed in partition names sits on that device.
|
||||
int gpt_utils_get_partition_map(std::vector<std::string>& partition_list,
|
||||
std::map<std::string,std::vector<std::string>>& partition_map);
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
#endif /* __GPT_UTILS_H__ */
|
||||
54
health/Android.bp
Normal file
54
health/Android.bp
Normal file
@@ -0,0 +1,54 @@
|
||||
/*
|
||||
* Copyright (C) 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
cc_binary {
|
||||
name: "android.hardware.health@2.0-service.redfin",
|
||||
init_rc: ["android.hardware.health@2.0-service.redfin.rc"],
|
||||
proprietary: true,
|
||||
relative_install_path: "hw",
|
||||
srcs: [
|
||||
"HealthService.cpp",
|
||||
],
|
||||
|
||||
cflags: [
|
||||
"-Wall",
|
||||
"-Werror",
|
||||
],
|
||||
|
||||
static_libs: [
|
||||
"android.hardware.health@2.0-impl",
|
||||
"android.hardware.health@1.0-convert",
|
||||
"libhealthservice",
|
||||
"libbatterymonitor",
|
||||
],
|
||||
|
||||
shared_libs: [
|
||||
"libbase",
|
||||
"libcutils",
|
||||
"libhidlbase",
|
||||
"libhidltransport",
|
||||
"libhwbinder",
|
||||
"libpixelhealth",
|
||||
"libutils",
|
||||
"android.hardware.health@2.0",
|
||||
],
|
||||
|
||||
header_libs: ["libhealthd_headers"],
|
||||
|
||||
overrides: [
|
||||
"healthd",
|
||||
],
|
||||
}
|
||||
139
health/HealthService.cpp
Normal file
139
health/HealthService.cpp
Normal file
@@ -0,0 +1,139 @@
|
||||
/*
|
||||
* Copyright (C) 2018 The Android Open Source Project
|
||||
*
|
||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
||||
* you may not use this file except in compliance with the License.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
#define LOG_TAG "android.hardware.health@2.0-service.redfin"
|
||||
#include <android-base/logging.h>
|
||||
|
||||
#include <android-base/file.h>
|
||||
#include <android-base/parseint.h>
|
||||
#include <android-base/strings.h>
|
||||
#include <health2/Health.h>
|
||||
#include <health2/service.h>
|
||||
#include <healthd/healthd.h>
|
||||
#include <hidl/HidlTransportSupport.h>
|
||||
#include <pixelhealth/BatteryMetricsLogger.h>
|
||||
#include <pixelhealth/CycleCountBackupRestore.h>
|
||||
#include <pixelhealth/DeviceHealth.h>
|
||||
#include <pixelhealth/LowBatteryShutdownMetrics.h>
|
||||
|
||||
#include <fstream>
|
||||
#include <iomanip>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
|
||||
namespace {
|
||||
|
||||
using android::hardware::health::V2_0::DiskStats;
|
||||
using android::hardware::health::V2_0::StorageAttribute;
|
||||
using android::hardware::health::V2_0::StorageInfo;
|
||||
using hardware::google::pixel::health::BatteryMetricsLogger;
|
||||
using hardware::google::pixel::health::CycleCountBackupRestore;
|
||||
using hardware::google::pixel::health::DeviceHealth;
|
||||
using hardware::google::pixel::health::LowBatteryShutdownMetrics;
|
||||
|
||||
#define FG_DIR "/sys/class/power_supply/maxfg"
|
||||
constexpr char kBatteryResistance[] {FG_DIR "/resistance"};
|
||||
constexpr char kBatteryOCV[] {FG_DIR "/voltage_ocv"};
|
||||
constexpr char kVoltageAvg[] {FG_DIR "/voltage_avg"};
|
||||
constexpr char kCycleCountsBins[] {FG_DIR "/cycle_counts_bins"};
|
||||
constexpr char kGaugeSerial[] {FG_DIR "/serial_number"};
|
||||
|
||||
static BatteryMetricsLogger battMetricsLogger(kBatteryResistance, kBatteryOCV);
|
||||
static LowBatteryShutdownMetrics shutdownMetrics(kVoltageAvg);
|
||||
static CycleCountBackupRestore ccBackupRestoreMAX(
|
||||
10, kCycleCountsBins, "/persist/battery/max_cycle_counts_bins", kGaugeSerial);
|
||||
static DeviceHealth deviceHealth;
|
||||
|
||||
#define UFS_DIR "/sys/devices/platform/soc/1d84000.ufshc"
|
||||
constexpr char kUfsHealthEol[]{UFS_DIR "/health/eol"};
|
||||
constexpr char kUfsHealthLifetimeA[]{UFS_DIR "/health/lifetimeA"};
|
||||
constexpr char kUfsHealthLifetimeB[]{UFS_DIR "/health/lifetimeB"};
|
||||
constexpr char kUfsVersion[]{UFS_DIR "/version"};
|
||||
constexpr char kDiskStatsFile[]{"/sys/block/sda/stat"};
|
||||
constexpr char kUFSName[]{"UFS0"};
|
||||
|
||||
constexpr char kTCPMPSYName[]{"tcpm-source-psy-usbpd0"};
|
||||
|
||||
std::ifstream assert_open(const std::string &path) {
|
||||
std::ifstream stream(path);
|
||||
if (!stream.is_open()) {
|
||||
LOG(FATAL) << "Cannot read " << path;
|
||||
}
|
||||
return stream;
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
void read_value_from_file(const std::string &path, T *field) {
|
||||
auto stream = assert_open(path);
|
||||
stream.unsetf(std::ios_base::basefield);
|
||||
stream >> *field;
|
||||
}
|
||||
|
||||
void read_ufs_version(StorageInfo *info) {
|
||||
uint64_t value;
|
||||
read_value_from_file(kUfsVersion, &value);
|
||||
std::stringstream ss;
|
||||
ss << "ufs " << std::hex << value;
|
||||
info->version = ss.str();
|
||||
}
|
||||
|
||||
void fill_ufs_storage_attribute(StorageAttribute *attr) {
|
||||
attr->isInternal = true;
|
||||
attr->isBootDevice = true;
|
||||
attr->name = kUFSName;
|
||||
}
|
||||
|
||||
} // anonymous namespace
|
||||
|
||||
void healthd_board_init(struct healthd_config *hc) {
|
||||
hc->ignorePowerSupplyNames.push_back(android::String8(kTCPMPSYName));
|
||||
ccBackupRestoreMAX.Restore();
|
||||
}
|
||||
|
||||
int healthd_board_battery_update(struct android::BatteryProperties *props) {
|
||||
deviceHealth.update(props);
|
||||
battMetricsLogger.logBatteryProperties(props);
|
||||
shutdownMetrics.logShutdownVoltage(props);
|
||||
ccBackupRestoreMAX.Backup(props->batteryLevel);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void get_storage_info(std::vector<StorageInfo> &vec_storage_info) {
|
||||
vec_storage_info.resize(1);
|
||||
StorageInfo *storage_info = &vec_storage_info[0];
|
||||
fill_ufs_storage_attribute(&storage_info->attr);
|
||||
|
||||
read_ufs_version(storage_info);
|
||||
read_value_from_file(kUfsHealthEol, &storage_info->eol);
|
||||
read_value_from_file(kUfsHealthLifetimeA, &storage_info->lifetimeA);
|
||||
read_value_from_file(kUfsHealthLifetimeB, &storage_info->lifetimeB);
|
||||
return;
|
||||
}
|
||||
|
||||
void get_disk_stats(std::vector<DiskStats> &vec_stats) {
|
||||
vec_stats.resize(1);
|
||||
DiskStats *stats = &vec_stats[0];
|
||||
fill_ufs_storage_attribute(&stats->attr);
|
||||
|
||||
auto stream = assert_open(kDiskStatsFile);
|
||||
// Regular diskstats entries
|
||||
stream >> stats->reads >> stats->readMerges >> stats->readSectors >>
|
||||
stats->readTicks >> stats->writes >> stats->writeMerges >>
|
||||
stats->writeSectors >> stats->writeTicks >> stats->ioInFlight >>
|
||||
stats->ioTicks >> stats->ioInQueue;
|
||||
return;
|
||||
}
|
||||
|
||||
int main(void) { return health_service_main(); }
|
||||
5
health/android.hardware.health@2.0-service.redfin.rc
Normal file
5
health/android.hardware.health@2.0-service.redfin.rc
Normal file
@@ -0,0 +1,5 @@
|
||||
service vendor.health-hal-2-0 /vendor/bin/hw/android.hardware.health@2.0-service.redfin
|
||||
class hal
|
||||
user system
|
||||
group system
|
||||
file /dev/kmsg w
|
||||
BIN
hidl/android.hidl.base@1.0.so-32
Executable file
BIN
hidl/android.hidl.base@1.0.so-32
Executable file
Binary file not shown.
BIN
hidl/android.hidl.base@1.0.so-64
Executable file
BIN
hidl/android.hidl.base@1.0.so-64
Executable file
Binary file not shown.
26
init.hardware.chamber.rc.userdebug
Normal file
26
init.hardware.chamber.rc.userdebug
Normal file
@@ -0,0 +1,26 @@
|
||||
#
|
||||
# Copyright (C) 2018 The Android Open-Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
on property:init.svc.vendor.thermal-engine=running && property:persist.vendor.disable.thermal.control=1
|
||||
stop vendor.thermal-engine
|
||||
|
||||
on property:persist.vendor.disable.thermal.control=1
|
||||
write /sys/devices/virtual/thermal/tz-by-name/sdm-therm/emul_temp 25000
|
||||
write /sys/devices/virtual/thermal/tz-by-name/usbc-therm/emul_temp 25000
|
||||
write /sys/module/overheat_mitigation/parameters/enable 0
|
||||
|
||||
on property:persist.vendor.disable.usb.overheat.mitigation=1
|
||||
write /sys/devices/virtual/thermal/tz-by-name/usbc-therm/emul_temp 25000
|
||||
19
init.hardware.diag.rc.user
Normal file
19
init.hardware.diag.rc.user
Normal file
@@ -0,0 +1,19 @@
|
||||
#
|
||||
# Copyright (C) 2018 The Android Open-Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
on property:ro.boot.mode=normal
|
||||
rm /dev/diag
|
||||
rm /dev/diagtest
|
||||
110
init.hardware.diag.rc.userdebug
Normal file
110
init.hardware.diag.rc.userdebug
Normal file
@@ -0,0 +1,110 @@
|
||||
#
|
||||
# Copyright (C) 2018 The Android Open-Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
on init
|
||||
chmod 666 /dev/diag
|
||||
|
||||
on post-fs-data
|
||||
# Modem logging collection
|
||||
mkdir /data/vendor/radio 0777 radio radio
|
||||
mkdir /data/vendor/radio/diag_logs 0777 system system
|
||||
rm /data/vendor/radio/diag_logs/logs/diag_poweron_log.qmdl
|
||||
# WLAN logging collection
|
||||
mkdir /data/vendor/wifi 0777 system system
|
||||
mkdir /data/vendor/wifi/cnss_diag 0777 system system
|
||||
|
||||
service diag_mdlog_start /vendor/bin/diag_mdlog
|
||||
class late_start
|
||||
user shell
|
||||
group system diag media_rw
|
||||
disabled
|
||||
oneshot
|
||||
|
||||
service diag_mdlog_stop /vendor/bin/diag_mdlog -k
|
||||
class late_start
|
||||
user shell
|
||||
group system diag media_rw
|
||||
disabled
|
||||
oneshot
|
||||
|
||||
on boot && property:persist.vendor.sys.modem.diag.mdlog=*
|
||||
rm /data/vendor/radio/diag_logs/diag_mdlog_pid
|
||||
setprop vendor.sys.modem.diag.mdlog ${persist.vendor.sys.modem.diag.mdlog}
|
||||
|
||||
on property:vendor.sys.modem.diag.mdlog=true
|
||||
start diag_mdlog_start
|
||||
|
||||
on property:vendor.sys.modem.diag.mdlog=false
|
||||
start diag_mdlog_stop
|
||||
|
||||
on property:persist.vendor.sys.cnss.diag_qxdm=true
|
||||
start vendor.cnss_diag
|
||||
|
||||
on property:persist.vendor.sys.cnss.diag_qxdm=false
|
||||
stop vendor.cnss_diag
|
||||
|
||||
on property:persist.vendor.sys.cnss.diag_txt=true
|
||||
start vendor.cnss_diag_txt
|
||||
|
||||
on property:persist.vendor.sys.cnss.diag_txt=false
|
||||
stop vendor.cnss_diag_txt
|
||||
|
||||
service vendor.cnss_diag /vendor/bin/cnss_diag -q -u -w
|
||||
class late_start
|
||||
user system
|
||||
group system
|
||||
disabled
|
||||
oneshot
|
||||
|
||||
service vendor.cnss_diag_txt /vendor/bin/cnss_diag -s -f -P -m /data/vendor/wifi/cnss_diag/cnss_diag.conf -t HELIUM
|
||||
class late_start
|
||||
user system
|
||||
group system
|
||||
disabled
|
||||
oneshot
|
||||
|
||||
on property:vendor.debug.ramdump.force_crash=true
|
||||
write /proc/sysrq-trigger "c"
|
||||
|
||||
on property:ro.vendor.bluetooth.ftm_enabled=true
|
||||
start ftmd
|
||||
|
||||
service ftmd /vendor/bin/ftmdaemon
|
||||
class late_start
|
||||
user root
|
||||
group bluetooth net_bt_admin misc diag net_bt
|
||||
disabled
|
||||
oneshot
|
||||
|
||||
on property:vendor.sys.logger.bluetooth=true
|
||||
setprop persist.vendor.service.bdroid.snooplog true
|
||||
setprop persist.vendor.service.bdroid.fwsnoop true
|
||||
|
||||
on property:vendor.sys.logger.bluetooth=false
|
||||
setprop persist.vendor.service.bdroid.snooplog false
|
||||
setprop persist.vendor.service.bdroid.fwsnoop false
|
||||
|
||||
on property:persist.bluetooth.btsnoopenable=true
|
||||
setprop persist.vendor.service.bdroid.soclog true
|
||||
|
||||
on property:persist.bluetooth.btsnoopenable=false
|
||||
setprop persist.vendor.service.bdroid.soclog false
|
||||
|
||||
on property:vendor.usb.config=*
|
||||
start usbd
|
||||
|
||||
on property:persist.vendor.usb.usbradio.config=*
|
||||
start usbd
|
||||
19
init.hardware.ipa.rc.userdebug
Normal file
19
init.hardware.ipa.rc.userdebug
Normal file
@@ -0,0 +1,19 @@
|
||||
#
|
||||
# Copyright (C) 2018 The Android Open-Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
on boot
|
||||
# Enable RmNet IPA3 TX timeout detection
|
||||
write /d/ipawwan/debug 1
|
||||
5
init.hardware.mpssrfs.rc.user
Normal file
5
init.hardware.mpssrfs.rc.user
Normal file
@@ -0,0 +1,5 @@
|
||||
on post-fs-data
|
||||
# Modem Remote FS
|
||||
mkdir /data/vendor/rfs 0770 vendor_rfs vendor_rfs
|
||||
mkdir /data/vendor/rfs/mpss 0770 vendor_rfs vendor_rfs
|
||||
mkdir /data/vendor/tombstones/rfs 0770 vendor_rfs vendor_rfs
|
||||
11
init.hardware.mpssrfs.rc.userdebug
Normal file
11
init.hardware.mpssrfs.rc.userdebug
Normal file
@@ -0,0 +1,11 @@
|
||||
on post-fs-data
|
||||
# Modem Remote FS
|
||||
mkdir /data/vendor/rfs 0770 vendor_rfs vendor_rfs
|
||||
mkdir /data/vendor/rfs/mpss 0770 vendor_rfs vendor_rfs
|
||||
mkdir /data/vendor/tombstones/rfs 0770 vendor_rfs vendor_rfs
|
||||
write /data/vendor/rfs/mpss/mcfg_nv_list_flag "1"
|
||||
chown vendor_rfs vendor_rfs /data/vendor/rfs/mpss/mcfg_nv_list_flag
|
||||
chmod 0700 /data/vendor/rfs/mpss/mcfg_nv_list_flag
|
||||
|
||||
on property:vendor.sys.modem.diag.efsdump=true
|
||||
chmod 0660 /data/vendor/rfs/mpss/modem_efs
|
||||
755
init.hardware.rc
Normal file
755
init.hardware.rc
Normal file
@@ -0,0 +1,755 @@
|
||||
#
|
||||
# Copyright (C) 2018 The Android Open-Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
import /vendor/etc/init/hw/init.${ro.boot.hardware.platform}.usb.rc
|
||||
import /vendor/etc/init/hw/init.${ro.boot.hardware.platform}.diag.rc
|
||||
import /vendor/etc/init/hw/init.${ro.boot.hardware.platform}.logging.rc
|
||||
import /vendor/etc/init/hw/init.${ro.boot.hardware.platform}.mpssrfs.rc
|
||||
import /vendor/etc/init/hw/init.${ro.boot.hardware.platform}.power.rc
|
||||
|
||||
service vendor.charger /charger
|
||||
class charger
|
||||
seclabel u:r:charger:s0
|
||||
|
||||
on early-init
|
||||
mount debugfs debugfs /sys/kernel/debug
|
||||
chmod 0755 /sys/kernel/debug
|
||||
|
||||
# Disable EAS
|
||||
write /sys/kernel/debug/sched_features NO_ENERGY_AWARE
|
||||
mount_all /vendor/etc/fstab.persist --early
|
||||
|
||||
# Disable VDSO on JAWS boards.
|
||||
on early-init && property:ro.revision="DEV1.0"
|
||||
write /sys/module/vdso/parameters/enable_32 0
|
||||
|
||||
# Skip init trigger for charger mode
|
||||
on early-init && property:ro.boot.mode=charger
|
||||
setprop vendor.skip.init 1
|
||||
|
||||
# We need vold early for metadata encryption
|
||||
on early-fs
|
||||
start vold
|
||||
|
||||
on init && property:vendor.skip.init=0
|
||||
# Disable UFS powersaving
|
||||
write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkgate_enable 0
|
||||
write /sys/devices/platform/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 0
|
||||
|
||||
# Disable powersaving
|
||||
write /sys/module/lpm_levels/parameters/sleep_disabled 1
|
||||
|
||||
wait /dev/block/platform/soc/${ro.boot.bootdevice}
|
||||
symlink /dev/block/platform/soc/${ro.boot.bootdevice} /dev/block/bootdevice
|
||||
|
||||
# start qseecomd early as we mount system/ vendor/ early
|
||||
# vold needs keymaster that needs qseecomd
|
||||
start vendor.qseecomd
|
||||
start keymaster-4-0
|
||||
|
||||
start vendor.citadeld
|
||||
start vendor.keymaster-4-0-citadel
|
||||
|
||||
# Support legacy paths
|
||||
symlink /sdcard /mnt/sdcard
|
||||
symlink /sdcard /storage/sdcard0
|
||||
|
||||
# Loading kernel modules in background
|
||||
start insmod_sh
|
||||
|
||||
# bring back all cores
|
||||
write /sys/devices/system/cpu/cpu0/online 1
|
||||
write /sys/devices/system/cpu/cpu1/online 1
|
||||
write /sys/devices/system/cpu/cpu2/online 1
|
||||
write /sys/devices/system/cpu/cpu3/online 1
|
||||
write /sys/devices/system/cpu/cpu4/online 1
|
||||
write /sys/devices/system/cpu/cpu5/online 1
|
||||
write /sys/devices/system/cpu/cpu6/online 1
|
||||
write /sys/devices/system/cpu/cpu7/online 1
|
||||
|
||||
# configure governor settings for little cluster
|
||||
write /sys/devices/system/cpu/cpu0/cpufreq/scaling_governor schedutil
|
||||
write /sys/devices/system/cpu/cpu0/cpufreq/schedutil/up_rate_limit_us 500
|
||||
write /sys/devices/system/cpu/cpu0/cpufreq/schedutil/down_rate_limit_us 20000
|
||||
|
||||
# configure governor settings for big cluster
|
||||
write /sys/devices/system/cpu/cpu4/cpufreq/scaling_governor schedutil
|
||||
write /sys/devices/system/cpu/cpu4/cpufreq/schedutil/up_rate_limit_us 500
|
||||
write /sys/devices/system/cpu/cpu4/cpufreq/schedutil/down_rate_limit_us 20000
|
||||
|
||||
# configure governor settings for big big CPU
|
||||
write /sys/devices/system/cpu/cpu7/cpufreq/scaling_governor schedutil
|
||||
write /sys/devices/system/cpu/cpu7/cpufreq/schedutil/up_rate_limit_us 500
|
||||
write /sys/devices/system/cpu/cpu7/cpufreq/schedutil/down_rate_limit_us 20000
|
||||
|
||||
# ZRAM setup
|
||||
write /sys/block/zram0/comp_algorithm lz4
|
||||
write /proc/sys/vm/page-cluster 0
|
||||
|
||||
# Some user code relies on ro.boot.hardware.revision
|
||||
setprop ro.boot.hardware.revision ${ro.revision}
|
||||
|
||||
# set default schedTune value for foreground/top-app
|
||||
write /dev/stune/foreground/schedtune.prefer_idle 1
|
||||
write /dev/stune/top-app/schedtune.boost 10
|
||||
write /dev/stune/top-app/schedtune.prefer_idle 1
|
||||
|
||||
mkdir /dev/cpuset/camera-daemon
|
||||
write /dev/cpuset/camera-daemon/cpus 0-7
|
||||
write /dev/cpuset/camera-daemon/mems 0
|
||||
chown system system /dev/cpuset/camera-daemon
|
||||
chown system system /dev/cpuset/camera-daemon/tasks
|
||||
chmod 0664 /dev/cpuset/camera-daemon/tasks
|
||||
|
||||
# Enable suspend clock reporting
|
||||
write /sys/kernel/debug/clk/debug_suspend 1
|
||||
|
||||
on late-init
|
||||
setprop vendor.thermal.config thermal_info_config.json
|
||||
|
||||
on fs
|
||||
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --early
|
||||
|
||||
mkdir /mnt/vendor/persist/audio 0770 media audio
|
||||
mkdir /mnt/vendor/persist/data 0700 system system
|
||||
mkdir /mnt/vendor/persist/display 0770 system graphics
|
||||
mkdir /mnt/vendor/persist/haptics 0770 system system
|
||||
mkdir /mnt/vendor/persist/rfs 0770 root system
|
||||
mkdir /mnt/vendor/persist/hlos_rfs 0770 root system
|
||||
mkdir /mnt/vendor/persist/oslo 0770 system system
|
||||
mkdir /mnt/vendor/persist/touch 0770 system system
|
||||
chmod 0770 /mnt/vendor/persist/rfs
|
||||
chmod 0770 /mnt/vendor/persist/rfs/shared
|
||||
chmod 0770 /mnt/vendor/persist/rfs/msm
|
||||
chmod 0770 /mnt/vendor/persist/rfs/msm/adsp
|
||||
chmod 0770 /mnt/vendor/persist/rfs/msm/mpss
|
||||
chmod 0770 /mnt/vendor/persist/rfs/msm/slpi
|
||||
chmod 0770 /mnt/vendor/persist/rfs/mdm
|
||||
chmod 0770 /mnt/vendor/persist/rfs/mdm/adsp
|
||||
chmod 0770 /mnt/vendor/persist/rfs/mdm/mpss
|
||||
chmod 0770 /mnt/vendor/persist/rfs/mdm/slpi
|
||||
chmod 0770 /mnt/vendor/persist/rfs/mdm/tn
|
||||
chmod 0770 /mnt/vendor/persist/rfs/apq
|
||||
chmod 0770 /mnt/vendor/persist/rfs/apq/gnss
|
||||
chmod 0770 /mnt/vendor/persist/hlos_rfs
|
||||
|
||||
# for cycle count backup
|
||||
mkdir /mnt/vendor/persist/battery 0700 system system
|
||||
|
||||
restorecon_recursive /mnt/vendor/persist
|
||||
|
||||
on post-fs
|
||||
# set RLIMIT_MEMLOCK to 64MB
|
||||
setrlimit 8 67108864 67108864
|
||||
|
||||
# Wait qseecomd started
|
||||
wait_for_prop vendor.sys.listeners.registered true
|
||||
|
||||
# load IPA FWs
|
||||
# This must be started when vendor.sys.listeners.registered is true
|
||||
write /dev/ipa 1
|
||||
|
||||
on late-fs
|
||||
# Start services for bootanim
|
||||
start color_init
|
||||
wait_for_prop vendor.display.native_display_primaries_ready 1
|
||||
setprop ro.surface_flinger.display_primary_red ${vendor.display.primary_red}
|
||||
setprop ro.surface_flinger.display_primary_green ${vendor.display.primary_green}
|
||||
setprop ro.surface_flinger.display_primary_blue ${vendor.display.primary_blue}
|
||||
setprop ro.surface_flinger.display_primary_white ${vendor.display.primary_white}
|
||||
start surfaceflinger
|
||||
start bootanim
|
||||
start vendor.hwcomposer-2-3
|
||||
start vendor.configstore-hal
|
||||
start vendor.qti.hardware.display.allocator
|
||||
|
||||
# Wait for keymaster HALs (TEE and StrongBox)
|
||||
exec_start wait_for_strongbox
|
||||
|
||||
|
||||
# Mount RW partitions which need run fsck
|
||||
mount_all /vendor/etc/fstab.${ro.boot.hardware.platform} --late
|
||||
|
||||
# Required for time_daemon
|
||||
mkdir /mnt/vendor/persist/time 0770 system system
|
||||
|
||||
# Start time daemon early so that the system time can be set early
|
||||
start time_daemon
|
||||
|
||||
# Init sensor specific services
|
||||
start init-sensors-sh
|
||||
|
||||
# turn off vblank irq immediately after turning off
|
||||
write /sys/module/drm/parameters/vblankoffdelay -1
|
||||
|
||||
on post-fs-data
|
||||
mkdir /vendor/data/tombstones 0771 system system
|
||||
mkdir /tombstones/modem 0771 system system
|
||||
mkdir /tombstones/lpass 0771 system system
|
||||
mkdir /tombstones/wcnss 0771 system system
|
||||
mkdir /tombstones/dsps 0771 system system
|
||||
mkdir /data/vendor/hbtp 0750 system system
|
||||
mkdir /data/misc/seemp 0700 system system
|
||||
mkdir /data/vendor/tloc 0700 system drmrpc
|
||||
mkdir /data/vendor/nnhal 0700 system system
|
||||
mkdir /data/vendor/time 0770 system system
|
||||
mkdir /data/vendor/modem_fdr 0700 root system
|
||||
mkdir /data/vendor/display 0770 system graphics
|
||||
|
||||
on zygote-start
|
||||
# zygote is started in common init.rc
|
||||
# and now we can continue initialize /data/
|
||||
mkdir /data/vendor/ipa 0770 radio radio
|
||||
chown radio radio /data/vendor/ipa
|
||||
|
||||
# Create the directories used by the Wireless subsystem
|
||||
mkdir /data/vendor/wifi 0771 wifi wifi
|
||||
mkdir /data/vendor/wifi/wpa 0770 wifi wifi
|
||||
mkdir /data/vendor/wifi/wpa/sockets 0770 wifi wifi
|
||||
|
||||
# Create the directories used by CnE subsystem
|
||||
mkdir /data/vendor/connectivity 0771 radio radio
|
||||
chown radio radio /data/vendor/connectivity
|
||||
|
||||
# Create directory for radio
|
||||
mkdir /data/vendor/radio 0773 system radio
|
||||
mkdir /data/vendor/modem_stat 0771 system radio
|
||||
write /data/vendor/modem_stat/debug.txt ""
|
||||
chown system radio /data/vendor/modem_stat/debug.txt
|
||||
chmod 0664 /data/vendor/modem_stat/debug.txt
|
||||
|
||||
# Mark the copy complete flag to not completed
|
||||
write /data/vendor/radio/copy_complete 0
|
||||
chown radio radio /data/vendor/radio/copy_complete
|
||||
chmod 0660 /data/vendor/radio/copy_complete
|
||||
|
||||
# File flags for prebuilt ril db file
|
||||
write /data/vendor/radio/prebuilt_db_support 1
|
||||
chown radio radio /data/vendor/radio/prebuilt_db_support
|
||||
chmod 0400 /data/vendor/radio/prebuilt_db_support
|
||||
write /data/vendor/radio/db_check_done 0
|
||||
chown radio radio /data/vendor/radio/db_check_done
|
||||
chmod 0660 /data/vendor/radio/db_check_done
|
||||
|
||||
# Create directories for Location services
|
||||
mkdir /data/vendor/location 0770 gps gps
|
||||
mkdir /data/vendor/location/mq 0770 gps gps
|
||||
mkdir /data/vendor/location/xtwifi 0770 gps gps
|
||||
mkdir /dev/socket/location 0770 gps gps
|
||||
mkdir /dev/socket/location/mq 0770 gps gps
|
||||
mkdir /dev/socket/location/xtra 0770 gps gps
|
||||
|
||||
on early-boot
|
||||
# Set up sensors-related directories and permissions
|
||||
chmod 775 /mnt/vendor/persist/sensors
|
||||
chmod 664 /mnt/vendor/persist/sensors/sensors_settings
|
||||
chown root system /mnt/vendor/persist/sensors/registry
|
||||
chmod 775 /mnt/vendor/persist/sensors/registry
|
||||
chown root system /mnt/vendor/persist/sensors/registry/registry
|
||||
chmod 775 /mnt/vendor/persist/sensors/registry/registry
|
||||
chmod 664 /mnt/vendor/persist/sensors/registry/registry/sensors_registry
|
||||
chown system root /mnt/vendor/persist/sensors/sensors_settings
|
||||
chown root root /mnt/vendor/persist/sensors/registry/registry/sensors_settings
|
||||
|
||||
mkdir /data/vendor/sensors 0770
|
||||
chown system system /data/vendor/sensors
|
||||
|
||||
chmod 770 /mnt/vendor/persist/audio
|
||||
chmod 660 /mnt/vendor/persist/audio/audio.cal
|
||||
chown media audio /mnt/vendor/persist/audio
|
||||
chown audioserver audio /mnt/vendor/persist/audio/audio.cal
|
||||
|
||||
# Set up haptics-related directories and permissions
|
||||
chmod 770 /mnt/vendor/persist/haptics
|
||||
chmod 440 /mnt/vendor/persist/haptics/cs40l25a.cal
|
||||
chown system system /mnt/vendor/persist/haptics
|
||||
chown system system /mnt/vendor/persist/haptics/cs40l25a.cal
|
||||
|
||||
# Set up oslo-related directories and permissions
|
||||
chmod 770 /mnt/vendor/persist/oslo
|
||||
chmod 660 /mnt/vendor/persist/oslo/oslo.cal
|
||||
chown system system /mnt/vendor/persist/oslo
|
||||
chown system system /mnt/vendor/persist/oslo/oslo.cal
|
||||
|
||||
# Set up touch directories and permissions
|
||||
chmod 770 /mnt/vendor/persist/touch
|
||||
chown system system /mnt/vendor/persist/touch
|
||||
|
||||
# Permission for lights driver
|
||||
chown system system /sys/class/backlight/panel0-backlight/brightness
|
||||
chown system system /sys/class/backlight/panel0-backlight/vr_mode
|
||||
chown system system /sys/class/backlight/panel0-backlight/hbm_mode
|
||||
|
||||
# Wait for insmod_sh to finish all modules
|
||||
wait_for_prop vendor.all.modules.ready 1
|
||||
|
||||
# Update dm-verity state and set partition.*.verified properties
|
||||
verity_update_state
|
||||
|
||||
# Wait for insmod_sh to finish all boot devices
|
||||
wait_for_prop vendor.all.devices.ready 1
|
||||
|
||||
# Permission for Vibrator
|
||||
chown system system /sys/class/leds/vibrator/device/asp_enable
|
||||
chown system system /sys/class/leds/vibrator/device/comp_enable
|
||||
chown system system /sys/class/leds/vibrator/device/cp_dig_scale
|
||||
chown system system /sys/class/leds/vibrator/device/cp_trigger_duration
|
||||
chown system system /sys/class/leds/vibrator/device/cp_trigger_index
|
||||
chown system system /sys/class/leds/vibrator/device/cp_trigger_q_sub
|
||||
chown system system /sys/class/leds/vibrator/device/cp_trigger_queue
|
||||
chown system system /sys/class/leds/vibrator/device/dig_scale
|
||||
chown system system /sys/class/leds/vibrator/device/exc_enable
|
||||
chown system system /sys/class/leds/vibrator/device/f0_stored
|
||||
chown system system /sys/class/leds/vibrator/device/fw_rev
|
||||
chown system system /sys/class/leds/vibrator/device/gpio1_fall_dig_scale
|
||||
chown system system /sys/class/leds/vibrator/device/gpio1_fall_index
|
||||
chown system system /sys/class/leds/vibrator/device/gpio1_rise_dig_scale
|
||||
chown system system /sys/class/leds/vibrator/device/gpio1_rise_index
|
||||
chown system system /sys/class/leds/vibrator/device/heartbeat
|
||||
chown system system /sys/class/leds/vibrator/device/hw_reset
|
||||
chown system system /sys/class/leds/vibrator/device/num_waves
|
||||
chown system system /sys/class/leds/vibrator/device/q_stored
|
||||
chown system system /sys/class/leds/vibrator/device/redc_comp_enable
|
||||
chown system system /sys/class/leds/vibrator/device/redc_stored
|
||||
chown system system /sys/class/leds/vibrator/device/standby_timeout
|
||||
chown system system /sys/class/leds/vibrator/device/vbatt_max
|
||||
chown system system /sys/class/leds/vibrator/device/vbatt_min
|
||||
|
||||
# Permission for Rainbow sensor
|
||||
chown system system /sys/devices/platform/soc/ac4b000.qcom,cci/ac4b000.qcom,cci:st,rainbow@20/rainbow_enable
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,rainbow@20/rainbow_enable
|
||||
chown system system /sys/devices/platform/soc/ac4b000.qcom,cci/ac4b000.qcom,cci:st,rainbow@20/rainbow_read_byte
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,rainbow@20/rainbow_read_byte
|
||||
chown system system /sys/devices/platform/soc/ac4b000.qcom,cci/ac4b000.qcom,cci:st,rainbow@20/rainbow_write_byte
|
||||
chmod 0660 /sys/devices/platform/soc/ac4b000.qcom,cci/ac4b000.qcom,cci:st,rainbow@20/rainbow_write_byte
|
||||
chown system system /dev/vd6281
|
||||
chmod 0660 /dev/vd6281
|
||||
|
||||
# Permission for Athletico
|
||||
chown system system /dev/sensor_tunnel
|
||||
chmod 0660 /dev/sensor_tunnel
|
||||
|
||||
# Permission for Dot and Flood
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_enable
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_enable
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/is_certified
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/is_certified
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_write_byte
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_write_byte
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/is_silego_validated
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/is_silego_validated
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_read_byte
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/led_laser_read_byte
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/itoc_cali_data_store
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-flood@64/itoc_cali_data_store
|
||||
chown system system /dev/lm36011_flood
|
||||
chmod 0660 /dev/lm36011_flood
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_enable
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_enable
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/is_certified
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/is_certified
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_write_byte
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_write_byte
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/is_silego_validated
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/is_silego_validated
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_read_byte
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/led_laser_read_byte
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/itoc_cali_data_store
|
||||
chmod 0660 /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-led-laser-dot@64/itoc_cali_data_store
|
||||
chown system system /dev/lm36011_dot
|
||||
chmod 0660 /dev/lm36011_dot
|
||||
|
||||
# Permission for camera sensor
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-sensor@3/set_strobe_type
|
||||
chmod 0660 sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-sensor@3/set_strobe_type
|
||||
chown system system /sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-sensor@4/set_strobe_type
|
||||
chmod 0660 sys/devices/platform/soc/ac4a000.qcom,cci/ac4a000.qcom,cci:qcom,cam-sensor@4/set_strobe_type
|
||||
|
||||
# FG cycle count read from dumpstate + backup restore from health HAL (and pixelstats)
|
||||
chown system system /sys/class/power_supply/maxfg/cycle_counts_bins
|
||||
|
||||
# Permission for Pixelstats
|
||||
chown system system /sys/class/misc/msm_cirrus_playback/resistance_left_right
|
||||
chown system system /sys/devices/platform/soc/1d84000.ufshc/slowio_read_cnt
|
||||
chown system system /sys/devices/platform/soc/1d84000.ufshc/slowio_write_cnt
|
||||
chown system system /sys/devices/platform/soc/1d84000.ufshc/slowio_unmap_cnt
|
||||
chown system system /sys/devices/platform/soc/1d84000.ufshc/slowio_sync_cnt
|
||||
|
||||
# Permission for Health Storage HAL
|
||||
chown system system /sys/devices/platform/soc/1d84000.ufshc/manual_gc
|
||||
|
||||
# Permissions for reading display native color gamut
|
||||
chown system graphics /mnt/vendor/persist/display/native_gamut.csv
|
||||
|
||||
on boot
|
||||
# This location is used by QCRIL to host UNIX domain
|
||||
# socket files used for internal IPC within QCRIL
|
||||
# modules
|
||||
mkdir /dev/socket/qmux_radio 0770 radio radio
|
||||
chmod 2770 /dev/socket/qmux_radio
|
||||
|
||||
setprop wifi.interface wlan0
|
||||
|
||||
chown system system /sys/kernel/hbtp/display_pwr
|
||||
start rmt_storage
|
||||
start rfs_access
|
||||
|
||||
# default country code
|
||||
setprop ro.boot.wificountrycode 00
|
||||
|
||||
# WLAN debug access
|
||||
chown system system /d/icnss/stats
|
||||
|
||||
service init-radio-sh /vendor/bin/init.radio.sh
|
||||
class late_start
|
||||
user radio
|
||||
group root radio
|
||||
oneshot
|
||||
|
||||
on charger
|
||||
stop vendor.qseecomd
|
||||
stop keymaster-4-0
|
||||
setprop sys.usb.configfs 1
|
||||
|
||||
# Enable UFS powersaving
|
||||
write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkgate_enable 1
|
||||
write /sys/devices/platform/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1
|
||||
|
||||
# Enable EAS
|
||||
write /sys/kernel/debug/sched_features ENERGY_AWARE
|
||||
|
||||
# Enable powersaving
|
||||
write /sys/module/lpm_levels/parameters/sleep_disabled 0
|
||||
|
||||
on property:sys.boot_completed=1
|
||||
# Enable EAS
|
||||
write /sys/kernel/debug/sched_features ENERGY_AWARE
|
||||
|
||||
# No sleep till proto!
|
||||
exec - system system -- svc power stayon true
|
||||
|
||||
# Enable UFS powersaving
|
||||
write /sys/devices/platform/soc/${ro.boot.bootdevice}/clkgate_enable 1
|
||||
write /sys/devices/platform/soc/${ro.boot.bootdevice}/hibern8_on_idle_enable 1
|
||||
|
||||
# Enable powersaving
|
||||
write /sys/module/lpm_levels/parameters/sleep_disabled 0
|
||||
|
||||
# F2FS tuning: issue discard commands up to 128MB
|
||||
write /sys/block/dm-7/queue/discard_max_bytes 134217728
|
||||
|
||||
# Block layer tuning: discard chunk size up to 128MB
|
||||
# Otherwise, contiguous discards can be merged
|
||||
write /sys/block/sda/queue/discard_max_bytes 134217728
|
||||
|
||||
# Enable ZRAM on boot_complete
|
||||
swapon_all /vendor/etc/fstab.${ro.boot.hardware.platform}
|
||||
write /proc/sys/vm/swappiness 100
|
||||
|
||||
# Setup runtime cpusets
|
||||
write /dev/cpuset/top-app/cpus 0-7
|
||||
write /dev/cpuset/foreground/cpus 0-3,5-6
|
||||
write /dev/cpuset/background/cpus 0-1
|
||||
write /dev/cpuset/system-background/cpus 0-3
|
||||
write /dev/cpuset/restricted/cpus 0-3
|
||||
|
||||
# Setup runtime blkio
|
||||
# value for group_idle is us
|
||||
write /dev/blkio/blkio.weight 1000
|
||||
write /dev/blkio/background/blkio.weight 10
|
||||
write /dev/blkio/blkio.group_idle 2000
|
||||
write /dev/blkio/background/blkio.group_idle 0
|
||||
|
||||
# UFS health
|
||||
chmod 755 /sys/kernel/debug/ufshcd0
|
||||
chmod 644 /sys/kernel/debug/ufshcd0/show_hba
|
||||
chmod 644 /sys/kernel/debug/ufshcd0/stats/err_stats
|
||||
chmod 644 /sys/kernel/debug/ufshcd0/stats/io_stats
|
||||
chmod 644 /sys/kernel/debug/ufshcd0/stats/req_stats
|
||||
|
||||
# HardwareInfo needs to be able to read display info
|
||||
chmod 444 /sys/devices/platform/soc/soc:qcom,dsi-display-primary/panel_info/panel0/serial_number
|
||||
chmod 444 /sys/devices/platform/soc/soc:qcom,dsi-display-primary/panel_info/panel0/panel_vendor_name
|
||||
|
||||
# Maxim FG dump for dumpstate
|
||||
chown system system /sys/kernel/debug/regmap/1-0036/registers
|
||||
chown system system /sys/kernel/debug/regmap/1-000b/registers
|
||||
chown system system /sys/kernel/debug/google_battery/cycle_count_bins
|
||||
chown system system /sys/kernel/debug/google_battery/ssoc_gdf
|
||||
chown system system /sys/kernel/debug/google_battery/ssoc_rls
|
||||
chown system system /sys/kernel/debug/google_battery/ssoc_uic
|
||||
chown system system /sys/kernel/debug/google_battery/ssoc_uicurve
|
||||
chown system system /sys/kernel/debug/google_charger/pps_op_ua
|
||||
chown system system /sys/kernel/debug/google_charger/pps_out_uv
|
||||
|
||||
# Permission for Athletico
|
||||
chown system system /dev/iaxxx-module-celldrv
|
||||
chmod 0660 /dev/iaxxx-module-celldrv
|
||||
|
||||
service vendor.per_mgr /vendor/bin/pm-service
|
||||
class core
|
||||
user system
|
||||
group system
|
||||
ioprio rt 4
|
||||
|
||||
service per_proxy /vendor/bin/pm-proxy
|
||||
class core
|
||||
user system
|
||||
group system
|
||||
disabled
|
||||
|
||||
on property:init.svc.vendor.per_mgr=running
|
||||
start per_proxy
|
||||
|
||||
on property:sys.shutdown.requested=*
|
||||
stop per_proxy
|
||||
|
||||
service vendor.qseecomd /vendor/bin/qseecomd
|
||||
class core
|
||||
user root
|
||||
group root
|
||||
|
||||
service vendor.thermal-engine /vendor/bin/thermal-engine -c /vendor/etc/thermal-engine-${ro.hardware}.conf
|
||||
class main
|
||||
user root
|
||||
socket thermal-send-client stream 0666 system system
|
||||
socket thermal-recv-client stream 0660 system system
|
||||
socket thermal-recv-passive-client stream 0666 system system
|
||||
socket thermal-send-rule stream 0660 system system
|
||||
group root
|
||||
|
||||
service init-sensors-sh /vendor/bin/init.sensors.sh
|
||||
class main
|
||||
user root
|
||||
group root system
|
||||
disabled
|
||||
oneshot
|
||||
|
||||
service sensors.qti /vendor/bin/sensors.qti
|
||||
class core
|
||||
user system
|
||||
group system
|
||||
# Grants the ability for this daemon to bind IPC router ports so it can
|
||||
# register QMI services
|
||||
capabilities NET_BIND_SERVICE
|
||||
|
||||
service vendor.sscrpcd /vendor/bin/sscrpcd sensorspd
|
||||
class core
|
||||
user system
|
||||
group system
|
||||
|
||||
service vendor.adsprpcd /vendor/bin/adsprpcd
|
||||
class main
|
||||
user root
|
||||
group media
|
||||
setenv ADSP_LIBRARY_PATH /vendor/dsp;/vendor/lib/rfsa/adsp;/system/lib/rfsa/adsp
|
||||
|
||||
service vendor.adsprpcd_audiopd /vendor/bin/adsprpcd audiopd
|
||||
class main
|
||||
user media
|
||||
group media
|
||||
|
||||
service vendor.cdsprpcd /vendor/bin/cdsprpcd
|
||||
class main
|
||||
user system
|
||||
group system
|
||||
|
||||
service vendor.lowi /vendor/bin/sscrpcd
|
||||
class core
|
||||
user system
|
||||
group system
|
||||
|
||||
service vendor.imsqmidaemon /system/vendor/bin/imsqmidaemon
|
||||
class main
|
||||
user radio
|
||||
socket ims_qmid stream 0660 system radio
|
||||
group radio log diag
|
||||
|
||||
service vendor.imsdatadaemon /system/vendor/bin/imsdatadaemon
|
||||
class main
|
||||
user radio
|
||||
socket ims_datad stream 0660 system radio
|
||||
group radio wifi inet log diag
|
||||
disabled
|
||||
|
||||
service vendor.imsrcsservice /system/vendor/bin/imsrcsd
|
||||
class main
|
||||
user radio
|
||||
group radio diag inet log wakelock
|
||||
|
||||
on property:vendor.ims.QMI_DAEMON_STATUS=1
|
||||
start vendor.imsdatadaemon
|
||||
|
||||
service vendor.ims_rtp_daemon /system/vendor/bin/ims_rtp_daemon
|
||||
class main
|
||||
user radio
|
||||
group radio inet log
|
||||
|
||||
service cnd /vendor/bin/cnd
|
||||
class main
|
||||
user system
|
||||
group system wifi inet radio wakelock net_admin
|
||||
|
||||
service vendor.chre /vendor/bin/chre
|
||||
class late_start
|
||||
user system
|
||||
group system wakelock
|
||||
capabilities BLOCK_SUSPEND
|
||||
socket chre seqpacket 0660 root system
|
||||
shutdown critical
|
||||
|
||||
service wait_for_strongbox /vendor/bin/hw/wait_for_strongbox
|
||||
user root
|
||||
group root system
|
||||
priority -20
|
||||
ioprio rt 0
|
||||
|
||||
on property:vendor.ims.DATA_DAEMON_STATUS=1
|
||||
restart vendor.ims_rtp_daemon
|
||||
|
||||
service time_daemon /vendor/bin/time_daemon
|
||||
class core
|
||||
user root
|
||||
group root
|
||||
|
||||
service vendor.qrtr-ns /vendor/bin/qrtr-ns -f
|
||||
class core
|
||||
user vendor_qrtr
|
||||
group vendor_qrtr
|
||||
capabilities NET_BIND_SERVICE
|
||||
|
||||
service irsc_util /vendor/bin/irsc_util "/vendor/etc/sec_config"
|
||||
class core
|
||||
user root
|
||||
oneshot
|
||||
|
||||
service rmt_storage /vendor/bin/rmt_storage
|
||||
class core
|
||||
user root
|
||||
ioprio rt 0
|
||||
shutdown critical
|
||||
|
||||
service tftp_server /vendor/bin/tftp_server
|
||||
class core
|
||||
user root
|
||||
group root system
|
||||
|
||||
service modem_svc /vendor/bin/modem_svc
|
||||
class core
|
||||
user root
|
||||
group system
|
||||
capabilities NET_BIND_SERVICE
|
||||
|
||||
service vendor.ss_ramdump /vendor/bin/subsystem_ramdump
|
||||
class main
|
||||
user root
|
||||
group system
|
||||
disabled
|
||||
|
||||
service vendor.ssr_setup /vendor/bin/ssr_setup
|
||||
oneshot
|
||||
disabled
|
||||
|
||||
on property:persist.vendor.sys.ssr.restart_level=*
|
||||
start vendor.ssr_setup
|
||||
|
||||
on property:persist.vendor.sys.ssr.enable_ramdumps=1
|
||||
write /sys/module/subsystem_restart/parameters/enable_ramdumps 1
|
||||
mkdir /data/vendor/wifidump 771 root system
|
||||
mkdir /data/vendor/ramdump 771 root system
|
||||
mkdir /data/vendor/ssrdump 771 root system
|
||||
mkdir /data/vendor/ssrlog 771 root system
|
||||
start vendor.ss_ramdump
|
||||
|
||||
on property:persist.vendor.sys.ssr.enable_ramdumps=0
|
||||
write /sys/module/subsystem_restart/parameters/enable_ramdumps 0
|
||||
|
||||
service wpa_supplicant /vendor/bin/hw/wpa_supplicant \
|
||||
-O/data/vendor/wifi/wpa/sockets -puse_p2p_group_interface=1 -dd \
|
||||
-g@android:wpa_wlan0
|
||||
# we will start as root and wpa_supplicant will switch to user wifi
|
||||
# after setting up the capabilities required for WEXT
|
||||
# user wifi
|
||||
# group wifi inet keystore
|
||||
interface android.hardware.wifi.supplicant@1.0::ISupplicant default
|
||||
interface android.hardware.wifi.supplicant@1.1::ISupplicant default
|
||||
class main
|
||||
socket wpa_wlan0 dgram 660 wifi wifi
|
||||
disabled
|
||||
oneshot
|
||||
|
||||
on property:init.svc.vendor.hwcomposer-2-3=stopped
|
||||
stop ppd
|
||||
|
||||
on property:init.svc.vendor.hwcomposer-2-3=running
|
||||
start ppd
|
||||
|
||||
on property:wlan.driver.status=ok
|
||||
# Get the wlan driver/fw version
|
||||
start vendor.wlan_sh
|
||||
|
||||
# Change permission for dumpstate
|
||||
chmod 444 /sys/kernel/wlan/power_stats
|
||||
|
||||
service insmod_sh /vendor/bin/init.insmod.sh /vendor/etc/init.insmod.${ro.hardware}.cfg
|
||||
class main
|
||||
user root
|
||||
group root system
|
||||
disabled
|
||||
oneshot
|
||||
|
||||
service vendor.msm_irqbalance /vendor/bin/msm_irqbalance -f /vendor/etc/msm_irqbalance.conf
|
||||
socket msm_irqbalance seqpacket 660 root system
|
||||
class core
|
||||
user root
|
||||
group root
|
||||
writepid /dev/cpuset/system-background/tasks
|
||||
|
||||
service pd_mapper /vendor/bin/pd-mapper
|
||||
class core
|
||||
user system
|
||||
group system
|
||||
capabilities NET_BIND_SERVICE
|
||||
|
||||
service cnss-daemon /vendor/bin/cnss-daemon -n -l
|
||||
class late_start
|
||||
user system
|
||||
group system inet wifi
|
||||
|
||||
service loc_launcher /vendor/bin/loc_launcher
|
||||
class late_start
|
||||
user gps
|
||||
group gps
|
||||
|
||||
# bugreport is triggered by holding down volume down, volume up and power
|
||||
service bugreport /system/bin/dumpstate -d -p -B -z \
|
||||
-o /data/user_de/0/com.android.shell/files/bugreports/bugreport
|
||||
class main
|
||||
disabled
|
||||
oneshot
|
||||
keycodes 114 115 116
|
||||
|
||||
service vendor.wlan_sh /vendor/bin/init.qcom.wlan.sh
|
||||
class main
|
||||
user root
|
||||
group root
|
||||
disabled
|
||||
oneshot
|
||||
|
||||
# DSDS feature
|
||||
# Enable 2nd qcrild when the property set to dsds
|
||||
on property:persist.radio.multisim.config=dsds
|
||||
start vendor.qcrild2
|
||||
103
init.hardware.usb.rc
Normal file
103
init.hardware.usb.rc
Normal file
@@ -0,0 +1,103 @@
|
||||
#
|
||||
# Copyright (C) 2016 The Android Open-Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
on early-boot
|
||||
mkdir /config/usb_gadget/g1 0770
|
||||
mkdir /config/usb_gadget/g1/strings/0x409 0770
|
||||
write /config/usb_gadget/g1/bcdUSB 0x0200
|
||||
write /config/usb_gadget/g1/idVendor 0x18d1
|
||||
write /config/usb_gadget/g1/bcdDevice 0x0440
|
||||
write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}
|
||||
write /config/usb_gadget/g1/strings/0x409/manufacturer ${ro.product.manufacturer}
|
||||
write /config/usb_gadget/g1/strings/0x409/product ${ro.product.model}
|
||||
mkdir /config/usb_gadget/g1/functions/accessory.gs2
|
||||
mkdir /config/usb_gadget/g1/functions/audio_source.gs3
|
||||
mkdir /config/usb_gadget/g1/functions/midi.gs5
|
||||
mkdir /config/usb_gadget/g1/functions/ffs.adb
|
||||
mkdir /config/usb_gadget/g1/functions/ffs.mtp
|
||||
mkdir /config/usb_gadget/g1/functions/ffs.ptp
|
||||
mkdir /config/usb_gadget/g1/functions/diag.diag
|
||||
mkdir /config/usb_gadget/g1/functions/diag.diag_mdm
|
||||
mkdir /config/usb_gadget/g1/functions/cser.dun.0
|
||||
mkdir /config/usb_gadget/g1/functions/cser.nmea.1
|
||||
mkdir /config/usb_gadget/g1/functions/gsi.rmnet
|
||||
mkdir /config/usb_gadget/g1/functions/gsi.rndis
|
||||
mkdir /config/usb_gadget/g1/functions/gsi.dpl
|
||||
mkdir /config/usb_gadget/g1/functions/qdss.qdss
|
||||
mkdir /config/usb_gadget/g1/functions/qdss.qdss_mdm
|
||||
mkdir /config/usb_gadget/g1/configs/b.1 0770
|
||||
mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770
|
||||
write /config/usb_gadget/g1/os_desc/b_vendor_code 0x1
|
||||
write /config/usb_gadget/g1/os_desc/qw_sign "MSFT100"
|
||||
mkdir /dev/usb-ffs 0775 shell shell
|
||||
mkdir /dev/usb-ffs/adb 0770 shell shell
|
||||
mount functionfs adb /dev/usb-ffs/adb rmode=0770,fmode=0660,uid=2000,gid=2000,no_disconnect=1
|
||||
mkdir /dev/usb-ffs/mtp 0770 mtp mtp
|
||||
mkdir /dev/usb-ffs/ptp 0770 mtp mtp
|
||||
mount functionfs mtp /dev/usb-ffs/mtp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1
|
||||
mount functionfs ptp /dev/usb-ffs/ptp rmode=0770,fmode=0660,uid=1024,gid=1024,no_disconnect=1
|
||||
setprop sys.usb.mtp.device_type 3
|
||||
setprop sys.usb.controller "a600000.dwc3"
|
||||
symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1
|
||||
write /sys/module/libcomposite/parameters/disable_l1_for_hs "y"
|
||||
write /config/usb_gadget/g1/functions/gsi.rndis/rndis_class_id 1
|
||||
|
||||
on property:init.svc.console=running
|
||||
write /sys/class/power_supply/usb/moisture_detection_enabled 0
|
||||
|
||||
on boot
|
||||
setprop sys.usb.configfs 2
|
||||
|
||||
on property:sys.usb.config=none && property:sys.usb.configfs=1
|
||||
rm /config/usb_gadget/g1/configs/b.1/f1
|
||||
rm /config/usb_gadget/g1/configs/b.1/f2
|
||||
rm /config/usb_gadget/g1/configs/b.1/f3
|
||||
rm /config/usb_gadget/g1/configs/b.1/f4
|
||||
rm /config/usb_gadget/g1/configs/b.1/f5
|
||||
rm /config/usb_gadget/g1/configs/b.1/f6
|
||||
rm /config/usb_gadget/g1/configs/b.1/f7
|
||||
rm /config/usb_gadget/g1/configs/b.1/f8
|
||||
rm /config/usb_gadget/g1/configs/b.1/f9
|
||||
|
||||
on charger
|
||||
mkdir /config/usb_gadget/g1 0770
|
||||
mkdir /config/usb_gadget/g1/strings/0x409 0770
|
||||
write /config/usb_gadget/g1/bcdUSB 0x0200
|
||||
write /config/usb_gadget/g1/idVendor 0x18d1
|
||||
write /config/usb_gadget/g1/bcdDevice 0x0440
|
||||
write /config/usb_gadget/g1/strings/0x409/serialnumber ${ro.serialno}
|
||||
write /config/usb_gadget/g1/strings/0x409/manufacturer Google
|
||||
write /config/usb_gadget/g1/strings/0x409/product Pixel
|
||||
mkdir /config/usb_gadget/g1/functions/midi.gs5
|
||||
mkdir /config/usb_gadget/g1/configs/b.1 0770
|
||||
mkdir /config/usb_gadget/g1/configs/b.1/strings/0x409 0770
|
||||
symlink /config/usb_gadget/g1/configs/b.1 /config/usb_gadget/g1/os_desc/b.1
|
||||
setprop sys.usb.controller "a600000.dwc3"
|
||||
|
||||
on property:ro.bootmode=charger
|
||||
setprop sys.usb.config midi
|
||||
|
||||
on property:sys.usb.config=midi && property:sys.usb.configfs=1
|
||||
write /config/usb_gadget/g1/configs/b.1/strings/0x409/configuration "midi"
|
||||
rm /config/usb_gadget/g1/configs/b.1/f1
|
||||
rm /config/usb_gadget/g1/configs/b.1/f2
|
||||
rm /config/usb_gadget/g1/configs/b.1/f3
|
||||
rm /config/usb_gadget/g1/configs/b.1/f4
|
||||
write /config/usb_gadget/g1/idVendor 0x18d1
|
||||
write /config/usb_gadget/g1/idProduct 0x4eea
|
||||
symlink /config/usb_gadget/g1/functions/midi.gs5 /config/usb_gadget/g1/configs/b.1/f1
|
||||
write /config/usb_gadget/g1/UDC ${sys.usb.controller}
|
||||
setprop sys.usb.state ${sys.usb.config}
|
||||
19
init.insmod.redfin.cfg
Normal file
19
init.insmod.redfin.cfg
Normal file
@@ -0,0 +1,19 @@
|
||||
#############################################
|
||||
# init.insmod.cfg #
|
||||
# This file contains kernel modules to load #
|
||||
# at init time by init.insmod.sh script #
|
||||
#############################################
|
||||
|
||||
# Load kernel modules
|
||||
modprobe|wlan.ko msm_11ad_proxy.ko pinctrl_wcd_dlkm.ko wcd_core_dlkm.ko wcd_spi_dlkm.ko wglink_dlkm.ko q6_pdr_dlkm.ko q6_notifier_dlkm.ko apr_dlkm.ko swr_dlkm.ko q6_dlkm.ko cs35l36_dlkm.ko swr_ctrl_dlkm.ko wcd9xxx_dlkm.ko mbhc_dlkm.ko wcd9360_dlkm.ko wcd934x_dlkm.ko wsa881x_dlkm.ko wcd_cpe_dlkm.ko platform_dlkm.ko machine_dlkm.ko native_dlkm.ko usf_dlkm.ko stub_dlkm.ko adsp_loader_dlkm.ko lkdtm.ko videobuf2-memops.ko videobuf2-vmalloc.ko heatmap.ko ftm5.ko
|
||||
|
||||
# All modules loaded
|
||||
setprop|vendor.all.modules.ready
|
||||
|
||||
# Boot devices
|
||||
enable|/sys/kernel/boot_adsp/boot
|
||||
enable|/sys/kernel/boot_cdsp/boot
|
||||
enable|/sys/kernel/boot_slpi/boot
|
||||
|
||||
# All devices enabled
|
||||
setporp|vendor.all.devices.ready
|
||||
31
init.insmod.sh
Executable file
31
init.insmod.sh
Executable file
@@ -0,0 +1,31 @@
|
||||
#!/vendor/bin/sh
|
||||
|
||||
########################################################
|
||||
### init.insmod.cfg format: ###
|
||||
### ----------------------------------------------- ###
|
||||
### [insmod|setprop|enable/moprobe] [path|prop name] ###
|
||||
### ... ###
|
||||
########################################################
|
||||
|
||||
if [ $# -eq 1 ]; then
|
||||
cfg_file=$1
|
||||
else
|
||||
exit 1
|
||||
fi
|
||||
|
||||
if [ -f $cfg_file ]; then
|
||||
while IFS="|" read -r action arg
|
||||
do
|
||||
case $action in
|
||||
"insmod") insmod $arg ;;
|
||||
"setprop") setprop $arg 1 ;;
|
||||
"enable") echo 1 > $arg ;;
|
||||
"modprobe") modprobe -a -d /vendor/lib/modules $arg ;;
|
||||
esac
|
||||
done < $cfg_file
|
||||
fi
|
||||
|
||||
# set property even if there is no insmod config
|
||||
# as property value "1" is expected in early-boot trigger
|
||||
setprop vendor.all.modules.ready 1
|
||||
setprop vendor.all.devices.ready 1
|
||||
4
init.logging.rc
Normal file
4
init.logging.rc
Normal file
@@ -0,0 +1,4 @@
|
||||
on post-fs-data
|
||||
mkdir /data/vendor/modem_dump 0777 system system
|
||||
mkdir /data/vendor/radio/diag_logs/logs 0777 system system
|
||||
mkdir /data/vendor/radio/extended_logs 0770 system radio
|
||||
34
init.mdm.sh
Normal file
34
init.mdm.sh
Normal file
@@ -0,0 +1,34 @@
|
||||
#! /vendor/bin/sh
|
||||
|
||||
# Copyright (c) 2013, The Linux Foundation. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above copyright
|
||||
# notice, this list of conditions and the following disclaimer in the
|
||||
# documentation and/or other materials provided with the distribution.
|
||||
# * Neither the name of Linux Foundation nor
|
||||
# the names of its contributors may be used to endorse or promote
|
||||
# products derived from this software without specific prior written
|
||||
# permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
# AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
# IMPLIED WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
# NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR
|
||||
# CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
# EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
|
||||
# PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
|
||||
# OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
|
||||
# OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
|
||||
# ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
|
||||
baseband=`getprop ro.baseband`
|
||||
if [ "$baseband" = "mdm" ] || [ "$baseband" = "mdm2" ]; then
|
||||
start vendor.mdm_helper
|
||||
fi
|
||||
|
||||
1216
init.msm.usb.configfs.rc
Normal file
1216
init.msm.usb.configfs.rc
Normal file
File diff suppressed because it is too large
Load Diff
114
init.power.rc
Normal file
114
init.power.rc
Normal file
@@ -0,0 +1,114 @@
|
||||
#
|
||||
# Copyright (C) 2017 The Android Open-Source Project
|
||||
#
|
||||
# Licensed under the Apache License, Version 2.0 (the "License");
|
||||
# you may not use this file except in compliance with the License.
|
||||
# You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
on property:sys.boot_completed=1
|
||||
# Enable bus-dcvs
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/governor bw_hwmon
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/polling_interval 40
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/mbps_zones "2288 4577 7110 9155 12298 14236 15258"
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/sample_ms 4
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/io_percent 50
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/hist_memory 20
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/hyst_length 10
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/down_thres 30
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/guard_band_mbps 0
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/up_scale 250
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/bw_hwmon/idle_mbps 1600
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-cpu-llcc-bw/devfreq/soc:qcom,cpu-cpu-llcc-bw/max_freq 14236
|
||||
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/governor bw_hwmon
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/polling_interval 40
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/mbps_zones "1720 2929 3879 5931 6881 7980"
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/sample_ms 4
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/io_percent 80
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/hist_memory 20
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/hyst_length 10
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/down_thres 30
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/guard_band_mbps 0
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/up_scale 250
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/bw_hwmon/idle_mbps 1600
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu-llcc-ddr-bw/devfreq/soc:qcom,cpu-llcc-ddr-bw/max_freq 6881
|
||||
|
||||
write /sys/devices/virtual/npu/msm_npu/pwr 1
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/governor bw_hwmon
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/polling_interval 40
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/mbps_zones "1720 2929 3879 5931 6881 7980"
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/sample_ms 4
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/io_percent 80
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/hist_memory 20
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/hyst_length 6
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/down_thres 30
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/guard_band_mbps 0
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/up_scale 250
|
||||
write /sys/devices/platform/soc/soc:qcom,npu-npu-ddr-bw/devfreq/soc:qcom,npu-npu-ddr-bw/bw_hwmon/idle_mbps 0
|
||||
write /sys/devices/virtual/npu/msm_npu/pwr 0
|
||||
|
||||
#Enable mem_latency governor for L3, LLCC, and DDR scaling
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-llcc-lat/devfreq/soc:qcom,cpu0-cpu-llcc-lat/governor mem_latency
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-llcc-lat/devfreq/soc:qcom,cpu0-cpu-llcc-lat/polling_interval 10
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-llcc-lat/devfreq/soc:qcom,cpu0-cpu-llcc-lat/mem_latency/ratio_ceil 400
|
||||
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-l3-lat/devfreq/soc:qcom,cpu0-cpu-l3-lat/governor mem_latency
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-l3-lat/devfreq/soc:qcom,cpu0-cpu-l3-lat/polling_interval 10
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu0-cpu-l3-lat/devfreq/soc:qcom,cpu0-cpu-l3-lat/mem_latency/ratio_ceil 400
|
||||
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu0-llcc-ddr-lat/devfreq/soc:qcom,cpu0-llcc-ddr-lat/governor mem_latency
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu0-llcc-ddr-lat/devfreq/soc:qcom,cpu0-llcc-ddr-lat/polling_interval 10
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu0-llcc-ddr-lat/devfreq/soc:qcom,cpu0-llcc-ddr-lat/mem_latency/ratio_ceil 400
|
||||
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-llcc-lat/devfreq/soc:qcom,cpu4-cpu-llcc-lat/governor mem_latency
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-llcc-lat/devfreq/soc:qcom,cpu4-cpu-llcc-lat/polling_interval 10
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-llcc-lat/devfreq/soc:qcom,cpu4-cpu-llcc-lat/mem_latency/ratio_ceil 400
|
||||
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-l3-lat/devfreq/soc:qcom,cpu4-cpu-l3-lat/governor mem_latency
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-l3-lat/devfreq/soc:qcom,cpu4-cpu-l3-lat/polling_interval 10
|
||||
#Gold L3 ratio ceil is 4000
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-l3-lat/devfreq/soc:qcom,cpu4-cpu-l3-lat/mem_latency/ratio_ceil 4000
|
||||
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu7-cpu-l3-lat/devfreq/soc:qcom,cpu7-cpu-l3-lat/governor mem_latency
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu7-cpu-l3-lat/devfreq/soc:qcom,cpu7-cpu-l3-lat/polling_interval 10
|
||||
#Gold+ L3 ratio ceil is 20000
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu7-cpu-l3-lat/devfreq/soc:qcom,cpu7-cpu-l3-lat/mem_latency/ratio_ceil 20000
|
||||
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-llcc-ddr-lat/devfreq/soc:qcom,cpu4-llcc-ddr-lat/governor mem_latency
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-llcc-ddr-lat/devfreq/soc:qcom,cpu4-llcc-ddr-lat/polling_interval 10
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-llcc-ddr-lat/devfreq/soc:qcom,cpu4-llcc-ddr-lat/mem_latency/ratio_ceil 400
|
||||
|
||||
#Enable userspace governor for L3 cdsp nodes
|
||||
write /sys/devices/platform/soc/soc:qcom,cdsp-cdsp-l3-lat/devfreq/soc:qcom,cdsp-cdsp-l3-lat/governor cdspl3
|
||||
|
||||
#Enable compute governor for gold latfloor
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-ddr-latfloor/devfreq/soc:qcom,cpu4-cpu-ddr-latfloor/governor compute
|
||||
write /sys/devices/platform/soc/soc:qcom,cpu4-cpu-ddr-latfloor/devfreq/soc:qcom,cpu4-cpu-ddr-latfloor/polling_interval 10
|
||||
|
||||
write /sys/module/lpm_levels/parameters/sleep_disabled 0
|
||||
|
||||
# Enable idle state listener
|
||||
write /sys/class/drm/card0/device/idle_encoder_mask 1
|
||||
write /sys/class/drm/card0/device/idle_timeout_ms 100
|
||||
|
||||
chown system system /sys/class/devfreq/soc:qcom,l3-cdsp/userspace/set_freq
|
||||
|
||||
#Enable PowerHAL hint processing
|
||||
setprop vendor.powerhal.init 1
|
||||
|
||||
# Disable console_suspend to get better logging for kernel crashes
|
||||
on boot
|
||||
write /sys/module/printk/parameters/console_suspend N
|
||||
|
||||
# If UART is on, enable console_suspend on boot_complete to save power
|
||||
on property:sys.boot_completed=1 && property:init.svc.console=running
|
||||
write /sys/module/printk/parameters/console_suspend Y
|
||||
132
init.qcom.modem_links.sh
Normal file
132
init.qcom.modem_links.sh
Normal file
@@ -0,0 +1,132 @@
|
||||
#!/system/bin/sh
|
||||
# Copyright (c) 2013, The Linux Foundation. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following
|
||||
# disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
# * Neither the name of The Linux Foundation nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
#
|
||||
|
||||
# No path is set up at this point so we have to do it here.
|
||||
PATH=/sbin:/system/sbin:/system/bin:/system/xbin
|
||||
export PATH
|
||||
|
||||
# Check for images and set up symlinks
|
||||
cd /firmware/image
|
||||
|
||||
# Get the list of files in /firmware/image
|
||||
# for which sym links have to be created
|
||||
|
||||
fwfiles=`ls modem* adsp* wcnss* mba*`
|
||||
|
||||
# Check if the links with similar names
|
||||
# have been created in /system/etc/firmware
|
||||
|
||||
cd /system/etc/firmware
|
||||
linksNeeded=0
|
||||
|
||||
# For everyfile in fwfiles check if
|
||||
# the corresponding file exists
|
||||
for fwfile in $fwfiles; do
|
||||
|
||||
# if (condition) does not seem to work
|
||||
# with the android shell. Therefore
|
||||
# make do with case statements instead.
|
||||
# if a file named $fwfile is present
|
||||
# no need to create links. If the file
|
||||
# with the name $fwfile is not present
|
||||
# need to create links.
|
||||
|
||||
case `ls $fwfile` in
|
||||
$fwfile)
|
||||
continue;;
|
||||
*)
|
||||
# file with $fwfile does not exist
|
||||
# need to create links
|
||||
linksNeeded=1
|
||||
break;;
|
||||
esac
|
||||
|
||||
done
|
||||
|
||||
# symlinks created for qca6714 firmware
|
||||
ln -s /firmware/image/athwlan.bin /system/etc/firmware/athwlan.bin
|
||||
ln -s /firmware/image/fakeboar.bin /system/etc/firmware/fakeBoardData_AR6004.bin
|
||||
ln -s /firmware/image/otp.bin /system/etc/firmware/otp.bin
|
||||
ln -s /firmware/image/utf.bin /system/etc/firmware/utf.bin
|
||||
|
||||
case $linksNeeded in
|
||||
1)
|
||||
cd /firmware/image
|
||||
|
||||
case `ls modem.mdt 2>/dev/null` in
|
||||
modem.mdt)
|
||||
for imgfile in modem*; do
|
||||
ln -s /firmware/image/$imgfile /system/etc/firmware/$imgfile 2>/dev/null
|
||||
done
|
||||
;;
|
||||
*)
|
||||
# trying to log here but nothing will be logged since it is
|
||||
# early in the boot process. Is there a way to log this message?
|
||||
log -p w -t PIL no modem image found;;
|
||||
esac
|
||||
|
||||
case `ls adsp.mdt 2>/dev/null` in
|
||||
adsp.mdt)
|
||||
for imgfile in adsp*; do
|
||||
ln -s /firmware/image/$imgfile /system/etc/firmware/$imgfile 2>/dev/null
|
||||
done
|
||||
;;
|
||||
*)
|
||||
log -p w -t PIL no adsp image found;;
|
||||
esac
|
||||
|
||||
case `ls wcnss.mdt 2>/dev/null` in
|
||||
wcnss.mdt)
|
||||
for imgfile in wcnss*; do
|
||||
ln -s /firmware/image/$imgfile /system/etc/firmware/$imgfile 2>/dev/null
|
||||
done
|
||||
;;
|
||||
*)
|
||||
log -p w -t PIL no wcnss image found;;
|
||||
esac
|
||||
|
||||
case `ls mba.mdt 2>/dev/null` in
|
||||
mba.mdt)
|
||||
for imgfile in mba*; do
|
||||
ln -s /firmware/image/$imgfile /system/etc/firmware/$imgfile 2>/dev/null
|
||||
done
|
||||
;;
|
||||
*)
|
||||
log -p w -t PIL no mba image found;;
|
||||
esac
|
||||
|
||||
;;
|
||||
|
||||
*)
|
||||
# Nothing to do. No links needed
|
||||
;;
|
||||
esac
|
||||
|
||||
cd /
|
||||
1665
init.qcom.usb.rc
Normal file
1665
init.qcom.usb.rc
Normal file
File diff suppressed because it is too large
Load Diff
245
init.qcom.usb.sh
Normal file
245
init.qcom.usb.sh
Normal file
@@ -0,0 +1,245 @@
|
||||
#!/vendor/bin/sh
|
||||
# Copyright (c) 2012-2018, The Linux Foundation. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following
|
||||
# disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
# * Neither the name of The Linux Foundation nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
#
|
||||
|
||||
# Set platform variables
|
||||
if [ -f /sys/devices/soc0/hw_platform ]; then
|
||||
soc_hwplatform=`cat /sys/devices/soc0/hw_platform` 2> /dev/null
|
||||
else
|
||||
soc_hwplatform=`cat /sys/devices/system/soc/soc0/hw_platform` 2> /dev/null
|
||||
fi
|
||||
|
||||
if [ -f /sys/devices/soc0/machine ]; then
|
||||
soc_machine=`cat /sys/devices/soc0/machine` 2> /dev/null
|
||||
else
|
||||
soc_machine=`cat /sys/devices/system/soc/soc0/machine` 2> /dev/null
|
||||
fi
|
||||
|
||||
#
|
||||
# Check ESOC for external MDM
|
||||
#
|
||||
# Note: currently only a single MDM is supported
|
||||
#
|
||||
if [ -d /sys/bus/esoc/devices ]; then
|
||||
for f in /sys/bus/esoc/devices/*; do
|
||||
if [ -d $f ]; then
|
||||
if [ `grep -e "^MDM" -e "^SDX" $f/esoc_name` ]; then
|
||||
esoc_link=`cat $f/esoc_link`
|
||||
break
|
||||
fi
|
||||
fi
|
||||
done
|
||||
fi
|
||||
|
||||
target=`getprop ro.board.platform`
|
||||
|
||||
# soc_ids for 8937
|
||||
if [ -f /sys/devices/soc0/soc_id ]; then
|
||||
soc_id=`cat /sys/devices/soc0/soc_id`
|
||||
else
|
||||
soc_id=`cat /sys/devices/system/soc/soc0/id`
|
||||
fi
|
||||
|
||||
#
|
||||
# Allow USB enumeration with default PID/VID
|
||||
#
|
||||
baseband=`getprop ro.baseband`
|
||||
|
||||
echo 1 > /sys/class/android_usb/f_mass_storage/lun/nofua
|
||||
usb_config=`getprop persist.vendor.usb.config`
|
||||
if [ "$usb_config" == "" ]; then #USB persist config not set, select default configuration
|
||||
if [ "$esoc_link" != "" ]; then
|
||||
setprop persist.vendor.usb.config diag,diag_mdm,qdss,qdss_mdm,serial_cdev,dpl,rmnet,adb
|
||||
else
|
||||
case "$baseband" in
|
||||
"apq")
|
||||
setprop persist.vendor.usb.config diag,adb
|
||||
;;
|
||||
*)
|
||||
case "$soc_hwplatform" in
|
||||
"Dragon" | "SBC")
|
||||
setprop persist.vendor.usb.config diag,adb
|
||||
;;
|
||||
*)
|
||||
soc_machine=${soc_machine:0:3}
|
||||
case "$soc_machine" in
|
||||
"SDA")
|
||||
setprop persist.vendor.usb.config diag,adb
|
||||
;;
|
||||
*)
|
||||
case "$target" in
|
||||
"msm8996")
|
||||
setprop persist.vendor.usb.config diag,serial_cdev,serial_tty,rmnet_ipa,mass_storage,adb
|
||||
;;
|
||||
"msm8909")
|
||||
setprop persist.vendor.usb.config diag,serial_smd,rmnet_qti_bam,adb
|
||||
;;
|
||||
"msm8937")
|
||||
if [ -d /config/usb_gadget ]; then
|
||||
setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,adb
|
||||
else
|
||||
case "$soc_id" in
|
||||
"313" | "320")
|
||||
echo BAM2BAM_IPA > /sys/class/android_usb/android0/f_rndis_qc/rndis_transports
|
||||
setprop persist.vendor.usb.config diag,serial_smd,rmnet_ipa,adb
|
||||
;;
|
||||
*)
|
||||
setprop persist.vendor.usb.config diag,serial_smd,rmnet_qti_bam,adb
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
;;
|
||||
"msm8953")
|
||||
if [ -d /config/usb_gadget ]; then
|
||||
setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,adb
|
||||
else
|
||||
setprop persist.vendor.usb.config diag,serial_smd,rmnet_ipa,adb
|
||||
fi
|
||||
;;
|
||||
"msm8998" | "sdm660" | "apq8098_latv")
|
||||
setprop persist.vendor.usb.config diag,serial_cdev,rmnet,adb
|
||||
;;
|
||||
"sdm845" | "sdm710")
|
||||
setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,adb
|
||||
;;
|
||||
#"lito")
|
||||
# setprop persist.vendor.usb.config diag,serial_cdev,rmnet,dpl,qdss,adb
|
||||
#;;
|
||||
*)
|
||||
setprop persist.vendor.usb.config diag,adb
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
fi
|
||||
|
||||
# set device mode notification to USB driver for SA8150 Auto ADP
|
||||
product=`getprop ro.build.product`
|
||||
|
||||
case "$product" in
|
||||
"lito_au")
|
||||
echo peripheral > /sys/bus/platform/devices/a600000.ssusb/mode
|
||||
;;
|
||||
*)
|
||||
;;
|
||||
esac
|
||||
|
||||
# check configfs is mounted or not
|
||||
if [ -d /config/usb_gadget ]; then
|
||||
# Chip-serial is used for unique MSM identification in Product string
|
||||
msm_serial=`cat /sys/devices/soc0/serial_number`;
|
||||
msm_serial_hex=`printf %08X $msm_serial`
|
||||
machine_type=`cat /sys/devices/soc0/machine`
|
||||
product_string="$machine_type-$soc_hwplatform _SN:$msm_serial_hex"
|
||||
echo "$product_string" > /config/usb_gadget/g1/strings/0x409/product
|
||||
|
||||
# ADB requires valid iSerialNumber; if ro.serialno is missing, use dummy
|
||||
serialnumber=`cat /config/usb_gadget/g1/strings/0x409/serialnumber` 2> /dev/null
|
||||
if [ "$serialnumber" == "" ]; then
|
||||
serialno=1234567
|
||||
echo $serialno > /config/usb_gadget/g1/strings/0x409/serialnumber
|
||||
fi
|
||||
fi
|
||||
|
||||
#
|
||||
# Initialize RNDIS Diag option. If unset, set it to 'none'.
|
||||
#
|
||||
diag_extra=`getprop persist.vendor.usb.config.extra`
|
||||
if [ "$diag_extra" == "" ]; then
|
||||
setprop persist.vendor.usb.config.extra none
|
||||
fi
|
||||
|
||||
# enable rps cpus on msm8937 target
|
||||
setprop vendor.usb.rps_mask 0
|
||||
case "$soc_id" in
|
||||
"294" | "295" | "353" | "354")
|
||||
setprop vendor.usb.rps_mask 40
|
||||
;;
|
||||
esac
|
||||
|
||||
#
|
||||
# Initialize UVC conifguration.
|
||||
#
|
||||
if [ -d /config/usb_gadget/g1/functions/uvc.0 ]; then
|
||||
cd /config/usb_gadget/g1/functions/uvc.0
|
||||
|
||||
echo 3072 > streaming_maxpacket
|
||||
echo 1 > streaming_maxburst
|
||||
mkdir control/header/h
|
||||
ln -s control/header/h control/class/fs/
|
||||
ln -s control/header/h control/class/ss
|
||||
|
||||
mkdir -p streaming/uncompressed/u/360p
|
||||
echo "666666\n1000000\n5000000\n" > streaming/uncompressed/u/360p/dwFrameInterval
|
||||
|
||||
mkdir -p streaming/uncompressed/u/720p
|
||||
echo 1280 > streaming/uncompressed/u/720p/wWidth
|
||||
echo 720 > streaming/uncompressed/u/720p/wWidth
|
||||
echo 29491200 > streaming/uncompressed/u/720p/dwMinBitRate
|
||||
echo 29491200 > streaming/uncompressed/u/720p/dwMaxBitRate
|
||||
echo 1843200 > streaming/uncompressed/u/720p/dwMaxVideoFrameBufferSize
|
||||
echo 5000000 > streaming/uncompressed/u/720p/dwDefaultFrameInterval
|
||||
echo "5000000\n" > streaming/uncompressed/u/720p/dwFrameInterval
|
||||
|
||||
mkdir -p streaming/mjpeg/m/360p
|
||||
echo "666666\n1000000\n5000000\n" > streaming/mjpeg/m/360p/dwFrameInterval
|
||||
|
||||
mkdir -p streaming/mjpeg/m/720p
|
||||
echo 1280 > streaming/mjpeg/m/720p/wWidth
|
||||
echo 720 > streaming/mjpeg/m/720p/wWidth
|
||||
echo 29491200 > streaming/mjpeg/m/720p/dwMinBitRate
|
||||
echo 29491200 > streaming/mjpeg/m/720p/dwMaxBitRate
|
||||
echo 1843200 > streaming/mjpeg/m/720p/dwMaxVideoFrameBufferSize
|
||||
echo 5000000 > streaming/mjpeg/m/720p/dwDefaultFrameInterval
|
||||
echo "5000000\n" > streaming/mjpeg/m/720p/dwFrameInterval
|
||||
|
||||
echo 0x04 > /config/usb_gadget/g1/functions/uvc.0/streaming/mjpeg/m/bmaControls
|
||||
|
||||
mkdir -p streaming/h264/h/960p
|
||||
echo 1920 > streaming/h264/h/960p/wWidth
|
||||
echo 960 > streaming/h264/h/960p/wWidth
|
||||
echo 40 > streaming/h264/h/960p/bLevelIDC
|
||||
echo "333667\n" > streaming/h264/h/960p/dwFrameInterval
|
||||
|
||||
mkdir -p streaming/h264/h/1920p
|
||||
echo "333667\n" > streaming/h264/h/1920p/dwFrameInterval
|
||||
|
||||
mkdir streaming/header/h
|
||||
ln -s streaming/uncompressed/u streaming/header/h
|
||||
ln -s streaming/mjpeg/m streaming/header/h
|
||||
ln -s streaming/h264/h streaming/header/h
|
||||
ln -s streaming/header/h streaming/class/fs/
|
||||
ln -s streaming/header/h streaming/class/hs/
|
||||
ln -s streaming/header/h streaming/class/ss/
|
||||
fi
|
||||
6
init.qcom.wlan.sh
Normal file
6
init.qcom.wlan.sh
Normal file
@@ -0,0 +1,6 @@
|
||||
#! /vendor/bin/sh
|
||||
|
||||
wlan_driver_version=`cat /sys/kernel/wlan/wlan/driver_version`
|
||||
setprop vendor.wlan.driver.version "${wlan_driver_version:0:91}"
|
||||
wlan_fw_version=`cat /sys/kernel/wlan/fw/1/version`
|
||||
setprop vendor.wlan.firmware.version "${wlan_fw_version:0:91}"
|
||||
55
init.qti.getbootdevice.sh
Normal file
55
init.qti.getbootdevice.sh
Normal file
@@ -0,0 +1,55 @@
|
||||
#!/vendor/bin/sh
|
||||
# Copyright (c) 2018, The Linux Foundation. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following
|
||||
# disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
# * Neither the name of The Linux Foundation nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
#
|
||||
#Script to find if the boot device is SD card or UFS
|
||||
|
||||
|
||||
echo "Bootdevice setup: Starting..." > /dev/kmsg
|
||||
|
||||
bootdevice=`getprop ro.boot.bootdevice`
|
||||
|
||||
if [ "$bootdevice" = "8804000.sdhci" ]; then
|
||||
ln -s /dev/block/platform/soc/8804000.sdhci /dev/block/bootdevice
|
||||
echo "Waiting for SDHCI device to show up..." > /dev/kmsg
|
||||
while [ ! -e "/dev/block/platform/soc/8804000.sdhci" ]; do
|
||||
sleep 1
|
||||
done
|
||||
elif [ "$bootdevice" = "1d84000.ufshc" ]; then
|
||||
ln -s /dev/block/platform/soc/1d84000.ufshc /dev/block/bootdevice
|
||||
echo "Waiting for UFS device to show up..." > /dev/kmsg
|
||||
while [ ! -e "/dev/block/platform/soc/1d84000.ufshc" ]; do
|
||||
sleep 1;
|
||||
done
|
||||
else
|
||||
while true; do
|
||||
echo "Boot failure - invalid bootdevice ($bootdevice)" > /dev/kmsg
|
||||
sleep 30;
|
||||
done
|
||||
fi
|
||||
echo "Bootdevice setup: Completed ($bootdevice)" > /dev/kmsg
|
||||
35
init.qti.qseecomd.sh
Normal file
35
init.qti.qseecomd.sh
Normal file
@@ -0,0 +1,35 @@
|
||||
#!/vendor/bin/sh
|
||||
# Copyright (c) 2017, The Linux Foundation. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following
|
||||
# disclaimer in the documentation and/or other materials provided
|
||||
# with the distribution.
|
||||
# * Neither the name of The Linux Foundation nor the names of its
|
||||
# contributors may be used to endorse or promote products derived
|
||||
# from this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESS OR IMPLIED
|
||||
# WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
|
||||
# MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT
|
||||
# ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS
|
||||
# BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
# CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
# SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
||||
# BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
|
||||
# WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
|
||||
# OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
|
||||
# IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
#
|
||||
#
|
||||
|
||||
while [ "$registered" != "true" ]
|
||||
do
|
||||
sleep 0.1
|
||||
registered="`getprop vendor.sys.listeners.registered`"
|
||||
done
|
||||
38
init.radio.sh
Normal file
38
init.radio.sh
Normal file
@@ -0,0 +1,38 @@
|
||||
#! /vendor/bin/sh
|
||||
|
||||
#
|
||||
# Copy qcril.db if needed for RIL
|
||||
#
|
||||
if [ -f /vendor/radio/qcril_database/qcril.db -a ! -f /data/vendor/radio/qcril.db ]; then
|
||||
cp /vendor/radio/qcril_database/qcril.db /data/vendor/radio/qcril.db
|
||||
chown -h radio.radio /data/vendor/radio/qcril.db
|
||||
fi
|
||||
echo 1 > /data/vendor/radio/db_check_done
|
||||
|
||||
cp /vendor/radio/qcril_database/qcril.db /data/vendor/radio/qcril_prebuilt.db
|
||||
chown radio.radio /data/vendor/radio/qcril_prebuilt.db
|
||||
chmod 0660 /data/vendor/radio/qcril_prebuilt.db
|
||||
|
||||
#
|
||||
# Make modem config folder and copy firmware config to that folder for RIL
|
||||
#
|
||||
if [ -f /data/vendor/radio/ver_info.txt ]; then
|
||||
prev_version_info=`cat /data/vendor/radio/ver_info.txt`
|
||||
else
|
||||
prev_version_info=""
|
||||
fi
|
||||
|
||||
cur_version_info=`cat /vendor/firmware_mnt/verinfo/ver_info.txt`
|
||||
if [ ! -f /vendor/firmware_mnt/verinfo/ver_info.txt -o "$prev_version_info" != "$cur_version_info" ]; then
|
||||
rm -rf /data/vendor/radio/modem_config
|
||||
mkdir /data/vendor/radio/modem_config
|
||||
chmod 770 /data/vendor/radio/modem_config
|
||||
cp -r /vendor/firmware_mnt/image/modem_pr/mcfg/configs/* /data/vendor/radio/modem_config
|
||||
chown -hR radio.radio /data/vendor/radio/modem_config
|
||||
cp /vendor/firmware_mnt/verinfo/ver_info.txt /data/vendor/radio/ver_info.txt
|
||||
chown radio.radio /data/vendor/radio/ver_info.txt
|
||||
fi
|
||||
cp /vendor/firmware_mnt/image/modem_pr/mbn_ota.txt /data/vendor/radio/modem_config
|
||||
chown radio.radio /data/vendor/radio/modem_config/mbn_ota.txt
|
||||
echo 1 > /data/vendor/radio/copy_complete
|
||||
|
||||
10
init.recovery.device.rc
Normal file
10
init.recovery.device.rc
Normal file
@@ -0,0 +1,10 @@
|
||||
on fs
|
||||
wait /dev/block/platform/soc/${ro.boot.bootdevice}
|
||||
symlink /dev/block/platform/soc/${ro.boot.bootdevice} /dev/block/bootdevice
|
||||
|
||||
on init
|
||||
setprop sys.usb.configfs 1
|
||||
# Don't lose recovery logs- keep warm reset for coming out of recovery.
|
||||
write /sys/module/msm_poweroff/parameters/warm_reset 1
|
||||
# Enable thermal mitigation
|
||||
write /sys/devices/virtual/thermal/tz-by-name/backup-charge/mode enabled
|
||||
6
init.sensors.sh
Normal file
6
init.sensors.sh
Normal file
@@ -0,0 +1,6 @@
|
||||
#! /vendor/bin/sh
|
||||
|
||||
version=`grep -ao "OEM_IMAGE_VERSION_STRING[ -~]*" \
|
||||
/vendor/firmware/slpi.b04 | \
|
||||
sed -e s/OEM_IMAGE_VERSION_STRING=SLPI.version.// -e s/\(.*\).//`
|
||||
setprop sys.slpi.firmware.version "$version"
|
||||
5
json-c/AUTHORS
Normal file
5
json-c/AUTHORS
Normal file
@@ -0,0 +1,5 @@
|
||||
Michael Clark <michael@metaparadigm.com>
|
||||
Jehiah Czebotar <jehiah@gmail.com>
|
||||
Eric Haszlakiewicz <hawicz+json-c@gmail.com>
|
||||
C. Watford (christopher.watford@gmail.com)
|
||||
|
||||
39
json-c/Android.configure.mk
Normal file
39
json-c/Android.configure.mk
Normal file
@@ -0,0 +1,39 @@
|
||||
# This file is the top android makefile for all sub-modules.
|
||||
|
||||
LOCAL_PATH := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
|
||||
json_c_TOP := $(LOCAL_PATH)
|
||||
|
||||
JSON_C_BUILT_SOURCES := Android.mk
|
||||
|
||||
JSON_C_BUILT_SOURCES := $(patsubst %, $(abspath $(json_c_TOP))/%, $(JSON_C_BUILT_SOURCES))
|
||||
|
||||
.PHONY: json-c-configure json-c-configure-real
|
||||
json-c-configure-real:
|
||||
echo $(JSON_C_BUILT_SOURCES)
|
||||
cd $(json_c_TOP) ; \
|
||||
$(abspath $(json_c_TOP))/autogen.sh && \
|
||||
CC="$(CONFIGURE_CC)" \
|
||||
CFLAGS="$(CONFIGURE_CFLAGS)" \
|
||||
LD=$(TARGET_LD) \
|
||||
LDFLAGS="$(CONFIGURE_LDFLAGS)" \
|
||||
CPP=$(CONFIGURE_CPP) \
|
||||
CPPFLAGS="$(CONFIGURE_CPPFLAGS)" \
|
||||
PKG_CONFIG_LIBDIR=$(CONFIGURE_PKG_CONFIG_LIBDIR) \
|
||||
PKG_CONFIG_TOP_BUILD_DIR=/ \
|
||||
ac_cv_func_malloc_0_nonnull=yes \
|
||||
ac_cv_func_realloc_0_nonnull=yes \
|
||||
$(abspath $(json_c_TOP))/$(CONFIGURE) --host=$(CONFIGURE_HOST) \
|
||||
--prefix=/system \
|
||||
&& \
|
||||
for file in $(JSON_C_BUILT_SOURCES); do \
|
||||
rm -f $$file && \
|
||||
make -C $$(dirname $$file) $$(basename $$file) ; \
|
||||
done
|
||||
|
||||
json-c-configure: json-c-configure-real
|
||||
|
||||
PA_CONFIGURE_TARGETS += json-c-configure
|
||||
|
||||
-include $(json_c_TOP)/Android.mk
|
||||
35
json-c/Android.mk
Normal file
35
json-c/Android.mk
Normal file
@@ -0,0 +1,35 @@
|
||||
LIBJSON_ROOT := $(call my-dir)
|
||||
include $(CLEAR_VARS)
|
||||
LOCAL_MODULE := libjson
|
||||
LOCAL_PATH := $(LIBJSON_ROOT)
|
||||
LOCAL_C_INCLUDES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr/include
|
||||
LOCAL_ADDITIONAL_DEPENDENCIES += $(TARGET_OUT_INTERMEDIATES)/KERNEL_OBJ/usr
|
||||
LOCAL_COPY_HEADERS_TO := libjson/inc
|
||||
LOCAL_COPY_HEADERS := bits.h \
|
||||
config.h \
|
||||
debug.h \
|
||||
linkhash.h \
|
||||
arraylist.h \
|
||||
json.h \
|
||||
json_config.h \
|
||||
json_inttypes.h \
|
||||
json_util.h \
|
||||
json_object.h \
|
||||
json_tokener.h \
|
||||
json_object_iterator.h \
|
||||
json_c_version.h
|
||||
LOCAL_SRC_FILES := arraylist.c \
|
||||
debug.c \
|
||||
json_c_version.c \
|
||||
json_object.c \
|
||||
json_object_iterator.c \
|
||||
json_tokener.c \
|
||||
json_util.c \
|
||||
libjson.c \
|
||||
linkhash.c \
|
||||
printbuf.c \
|
||||
random_seed.c
|
||||
LOCAL_SHARED_LIBRARIES := libcutils libutils
|
||||
LOCAL_MODULE_TAG := optional
|
||||
LOCAL_VENDOR_MODULE := true
|
||||
include $(BUILD_SHARED_LIBRARY)
|
||||
42
json-c/COPYING
Normal file
42
json-c/COPYING
Normal file
@@ -0,0 +1,42 @@
|
||||
|
||||
Copyright (c) 2009-2012 Eric Haszlakiewicz
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
|
||||
----------------------------------------------------------------
|
||||
|
||||
Copyright (c) 2004, 2005 Metaparadigm Pte Ltd
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a
|
||||
copy of this software and associated documentation files (the "Software"),
|
||||
to deal in the Software without restriction, including without limitation
|
||||
the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
||||
and/or sell copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included
|
||||
in all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||
SOFTWARE.
|
||||
218
json-c/ChangeLog
Normal file
218
json-c/ChangeLog
Normal file
@@ -0,0 +1,218 @@
|
||||
|
||||
NEXT.VERSION
|
||||
|
||||
...nothing yet...
|
||||
|
||||
0.12
|
||||
|
||||
* Address security issues:
|
||||
* CVE-2013-6371: hash collision denial of service
|
||||
* CVE-2013-6370: buffer overflow if size_t is larger than int
|
||||
|
||||
* Avoid potential overflow in json_object_get_double
|
||||
|
||||
* Eliminate the mc_abort() function and MC_ABORT macro.
|
||||
|
||||
* Make the json_tokener_errors array local. It has been deprecated for
|
||||
a while, and json_tokener_error_desc() should be used instead.
|
||||
|
||||
* change the floating point output format to %.17g so values with
|
||||
more than 6 digits show up in the output.
|
||||
|
||||
* Remove the old libjson.so name compatibility support. The library is
|
||||
only created as libjson-c.so now and headers are only installed
|
||||
into the ${prefix}/json-c directory.
|
||||
|
||||
* When supported by the linker, add the -Bsymbolic-functions flag.
|
||||
|
||||
* Various changes to fix the build on MSVC.
|
||||
|
||||
* Make strict mode more strict:
|
||||
* number must not start with 0
|
||||
* no single-quote strings
|
||||
* no comments
|
||||
* trailing char not allowed
|
||||
* only allow lowercase literals
|
||||
|
||||
* Added a json_object_new_double_s() convenience function to allow
|
||||
an exact string representation of a double to be specified when
|
||||
creating the object and use it in json_tokener_parse_ex() so
|
||||
a re-serialized object more exactly matches the input.
|
||||
|
||||
* Add support NaN and Infinity
|
||||
|
||||
|
||||
0.11
|
||||
|
||||
* IMPORTANT: the name of the library has changed to libjson-c.so and
|
||||
the header files are now in include/json-c.
|
||||
The pkgconfig name has also changed from json to json-c.
|
||||
You should change your build to use appropriate -I and -l options.
|
||||
A compatibility shim is in place so builds using the old name will
|
||||
continue to work, but that will be removed in the next release.
|
||||
* Maximum recursion depth is now a runtime option.
|
||||
json_tokener_new() is provided for compatibility.
|
||||
json_tokener_new_ex(depth)
|
||||
* Include json_object_iterator.h in the installed headers.
|
||||
* Add support for building on Android.
|
||||
* Rewrite json_object_object_add to replace just the value if the key already exists so keys remain valid.
|
||||
* Make it safe to delete keys while iterating with the json_object_object_foreach macro.
|
||||
* Add a json_set_serializer() function to allow the string output of a json_object to be customized.
|
||||
* Make float parsing locale independent.
|
||||
* Add a json_tokener_set_flags() function and a JSON_TOKENER_STRICT flag.
|
||||
* Enable -Werror when building.
|
||||
* speed improvements to parsing 64-bit integers on systems with working sscanf
|
||||
* Add a json_object_object_length function.
|
||||
* Fix a bug (buffer overrun) when expanding arrays to more than 64 entries.
|
||||
|
||||
0.10
|
||||
|
||||
* Add a json_object_to_json_string_ext() function to allow output to be
|
||||
formatted in a more human readable form.
|
||||
* Add json_object_object_get_ex(), a NULL-safe get object method, to be able
|
||||
to distinguish between a key not present and the value being NULL.
|
||||
* Add an alternative iterator implementation, see json_object_iterator.h
|
||||
* Make json_object_iter public to enable external use of the
|
||||
json_object_object_foreachC macro.
|
||||
* Add a printbuf_memset() function to provide an effecient way to set and
|
||||
append things like whitespace indentation.
|
||||
* Adjust json_object_is_type and json_object_get_type so they return
|
||||
json_type_null for NULL objects and handle NULL passed to
|
||||
json_objct_object_get().
|
||||
* Rename boolean type to json_bool.
|
||||
* Fix various compile issues for Visual Studio and MinGW.
|
||||
* Allow json_tokener_parse_ex() to be re-used to parse multiple object.
|
||||
Also, fix some parsing issues with capitalized hexadecimal numbers and
|
||||
number in E notation.
|
||||
* Add json_tokener_get_error() and json_tokener_error_desc() to better
|
||||
encapsulate the process of retrieving errors while parsing.
|
||||
* Various improvements to the documentation of many functions.
|
||||
* Add new json_object_array_sort() function.
|
||||
* Fix a bug in json_object_get_int(), which would incorrectly return 0
|
||||
when called on a string type object.
|
||||
Eric Haszlakiewicz
|
||||
* Add a json_type_to_name() function.
|
||||
Eric Haszlakiewicz
|
||||
* Add a json_tokener_parse_verbose() function.
|
||||
Jehiah Czebotar
|
||||
* Improve support for null bytes within JSON strings.
|
||||
Jehiah Czebotar
|
||||
* Fix file descriptor leak if memory allocation fails in json_util
|
||||
Zachary Blair, zack_blair at hotmail dot com
|
||||
* Add int64 support. Two new functions json_object_net_int64 and
|
||||
json_object_get_int64. Binary compatibility preserved.
|
||||
Eric Haszlakiewicz, EHASZLA at transunion com
|
||||
Rui Miguel Silva Seabra, rms at 1407 dot org
|
||||
* Fix subtle bug in linkhash where lookup could hang after all slots
|
||||
were filled then successively freed.
|
||||
Spotted by Jean-Marc Naud, j dash m at newtraxtech dot com
|
||||
* Make json_object_from_file take const char *filename
|
||||
Spotted by Vikram Raj V, vsagar at attinteractive dot com
|
||||
* Add handling of surrogate pairs (json_tokener.c, test4.c, Makefile.am)
|
||||
Brent Miller, bdmiller at yahoo dash inc dot com
|
||||
* Correction to comment describing printbuf_memappend in printbuf.h
|
||||
Brent Miller, bdmiller at yahoo dash inc dot com
|
||||
|
||||
0.9
|
||||
* Add README.html README-WIN32.html config.h.win32 to Makefile.am
|
||||
Michael Clark, <michael@metaparadigm.com>
|
||||
* Add const qualifier to the json_tokener_parse functions
|
||||
Eric Haszlakiewicz, EHASZLA at transunion dot com
|
||||
* Rename min and max so we can never clash with C or C++ std library
|
||||
Ian Atha, thatha at yahoo dash inc dot com
|
||||
* Fix any noticeable spelling or grammar errors.
|
||||
* Make sure every va_start has a va_end.
|
||||
* Check all pointers for validity.
|
||||
Erik Hovland, erik at hovland dot org
|
||||
* Fix json_object_get_boolean to return false for empty string
|
||||
Spotted by Vitaly Kruglikov, Vitaly dot Kruglikov at palm dot com
|
||||
* optimizations to json_tokener_parse_ex(), printbuf_memappend()
|
||||
Brent Miller, bdmiller at yahoo dash inc dot com
|
||||
* Disable REFCOUNT_DEBUG by default in json_object.c
|
||||
* Don't use this as a variable, so we can compile with a C++ compiler
|
||||
* Add casts from void* to type of assignment when using malloc
|
||||
* Add #ifdef __cplusplus guards to all of the headers
|
||||
* Add typedefs for json_object, json_tokener, array_list, printbuf, lh_table
|
||||
Michael Clark, <michael@metaparadigm.com>
|
||||
* Null pointer dereference fix. Fix json_object_get_boolean strlen test
|
||||
to not return TRUE for zero length string. Remove redundant includes.
|
||||
Erik Hovland, erik at hovland dot org
|
||||
* Fixed warning reported by adding -Wstrict-prototypes
|
||||
-Wold-style-definition to the compilatin flags.
|
||||
Dotan Barak, dotanba at gmail dot com
|
||||
* Add const correctness to public interfaces
|
||||
Gerard Krol, g dot c dot krol at student dot tudelft dot nl
|
||||
|
||||
0.8
|
||||
* Add va_end for every va_start
|
||||
Dotan Barak, dotanba at gmail dot com
|
||||
* Add macros to enable compiling out debug code
|
||||
Geoffrey Young, geoff at modperlcookbook dot org
|
||||
* Fix bug with use of capital E in numbers with exponents
|
||||
Mateusz Loskot, mateusz at loskot dot net
|
||||
* Add stddef.h include
|
||||
* Patch allows for json-c compile with -Werror and not fail due to
|
||||
-Wmissing-prototypes -Wstrict-prototypes -Wmissing-declarations
|
||||
Geoffrey Young, geoff at modperlcookbook dot org
|
||||
|
||||
0.7
|
||||
* Add escaping of backslash to json output
|
||||
* Add escaping of foward slash on tokenizing and output
|
||||
* Changes to internal tokenizer from using recursion to
|
||||
using a depth state structure to allow incremental parsing
|
||||
|
||||
0.6
|
||||
* Fix bug in escaping of control characters
|
||||
Johan Björklund, johbjo09 at kth dot se
|
||||
* Remove include "config.h" from headers (should only
|
||||
be included from .c files)
|
||||
Michael Clark <michael@metaparadigm.com>
|
||||
|
||||
0.5
|
||||
* Make headers C++ compatible by change *this to *obj
|
||||
* Add ifdef C++ extern "C" to headers
|
||||
* Use simpler definition of min and max in bits.h
|
||||
Larry Lansing, llansing at fuzzynerd dot com
|
||||
|
||||
* Remove automake 1.6 requirement
|
||||
* Move autogen commands into autogen.sh. Update README
|
||||
* Remove error pointer special case for Windows
|
||||
* Change license from LGPL to MIT
|
||||
Michael Clark <michael@metaparadigm.com>
|
||||
|
||||
0.4
|
||||
* Fix additional error case in object parsing
|
||||
* Add back sign reversal in nested object parse as error pointer
|
||||
value is negative, while error value is positive.
|
||||
Michael Clark <michael@metaparadigm.com>
|
||||
|
||||
0.3
|
||||
* fix pointer arithmetic bug for error pointer check in is_error() macro
|
||||
* fix type passed to printbuf_memappend in json_tokener
|
||||
* update autotools bootstrap instructions in README
|
||||
Michael Clark <michael@metaparadigm.com>
|
||||
|
||||
0.2
|
||||
* printbuf.c - C. Watford (christopher.watford@gmail.com)
|
||||
Added a Win32/Win64 compliant implementation of vasprintf
|
||||
* debug.c - C. Watford (christopher.watford@gmail.com)
|
||||
Removed usage of vsyslog on Win32/Win64 systems, needs to be handled
|
||||
by a configure script
|
||||
* json_object.c - C. Watford (christopher.watford@gmail.com)
|
||||
Added scope operator to wrap usage of json_object_object_foreach, this
|
||||
needs to be rethought to be more ANSI C friendly
|
||||
* json_object.h - C. Watford (christopher.watford@gmail.com)
|
||||
Added Microsoft C friendly version of json_object_object_foreach
|
||||
* json_tokener.c - C. Watford (christopher.watford@gmail.com)
|
||||
Added a Win32/Win64 compliant implementation of strndup
|
||||
* json_util.c - C. Watford (christopher.watford@gmail.com)
|
||||
Added cast and mask to suffice size_t v. unsigned int conversion
|
||||
correctness
|
||||
* json_tokener.c - sign reversal issue on error info for nested object parse
|
||||
spotted by Johan Björklund (johbjo09 at kth.se)
|
||||
* json_object.c - escape " in json_escape_str
|
||||
* Change to automake and libtool to build shared and static library
|
||||
Michael Clark <michael@metaparadigm.com>
|
||||
|
||||
0.1
|
||||
* initial release
|
||||
1153
json-c/Doxyfile
Normal file
1153
json-c/Doxyfile
Normal file
File diff suppressed because it is too large
Load Diff
74
json-c/Makefile.am
Normal file
74
json-c/Makefile.am
Normal file
@@ -0,0 +1,74 @@
|
||||
include Makefile.am.inc
|
||||
|
||||
EXTRA_DIST = README.html README-WIN32.html config.h.win32 doc json-c.vcproj
|
||||
SUBDIRS = . tests
|
||||
|
||||
lib_LTLIBRARIES = libjson-c.la
|
||||
|
||||
pkgconfigdir = $(libdir)/pkgconfig
|
||||
pkgconfig_DATA = json-c.pc
|
||||
|
||||
libjson_cincludedir = $(includedir)/json-c
|
||||
libjson_cinclude_HEADERS = \
|
||||
arraylist.h \
|
||||
bits.h \
|
||||
debug.h \
|
||||
json.h \
|
||||
json_config.h \
|
||||
json_c_version.h \
|
||||
json_inttypes.h \
|
||||
json_object.h \
|
||||
json_object_iterator.h \
|
||||
json_object_private.h \
|
||||
json_tokener.h \
|
||||
json_util.h \
|
||||
linkhash.h \
|
||||
printbuf.h \
|
||||
random_seed.h
|
||||
|
||||
#libjsonx_includedir = $(libdir)/json-c-@VERSION@
|
||||
#
|
||||
#libjsonx_include_HEADERS = \
|
||||
# json_config.h
|
||||
|
||||
libjson_c_la_LDFLAGS = -version-info 2:0:0 -no-undefined @JSON_BSYMBOLIC_LDFLAGS@
|
||||
|
||||
libjson_c_la_SOURCES = \
|
||||
arraylist.c \
|
||||
debug.c \
|
||||
json_c_version.c \
|
||||
json_object.c \
|
||||
json_object_iterator.c \
|
||||
json_tokener.c \
|
||||
json_util.c \
|
||||
linkhash.c \
|
||||
printbuf.c \
|
||||
random_seed.c
|
||||
|
||||
|
||||
distclean-local:
|
||||
-rm -rf $(testsubdir)
|
||||
-rm -rf config.h.in~ Makefile.in aclocal.m4 autom4te.cache/ config.guess config.sub depcomp install-sh ltmain.sh missing
|
||||
-rm -f INSTALL test-driver tests/Makefile.in compile
|
||||
|
||||
maintainer-clean-local:
|
||||
-rm -rf configure
|
||||
|
||||
uninstall-local:
|
||||
rm -rf "$(DESTDIR)@includedir@/json-c"
|
||||
rm -f "$(DESTDIR)@includedir@/json"
|
||||
|
||||
ANDROID_CFLAGS = -I$(top_srcdir) -DHAVE_CONFIG_H
|
||||
|
||||
Android.mk: Makefile.am
|
||||
androgenizer -:PROJECT json-c \
|
||||
-:SHARED libjson-c \
|
||||
-:TAGS eng debug \
|
||||
-:REL_TOP $(top_srcdir) -:ABS_TOP $(abs_top_srcdir) \
|
||||
-:SOURCES $(libjson_c_la_SOURCES) $(nodist_libjson_c_la_SOURCES) \
|
||||
-:CFLAGS $(DEFS) $(ANDROID_CFLAGS) $(libjson_c_la_CFLAGS) \
|
||||
-:LDFLAGS $(libjson_c_la_LDFLAGS) $(libjson_c_la_LIBADD) \
|
||||
-:HEADER_TARGET json-c \
|
||||
-:HEADERS $(libjson_cinclude_HEADERS) \
|
||||
-:PASSTHROUGH LOCAL_ARM_MODE:=arm \
|
||||
> $@
|
||||
2
json-c/Makefile.am.inc
Normal file
2
json-c/Makefile.am.inc
Normal file
@@ -0,0 +1,2 @@
|
||||
AM_CFLAGS = -Wall -Werror -Wno-error=deprecated-declarations -Wextra -Wwrite-strings -Wno-unused-parameter -std=gnu99 -D_GNU_SOURCE -D_REENTRANT
|
||||
|
||||
0
json-c/README
Normal file
0
json-c/README
Normal file
50
json-c/README-WIN32.html
Normal file
50
json-c/README-WIN32.html
Normal file
@@ -0,0 +1,50 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>JSON-C - A JSON implementation in C - Win32 specific notes</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1" />
|
||||
</head>
|
||||
<body>
|
||||
<h2>Windows specific notes for JSON-C</h2>
|
||||
<p>Please send Win32 bug reports to <a href="mailto:christopher.watford@gmail.com">christopher.watford@gmail.com</a></p>
|
||||
<p><b>Win32 Specific Changes:</b></p>
|
||||
<ul>
|
||||
<li>
|
||||
Various functions have been redefined to their Win32 version (i.e. <tt>open</tt>
|
||||
on win32 is <tt>_open</tt>)</li>
|
||||
<li>
|
||||
Implemented missing functions from MS's libc (i.e. <tt>vasprintf</tt>)</li>
|
||||
<li>
|
||||
Added code to allow Win64 support without integer resizing issues, this
|
||||
probably makes it much nicer on 64bit machines everywhere (i.e. using <tt>ptrdiff_t</tt>
|
||||
for pointer math)</li>
|
||||
</ul>
|
||||
<p><b>Porting Changelog:</b></p>
|
||||
<dl>
|
||||
<dt><tt>printbuf.c</tt> - C. Watford (christopher.watford@gmail.com)</dt>
|
||||
<dd>
|
||||
Added a Win32/Win64 compliant implementation of <tt>vasprintf</tt></dd>
|
||||
<dt><tt>debug.c</tt> - C. Watford (christopher.watford@gmail.com)</dt>
|
||||
<dd>
|
||||
Removed usage of <tt>vsyslog</tt> on Win32/Win64 systems, needs to be handled
|
||||
by a configure script</dd>
|
||||
<dt><tt>json_object.c</tt> - C. Watford (christopher.watford@gmail.com)</dt>
|
||||
<dd>
|
||||
Added scope operator to wrap usage of <tt>json_object_object_foreach</tt>, this needs to be
|
||||
rethought to be more ANSI C friendly</dd>
|
||||
<dt><tt>json_object.h</tt> - C. Watford (christopher.watford@gmail.com)</dt>
|
||||
<dd>
|
||||
Added Microsoft C friendly version of <tt>json_object_object_foreach</tt></dd>
|
||||
<dt><tt>json_tokener.c</tt> - C. Watford (christopher.watford@gmail.com)</dt>
|
||||
<dd>
|
||||
Added a Win32/Win64 compliant implementation of <tt>strndup</tt></dd>
|
||||
<dt><tt>json_util.c</tt> - C. Watford (christopher.watford@gmail.com)</dt>
|
||||
<dd>
|
||||
Added cast and mask to suffice <tt>size_t</tt> v. <tt>unsigned int</tt>
|
||||
conversion correctness</dd>
|
||||
</dl>
|
||||
<p>This program is free software; you can redistribute it and/or modify it under
|
||||
the terms of the MIT License. See COPYING for details.</p>
|
||||
<hr />
|
||||
</body>
|
||||
</html>
|
||||
34
json-c/README.html
Normal file
34
json-c/README.html
Normal file
@@ -0,0 +1,34 @@
|
||||
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
|
||||
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
|
||||
<head>
|
||||
<title>JSON-C - A JSON implementation in C</title>
|
||||
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
|
||||
</head>
|
||||
<body>
|
||||
<h2>JSON-C - A JSON implementation in C</h2>
|
||||
|
||||
<h3>Overview</h3>
|
||||
<p>JSON-C implements a reference counting object model that allows you to easily
|
||||
construct JSON objects in C, output them as JSON formatted strings and parse
|
||||
JSON formatted strings back into the C representation of JSON objects.</p>
|
||||
|
||||
<h3>Building</h3>
|
||||
<p>To setup JSON-C to build on your system please run <tt>configure</tt> and <tt>make</tt>.</p>
|
||||
<p>If you are on Win32 and are not using the VS project file, be sure
|
||||
to rename <tt>config.h.win32</tt> to <tt>config.h</tt> before building.</p>
|
||||
|
||||
<h3>Documentation</h3>
|
||||
<P>Doxygen generated documentation exists <a href="doc/html/json__object_8h.html">here</a>
|
||||
and Win32 specific notes can be found <a href="README-WIN32.html">here</a>.</P>
|
||||
|
||||
<h3><a href="https://github.com/json-c/json-c">GIT Reposository</a></h3>
|
||||
<p><strong><code>git clone https://github.com/json-c/json-c.git</code></strong></p>
|
||||
|
||||
<h3><a href="http://groups.google.com/group/json-c">Mailing List</a></h3>
|
||||
<pi>Send email to <strong><code>json-c <i><at></i> googlegroups <i><dot></i> com</code></strong></p>
|
||||
|
||||
<h3><a href="COPYING">License</a></h3>
|
||||
<p>This program is free software; you can redistribute it and/or modify it under the terms of the MIT License..</p>
|
||||
<hr/>
|
||||
</body>
|
||||
</html>
|
||||
63
json-c/README.md
Normal file
63
json-c/README.md
Normal file
@@ -0,0 +1,63 @@
|
||||
`json-c`
|
||||
========
|
||||
|
||||
Building on Unix with `git`, `gcc` and `autotools`
|
||||
--------------------------------------------------
|
||||
|
||||
Home page for json-c: https://github.com/json-c/json-c/wiki
|
||||
|
||||
Caution: do **NOT** use sources from svn.metaparadigm.com,
|
||||
they are old.
|
||||
|
||||
Prerequisites:
|
||||
|
||||
- `gcc`, `clang`, or another C compiler
|
||||
- `libtool`
|
||||
|
||||
If you're not using a release tarball, you'll also need:
|
||||
|
||||
- `autoconf` (`autoreconf`)
|
||||
- `automake`
|
||||
|
||||
Make sure you have a complete `libtool` install, including `libtoolize`.
|
||||
|
||||
`json-c` GitHub repo: https://github.com/json-c/json-c
|
||||
|
||||
```bash
|
||||
$ git clone https://github.com/json-c/json-c.git
|
||||
$ cd json-c
|
||||
$ sh autogen.sh
|
||||
```
|
||||
|
||||
followed by
|
||||
|
||||
```bash
|
||||
$ ./configure
|
||||
$ make
|
||||
$ make install
|
||||
```
|
||||
|
||||
To build and run the test programs:
|
||||
|
||||
```bash
|
||||
$ make check
|
||||
```
|
||||
|
||||
Linking to `libjson-c`
|
||||
----------------------
|
||||
|
||||
If your system has `pkgconfig`,
|
||||
then you can just add this to your `makefile`:
|
||||
|
||||
```make
|
||||
CFLAGS += $(shell pkg-config --cflags json-c)
|
||||
LDFLAGS += $(shell pkg-config --libs json-c)
|
||||
```
|
||||
|
||||
Without `pkgconfig`, you would do something like this:
|
||||
|
||||
```make
|
||||
JSON_C_DIR=/path/to/json_c/install
|
||||
CFLAGS += -I$(JSON_C_DIR)/include/json-c
|
||||
LDFLAGS+= -L$(JSON_C_DIR)/lib -ljson-c
|
||||
```
|
||||
132
json-c/RELEASE_CHECKLIST.txt
Normal file
132
json-c/RELEASE_CHECKLIST.txt
Normal file
@@ -0,0 +1,132 @@
|
||||
|
||||
Release checklist:
|
||||
|
||||
release=0.12
|
||||
git clone https://github.com/json-c/json-c json-c-${release}
|
||||
cd json-c-${release}
|
||||
|
||||
Check that the compile works on Linux
|
||||
Check that the compile works on NetBSD
|
||||
Check that the compile works on Windows
|
||||
Check ChangeLog to see if anything should be added.
|
||||
Make any fixes/changes *before* branching.
|
||||
|
||||
git branch json-c-${release}
|
||||
git checkout json-c-${release}
|
||||
|
||||
------------
|
||||
|
||||
Update the version in json_c_version.h
|
||||
Update the version in Doxyfile
|
||||
Update the version in configure.ac
|
||||
Use ${release}.
|
||||
|
||||
Update the libjson_la_LDFLAGS line in Makefile.am to the new version.
|
||||
Generally, unless we're doing a major release, change:
|
||||
-version-info x:y:z
|
||||
to
|
||||
-version-info x:y+1:z
|
||||
|
||||
------------
|
||||
|
||||
Generate the configure script and other files:
|
||||
sh autogen.sh
|
||||
git add -f Makefile.in aclocal.m4 config.guess \
|
||||
config.sub configure depcomp install-sh \
|
||||
ltmain.sh missing tests/Makefile.in \
|
||||
INSTALL
|
||||
|
||||
# check for anything else to be added:
|
||||
git status --ignored
|
||||
git commit
|
||||
|
||||
------------
|
||||
|
||||
Generate the doxygen documentation:
|
||||
doxygen
|
||||
git add -f doc
|
||||
git commit doc
|
||||
|
||||
------------
|
||||
|
||||
cd ..
|
||||
echo .git > excludes
|
||||
echo autom4te.cache >> excludes
|
||||
tar -czf json-c-${release}.tar.gz -X excludes json-c-${release}
|
||||
|
||||
echo doc >> excludes
|
||||
tar -czf json-c-${release}-nodoc.tar.gz -X excludes json-c-${release}
|
||||
|
||||
------------
|
||||
|
||||
Tag the branch:
|
||||
cd json-c-${release}
|
||||
git tag -a json-c-${release}-$(date +%Y%m%d) -m "Release json-c-${release}"
|
||||
|
||||
git push origin json-c-${release}
|
||||
git push --tags
|
||||
|
||||
------------
|
||||
|
||||
Go to Amazon S3 service at:
|
||||
https://console.aws.amazon.com/s3/
|
||||
|
||||
Upload the two tarballs in the json-c_releases folder.
|
||||
When uploading, use "Reduced Redundancy", and make the uploaded files publicly accessible.
|
||||
|
||||
Logout of Amazon S3, and verify that the files are visible.
|
||||
https://s3.amazonaws.com/json-c_releases/releases/index.html
|
||||
|
||||
===================================
|
||||
|
||||
Post-release checklist:
|
||||
|
||||
git checkout master
|
||||
Add new section to ChangeLog
|
||||
Update the version in json_c_version.h
|
||||
Update the version in Doxyfile
|
||||
Update the version in configure.ac
|
||||
Use ${release}.99 to indicate a version "newer" than anything on the branch.
|
||||
|
||||
Leave the libjson_la_LDFLAGS line in Makefile.am alone.
|
||||
For more details see:
|
||||
http://www.gnu.org/software/libtool/manual/html_node/Updating-version-info.html
|
||||
|
||||
------------
|
||||
|
||||
Update the gh-pages branch with new docs:
|
||||
|
||||
cd json-c-${release}
|
||||
git checkout json-c-${release}
|
||||
cd ..
|
||||
|
||||
git clone -b gh-pages https://github.com/json-c/json-c json-c-pages
|
||||
cd json-c-pages
|
||||
mkdir json-c-${release}
|
||||
cp -R ../json-c-${release}/doc json-c-${release}/.
|
||||
cp ../json-c-${release}/README-WIN32.html json-c-${release}/.
|
||||
git add json-c-${release}
|
||||
git commit
|
||||
|
||||
vi index.html
|
||||
Add/change links to current release.
|
||||
|
||||
git commit index.html
|
||||
|
||||
git push
|
||||
|
||||
------------
|
||||
|
||||
Update checksums on wiki page.
|
||||
|
||||
cd ..
|
||||
openssl sha -sha256 json-c*gz
|
||||
openssl md5 json-c*gz
|
||||
|
||||
Copy and paste this output into the wiki page at:
|
||||
https://github.com/json-c/json-c/wiki
|
||||
|
||||
------------
|
||||
|
||||
Send an email to the mailing list.
|
||||
|
||||
102
json-c/arraylist.c
Normal file
102
json-c/arraylist.c
Normal file
@@ -0,0 +1,102 @@
|
||||
/*
|
||||
* $Id: arraylist.c,v 1.4 2006/01/26 02:16:28 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#ifdef STDC_HEADERS
|
||||
# include <stdlib.h>
|
||||
# include <string.h>
|
||||
#endif /* STDC_HEADERS */
|
||||
|
||||
#if defined(HAVE_STRINGS_H) && !defined(_STRING_H) && !defined(__USE_BSD)
|
||||
# include <strings.h>
|
||||
#endif /* HAVE_STRINGS_H */
|
||||
|
||||
#include "arraylist.h"
|
||||
|
||||
struct array_list*
|
||||
array_list_new(array_list_free_fn *free_fn)
|
||||
{
|
||||
struct array_list *arr;
|
||||
|
||||
arr = (struct array_list*)calloc(1, sizeof(struct array_list));
|
||||
if(!arr) return NULL;
|
||||
arr->size = ARRAY_LIST_DEFAULT_SIZE;
|
||||
arr->length = 0;
|
||||
arr->free_fn = free_fn;
|
||||
if(!(arr->array = (void**)calloc(sizeof(void*), arr->size))) {
|
||||
free(arr);
|
||||
return NULL;
|
||||
}
|
||||
return arr;
|
||||
}
|
||||
|
||||
extern void
|
||||
array_list_free(struct array_list *arr)
|
||||
{
|
||||
int i;
|
||||
for(i = 0; i < arr->length; i++)
|
||||
if(arr->array[i]) arr->free_fn(arr->array[i]);
|
||||
free(arr->array);
|
||||
free(arr);
|
||||
}
|
||||
|
||||
void*
|
||||
array_list_get_idx(struct array_list *arr, int i)
|
||||
{
|
||||
if(i >= arr->length) return NULL;
|
||||
return arr->array[i];
|
||||
}
|
||||
|
||||
static int array_list_expand_internal(struct array_list *arr, int max)
|
||||
{
|
||||
void *t;
|
||||
int new_size;
|
||||
|
||||
if(max < arr->size) return 0;
|
||||
new_size = arr->size << 1;
|
||||
if (new_size < max)
|
||||
new_size = max;
|
||||
if(!(t = realloc(arr->array, new_size*sizeof(void*)))) return -1;
|
||||
arr->array = (void**)t;
|
||||
(void)memset(arr->array + arr->size, 0, (new_size-arr->size)*sizeof(void*));
|
||||
arr->size = new_size;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
array_list_put_idx(struct array_list *arr, int idx, void *data)
|
||||
{
|
||||
if(array_list_expand_internal(arr, idx+1)) return -1;
|
||||
if(arr->array[idx]) arr->free_fn(arr->array[idx]);
|
||||
arr->array[idx] = data;
|
||||
if(arr->length <= idx) arr->length = idx + 1;
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
array_list_add(struct array_list *arr, void *data)
|
||||
{
|
||||
return array_list_put_idx(arr, arr->length, data);
|
||||
}
|
||||
|
||||
void
|
||||
array_list_sort(struct array_list *arr, int(*sort_fn)(const void *, const void *))
|
||||
{
|
||||
qsort(arr->array, arr->length, sizeof(arr->array[0]),
|
||||
(int (*)(const void *, const void *))sort_fn);
|
||||
}
|
||||
|
||||
int
|
||||
array_list_length(struct array_list *arr)
|
||||
{
|
||||
return arr->length;
|
||||
}
|
||||
56
json-c/arraylist.h
Normal file
56
json-c/arraylist.h
Normal file
@@ -0,0 +1,56 @@
|
||||
/*
|
||||
* $Id: arraylist.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _arraylist_h_
|
||||
#define _arraylist_h_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define ARRAY_LIST_DEFAULT_SIZE 32
|
||||
|
||||
typedef void (array_list_free_fn) (void *data);
|
||||
|
||||
struct array_list
|
||||
{
|
||||
void **array;
|
||||
int length;
|
||||
int size;
|
||||
array_list_free_fn *free_fn;
|
||||
};
|
||||
|
||||
extern struct array_list*
|
||||
array_list_new(array_list_free_fn *free_fn);
|
||||
|
||||
extern void
|
||||
array_list_free(struct array_list *al);
|
||||
|
||||
extern void*
|
||||
array_list_get_idx(struct array_list *al, int i);
|
||||
|
||||
extern int
|
||||
array_list_put_idx(struct array_list *al, int i, void *data);
|
||||
|
||||
extern int
|
||||
array_list_add(struct array_list *al, void *data);
|
||||
|
||||
extern int
|
||||
array_list_length(struct array_list *al);
|
||||
|
||||
extern void
|
||||
array_list_sort(struct array_list *arr, int(*compar)(const void *, const void *));
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
13
json-c/autogen.sh
Executable file
13
json-c/autogen.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/bin/sh
|
||||
autoreconf -v --install || exit 1
|
||||
|
||||
# If there are any options, assume the user wants to run configure.
|
||||
# To run configure w/o any options, use ./autogen.sh --configure
|
||||
if [ $# -gt 0 ] ; then
|
||||
case "$1" in
|
||||
--conf*)
|
||||
shift 1
|
||||
;;
|
||||
esac
|
||||
exec ./configure "$@"
|
||||
fi
|
||||
35
json-c/bits.h
Normal file
35
json-c/bits.h
Normal file
@@ -0,0 +1,35 @@
|
||||
/**
|
||||
* @file
|
||||
* @deprecated Use json_util.h instead.
|
||||
*
|
||||
* $Id: bits.h,v 1.10 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _bits_h_
|
||||
#define _bits_h_
|
||||
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
#define hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9)
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
#define error_ptr(error) ((void*)error)
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
#define error_description(error) (json_tokener_get_error(error))
|
||||
/**
|
||||
* @deprecated
|
||||
*/
|
||||
#define is_error(ptr) (ptr == NULL)
|
||||
|
||||
#endif
|
||||
2
json-c/check.log
Normal file
2
json-c/check.log
Normal file
@@ -0,0 +1,2 @@
|
||||
HEAD is now at 6442a2f... json-c: Add libjson to the vendor image
|
||||
HEAD is now at 6442a2f... json-c: Add libjson to the vendor image
|
||||
178
json-c/config.h
Normal file
178
json-c/config.h
Normal file
@@ -0,0 +1,178 @@
|
||||
/* config.h. Generated from config.h.in by configure. */
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Enable RDRANR Hardware RNG Hash Seed */
|
||||
/* #undef ENABLE_RDRAND */
|
||||
|
||||
/* Define if .gnu.warning accepts long strings. */
|
||||
/* #undef HAS_GNU_WARNING_LONG */
|
||||
|
||||
/* Define to 1 if you have the declaration of `INFINITY', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL_INFINITY 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't.
|
||||
*/
|
||||
#define HAVE_DECL_ISINF 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't.
|
||||
*/
|
||||
#define HAVE_DECL_ISNAN 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `nan', and to 0 if you don't. */
|
||||
#define HAVE_DECL_NAN 1
|
||||
|
||||
/* Define to 1 if you have the declaration of `_finite', and to 0 if you
|
||||
don't. */
|
||||
#define HAVE_DECL__FINITE 0
|
||||
|
||||
/* Define to 1 if you have the declaration of `_isnan', and to 0 if you don't.
|
||||
*/
|
||||
#define HAVE_DECL__ISNAN 0
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#define HAVE_DLFCN_H 1
|
||||
|
||||
/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
|
||||
/* #undef HAVE_DOPRNT */
|
||||
|
||||
/* Define to 1 if you have the <endian.h> header file. */
|
||||
#define HAVE_ENDIAN_H 1
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#define HAVE_FCNTL_H 1
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <limits.h> header file. */
|
||||
#define HAVE_LIMITS_H 1
|
||||
|
||||
/* Define to 1 if you have the <locale.h> header file. */
|
||||
#define HAVE_LOCALE_H 1
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
|
||||
to 0 otherwise. */
|
||||
#define HAVE_MALLOC 1
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#define HAVE_MEMORY_H 1
|
||||
|
||||
/* Define to 1 if you have the `open' function. */
|
||||
#define HAVE_OPEN 1
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `realloc' function,
|
||||
and to 0 otherwise. */
|
||||
#define HAVE_REALLOC 1
|
||||
|
||||
/* Define to 1 if you have the `setlocale' function. */
|
||||
#define HAVE_SETLOCALE 1
|
||||
|
||||
/* Define to 1 if you have the `snprintf' function. */
|
||||
#define HAVE_SNPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the <stdarg.h> header file. */
|
||||
#define HAVE_STDARG_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#define HAVE_STDINT_H 1
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#define HAVE_STDLIB_H 1
|
||||
|
||||
/* Define to 1 if you have the `strcasecmp' function. */
|
||||
#define HAVE_STRCASECMP 1
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#define HAVE_STRDUP 1
|
||||
|
||||
/* Define to 1 if you have the `strerror' function. */
|
||||
#define HAVE_STRERROR 1
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#define HAVE_STRINGS_H 1
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#define HAVE_STRING_H 1
|
||||
|
||||
/* Define to 1 if you have the `strncasecmp' function. */
|
||||
#define HAVE_STRNCASECMP 1
|
||||
|
||||
/* Define to 1 if you have the <syslog.h> header file. */
|
||||
#define HAVE_SYSLOG_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/cdefs.h> header file. */
|
||||
#define HAVE_SYS_CDEFS_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||
#define HAVE_SYS_PARAM_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#define HAVE_SYS_STAT_H 1
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#define HAVE_SYS_TYPES_H 1
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#define HAVE_UNISTD_H 1
|
||||
|
||||
/* Define to 1 if you have the `vasprintf' function. */
|
||||
#define HAVE_VASPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the `vprintf' function. */
|
||||
#define HAVE_VPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the `vsnprintf' function. */
|
||||
#define HAVE_VSNPRINTF 1
|
||||
|
||||
/* Define to 1 if you have the `vsyslog' function. */
|
||||
#define HAVE_VSYSLOG 1
|
||||
|
||||
/* Public define for json_inttypes.h */
|
||||
#define JSON_C_HAVE_INTTYPES_H 1
|
||||
|
||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||
*/
|
||||
#define LT_OBJDIR ".libs/"
|
||||
|
||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
||||
/* #undef NO_MINUS_C_MINUS_O */
|
||||
|
||||
/* Name of package */
|
||||
#define PACKAGE "json-c"
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#define PACKAGE_BUGREPORT "json-c@googlegroups.com"
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#define PACKAGE_NAME "json-c"
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#define PACKAGE_STRING "json-c 0.12.99"
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#define PACKAGE_TARNAME "json-c"
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#define PACKAGE_URL ""
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#define PACKAGE_VERSION "0.12.99"
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#define STDC_HEADERS 1
|
||||
|
||||
/* Version number of package */
|
||||
#define VERSION "0.12.99"
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
/* #undef const */
|
||||
|
||||
/* Define to rpl_malloc if the replacement function should be used. */
|
||||
/* #undef malloc */
|
||||
|
||||
/* Define to rpl_realloc if the replacement function should be used. */
|
||||
/* #undef realloc */
|
||||
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
/* #undef size_t */
|
||||
177
json-c/config.h.in
Normal file
177
json-c/config.h.in
Normal file
@@ -0,0 +1,177 @@
|
||||
/* config.h.in. Generated from configure.ac by autoheader. */
|
||||
|
||||
/* Enable RDRANR Hardware RNG Hash Seed */
|
||||
#undef ENABLE_RDRAND
|
||||
|
||||
/* Define if .gnu.warning accepts long strings. */
|
||||
#undef HAS_GNU_WARNING_LONG
|
||||
|
||||
/* Define to 1 if you have the declaration of `INFINITY', and to 0 if you
|
||||
don't. */
|
||||
#undef HAVE_DECL_INFINITY
|
||||
|
||||
/* Define to 1 if you have the declaration of `isinf', and to 0 if you don't.
|
||||
*/
|
||||
#undef HAVE_DECL_ISINF
|
||||
|
||||
/* Define to 1 if you have the declaration of `isnan', and to 0 if you don't.
|
||||
*/
|
||||
#undef HAVE_DECL_ISNAN
|
||||
|
||||
/* Define to 1 if you have the declaration of `nan', and to 0 if you don't. */
|
||||
#undef HAVE_DECL_NAN
|
||||
|
||||
/* Define to 1 if you have the declaration of `_finite', and to 0 if you
|
||||
don't. */
|
||||
#undef HAVE_DECL__FINITE
|
||||
|
||||
/* Define to 1 if you have the declaration of `_isnan', and to 0 if you don't.
|
||||
*/
|
||||
#undef HAVE_DECL__ISNAN
|
||||
|
||||
/* Define to 1 if you have the <dlfcn.h> header file. */
|
||||
#undef HAVE_DLFCN_H
|
||||
|
||||
/* Define to 1 if you don't have `vprintf' but do have `_doprnt.' */
|
||||
#undef HAVE_DOPRNT
|
||||
|
||||
/* Define to 1 if you have the <endian.h> header file. */
|
||||
#undef HAVE_ENDIAN_H
|
||||
|
||||
/* Define to 1 if you have the <fcntl.h> header file. */
|
||||
#undef HAVE_FCNTL_H
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef HAVE_INTTYPES_H
|
||||
|
||||
/* Define to 1 if you have the <limits.h> header file. */
|
||||
#undef HAVE_LIMITS_H
|
||||
|
||||
/* Define to 1 if you have the <locale.h> header file. */
|
||||
#undef HAVE_LOCALE_H
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `malloc' function, and
|
||||
to 0 otherwise. */
|
||||
#undef HAVE_MALLOC
|
||||
|
||||
/* Define to 1 if you have the <memory.h> header file. */
|
||||
#undef HAVE_MEMORY_H
|
||||
|
||||
/* Define to 1 if you have the `open' function. */
|
||||
#undef HAVE_OPEN
|
||||
|
||||
/* Define to 1 if your system has a GNU libc compatible `realloc' function,
|
||||
and to 0 otherwise. */
|
||||
#undef HAVE_REALLOC
|
||||
|
||||
/* Define to 1 if you have the `setlocale' function. */
|
||||
#undef HAVE_SETLOCALE
|
||||
|
||||
/* Define to 1 if you have the `snprintf' function. */
|
||||
#undef HAVE_SNPRINTF
|
||||
|
||||
/* Define to 1 if you have the <stdarg.h> header file. */
|
||||
#undef HAVE_STDARG_H
|
||||
|
||||
/* Define to 1 if you have the <stdint.h> header file. */
|
||||
#undef HAVE_STDINT_H
|
||||
|
||||
/* Define to 1 if you have the <stdlib.h> header file. */
|
||||
#undef HAVE_STDLIB_H
|
||||
|
||||
/* Define to 1 if you have the `strcasecmp' function. */
|
||||
#undef HAVE_STRCASECMP
|
||||
|
||||
/* Define to 1 if you have the `strdup' function. */
|
||||
#undef HAVE_STRDUP
|
||||
|
||||
/* Define to 1 if you have the `strerror' function. */
|
||||
#undef HAVE_STRERROR
|
||||
|
||||
/* Define to 1 if you have the <strings.h> header file. */
|
||||
#undef HAVE_STRINGS_H
|
||||
|
||||
/* Define to 1 if you have the <string.h> header file. */
|
||||
#undef HAVE_STRING_H
|
||||
|
||||
/* Define to 1 if you have the `strncasecmp' function. */
|
||||
#undef HAVE_STRNCASECMP
|
||||
|
||||
/* Define to 1 if you have the <syslog.h> header file. */
|
||||
#undef HAVE_SYSLOG_H
|
||||
|
||||
/* Define to 1 if you have the <sys/cdefs.h> header file. */
|
||||
#undef HAVE_SYS_CDEFS_H
|
||||
|
||||
/* Define to 1 if you have the <sys/param.h> header file. */
|
||||
#undef HAVE_SYS_PARAM_H
|
||||
|
||||
/* Define to 1 if you have the <sys/stat.h> header file. */
|
||||
#undef HAVE_SYS_STAT_H
|
||||
|
||||
/* Define to 1 if you have the <sys/types.h> header file. */
|
||||
#undef HAVE_SYS_TYPES_H
|
||||
|
||||
/* Define to 1 if you have the <unistd.h> header file. */
|
||||
#undef HAVE_UNISTD_H
|
||||
|
||||
/* Define to 1 if you have the `vasprintf' function. */
|
||||
#undef HAVE_VASPRINTF
|
||||
|
||||
/* Define to 1 if you have the `vprintf' function. */
|
||||
#undef HAVE_VPRINTF
|
||||
|
||||
/* Define to 1 if you have the `vsnprintf' function. */
|
||||
#undef HAVE_VSNPRINTF
|
||||
|
||||
/* Define to 1 if you have the `vsyslog' function. */
|
||||
#undef HAVE_VSYSLOG
|
||||
|
||||
/* Public define for json_inttypes.h */
|
||||
#undef JSON_C_HAVE_INTTYPES_H
|
||||
|
||||
/* Define to the sub-directory in which libtool stores uninstalled libraries.
|
||||
*/
|
||||
#undef LT_OBJDIR
|
||||
|
||||
/* Define to 1 if your C compiler doesn't accept -c and -o together. */
|
||||
#undef NO_MINUS_C_MINUS_O
|
||||
|
||||
/* Name of package */
|
||||
#undef PACKAGE
|
||||
|
||||
/* Define to the address where bug reports for this package should be sent. */
|
||||
#undef PACKAGE_BUGREPORT
|
||||
|
||||
/* Define to the full name of this package. */
|
||||
#undef PACKAGE_NAME
|
||||
|
||||
/* Define to the full name and version of this package. */
|
||||
#undef PACKAGE_STRING
|
||||
|
||||
/* Define to the one symbol short name of this package. */
|
||||
#undef PACKAGE_TARNAME
|
||||
|
||||
/* Define to the home page for this package. */
|
||||
#undef PACKAGE_URL
|
||||
|
||||
/* Define to the version of this package. */
|
||||
#undef PACKAGE_VERSION
|
||||
|
||||
/* Define to 1 if you have the ANSI C header files. */
|
||||
#undef STDC_HEADERS
|
||||
|
||||
/* Version number of package */
|
||||
#undef VERSION
|
||||
|
||||
/* Define to empty if `const' does not conform to ANSI C. */
|
||||
#undef const
|
||||
|
||||
/* Define to rpl_malloc if the replacement function should be used. */
|
||||
#undef malloc
|
||||
|
||||
/* Define to rpl_realloc if the replacement function should be used. */
|
||||
#undef realloc
|
||||
|
||||
/* Define to `unsigned int' if <sys/types.h> does not define. */
|
||||
#undef size_t
|
||||
107
json-c/configure.ac
Normal file
107
json-c/configure.ac
Normal file
@@ -0,0 +1,107 @@
|
||||
AC_PREREQ(2.52)
|
||||
|
||||
# Process this file with autoconf to produce a configure script.
|
||||
AC_INIT([json-c], 0.12.99, [json-c@googlegroups.com])
|
||||
|
||||
AM_INIT_AUTOMAKE
|
||||
|
||||
AC_PROG_MAKE_SET
|
||||
|
||||
AC_ARG_ENABLE(rdrand,
|
||||
AS_HELP_STRING([--enable-rdrand],
|
||||
[Enable RDRAND Hardware RNG Hash Seed generation on supported x86/x64 platforms.]),
|
||||
[if test x$enableval = xyes; then
|
||||
enable_rdrand=yes
|
||||
AC_DEFINE(ENABLE_RDRAND, 1, [Enable RDRANR Hardware RNG Hash Seed])
|
||||
fi])
|
||||
|
||||
if test "x$enable_rdrand" = "xyes"; then
|
||||
AC_MSG_RESULT([RDRAND Hardware RNG Hash Seed enabled on supported x86/x64 platforms])
|
||||
else
|
||||
AC_MSG_RESULT([RDRAND Hardware RNG Hash Seed disabled. Use --enable-rdrand to enable])
|
||||
fi
|
||||
|
||||
# Checks for programs.
|
||||
|
||||
# Checks for libraries.
|
||||
|
||||
# Checks for header files.
|
||||
AM_PROG_CC_C_O
|
||||
AC_CONFIG_HEADER(config.h)
|
||||
AC_CONFIG_HEADER(json_config.h)
|
||||
AC_HEADER_STDC
|
||||
AC_CHECK_HEADERS(fcntl.h limits.h strings.h syslog.h unistd.h [sys/cdefs.h] [sys/param.h] stdarg.h locale.h endian.h)
|
||||
AC_CHECK_HEADER(inttypes.h,[AC_DEFINE([JSON_C_HAVE_INTTYPES_H],[1],[Public define for json_inttypes.h])])
|
||||
|
||||
# Checks for typedefs, structures, and compiler characteristics.
|
||||
AC_C_CONST
|
||||
AC_TYPE_SIZE_T
|
||||
|
||||
# Checks for library functions.
|
||||
AC_FUNC_VPRINTF
|
||||
AC_FUNC_MEMCMP
|
||||
AC_FUNC_MALLOC
|
||||
AC_FUNC_REALLOC
|
||||
AC_CHECK_FUNCS(strcasecmp strdup strerror snprintf vsnprintf vasprintf open vsyslog strncasecmp setlocale)
|
||||
AC_CHECK_DECLS([INFINITY], [], [], [[#include <math.h>]])
|
||||
AC_CHECK_DECLS([nan], [], [], [[#include <math.h>]])
|
||||
AC_CHECK_DECLS([isnan], [], [], [[#include <math.h>]])
|
||||
AC_CHECK_DECLS([isinf], [], [], [[#include <math.h>]])
|
||||
AC_CHECK_DECLS([_isnan], [], [], [[#include <float.h>]])
|
||||
AC_CHECK_DECLS([_finite], [], [], [[#include <float.h>]])
|
||||
|
||||
#check if .section.gnu.warning accepts long strings (for __warn_references)
|
||||
AC_LANG_PUSH([C])
|
||||
|
||||
AC_MSG_CHECKING([if .gnu.warning accepts long strings])
|
||||
AC_LINK_IFELSE([AC_LANG_SOURCE([[
|
||||
extern void json_object_get();
|
||||
__asm__(".section .gnu.json_object_get,\n\t.ascii \"Please link against libjson-c instead of libjson\"\n\t.text");
|
||||
|
||||
int main(int c,char* v) {return 0;}
|
||||
]])], [
|
||||
AC_DEFINE(HAS_GNU_WARNING_LONG, 1, [Define if .gnu.warning accepts long strings.])
|
||||
AC_MSG_RESULT(yes)
|
||||
], [
|
||||
AC_MSG_RESULT(no)
|
||||
])
|
||||
|
||||
AC_LANG_POP([C])
|
||||
|
||||
AM_PROG_LIBTOOL
|
||||
|
||||
# Check for the -Bsymbolic-functions linker flag
|
||||
AC_ARG_ENABLE([Bsymbolic],
|
||||
[AS_HELP_STRING([--disable-Bsymbolic], [Avoid linking with -Bsymbolic-function])],
|
||||
[],
|
||||
[enable_Bsymbolic=check])
|
||||
|
||||
AS_IF([test "x$enable_Bsymbolic" = "xcheck"],
|
||||
[
|
||||
saved_LDFLAGS="${LDFLAGS}"
|
||||
AC_MSG_CHECKING([for -Bsymbolic-functions linker flag])
|
||||
LDFLAGS=-Wl,-Bsymbolic-functions
|
||||
AC_TRY_LINK([], [int main (void) { return 0; }],
|
||||
[
|
||||
AC_MSG_RESULT([yes])
|
||||
enable_Bsymbolic=yes
|
||||
],
|
||||
[
|
||||
AC_MSG_RESULT([no])
|
||||
enable_Bsymbolic=no
|
||||
])
|
||||
LDFLAGS="${saved_LDFLAGS}"
|
||||
])
|
||||
|
||||
AS_IF([test "x$enable_Bsymbolic" = "xyes"], [JSON_BSYMBOLIC_LDFLAGS=-Wl[,]-Bsymbolic-functions])
|
||||
AC_SUBST(JSON_BSYMBOLIC_LDFLAGS)
|
||||
|
||||
AC_CONFIG_FILES([
|
||||
Makefile
|
||||
json-c.pc
|
||||
tests/Makefile
|
||||
json-c-uninstalled.pc
|
||||
])
|
||||
|
||||
AC_OUTPUT
|
||||
|
||||
83
json-c/debug.c
Normal file
83
json-c/debug.c
Normal file
@@ -0,0 +1,83 @@
|
||||
/*
|
||||
* $Id: debug.c,v 1.5 2006/01/26 02:16:28 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <stdarg.h>
|
||||
|
||||
#if HAVE_SYSLOG_H
|
||||
# include <syslog.h>
|
||||
#endif /* HAVE_SYSLOG_H */
|
||||
|
||||
#if HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif /* HAVE_UNISTD_H */
|
||||
|
||||
#if HAVE_SYS_PARAM_H
|
||||
#include <sys/param.h>
|
||||
#endif /* HAVE_SYS_PARAM_H */
|
||||
|
||||
#include "debug.h"
|
||||
|
||||
static int _syslog = 0;
|
||||
static int _debug = 0;
|
||||
|
||||
void mc_set_debug(int debug) { _debug = debug; }
|
||||
int mc_get_debug(void) { return _debug; }
|
||||
|
||||
extern void mc_set_syslog(int syslog)
|
||||
{
|
||||
_syslog = syslog;
|
||||
}
|
||||
|
||||
void mc_debug(const char *msg, ...)
|
||||
{
|
||||
va_list ap;
|
||||
if(_debug) {
|
||||
va_start(ap, msg);
|
||||
#if HAVE_VSYSLOG
|
||||
if(_syslog) {
|
||||
vsyslog(LOG_DEBUG, msg, ap);
|
||||
} else
|
||||
#endif
|
||||
vprintf(msg, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
}
|
||||
|
||||
void mc_error(const char *msg, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, msg);
|
||||
#if HAVE_VSYSLOG
|
||||
if(_syslog) {
|
||||
vsyslog(LOG_ERR, msg, ap);
|
||||
} else
|
||||
#endif
|
||||
vfprintf(stderr, msg, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
|
||||
void mc_info(const char *msg, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, msg);
|
||||
#if HAVE_VSYSLOG
|
||||
if(_syslog) {
|
||||
vsyslog(LOG_INFO, msg, ap);
|
||||
} else
|
||||
#endif
|
||||
vfprintf(stderr, msg, ap);
|
||||
va_end(ap);
|
||||
}
|
||||
71
json-c/debug.h
Normal file
71
json-c/debug.h
Normal file
@@ -0,0 +1,71 @@
|
||||
/*
|
||||
* $Id: debug.h,v 1.5 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
* Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _DEBUG_H_
|
||||
#define _DEBUG_H_
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
extern void mc_set_debug(int debug);
|
||||
extern int mc_get_debug(void);
|
||||
|
||||
extern void mc_set_syslog(int syslog);
|
||||
|
||||
extern void mc_debug(const char *msg, ...);
|
||||
extern void mc_error(const char *msg, ...);
|
||||
extern void mc_info(const char *msg, ...);
|
||||
|
||||
#ifndef __STRING
|
||||
#define __STRING(x) #x
|
||||
#endif
|
||||
|
||||
#ifndef PARSER_BROKEN_FIXED
|
||||
|
||||
#define JASSERT(cond) do {} while(0)
|
||||
|
||||
#else
|
||||
|
||||
#define JASSERT(cond) do { \
|
||||
if (!(cond)) { \
|
||||
mc_error("cjson assert failure %s:%d : cond \"" __STRING(cond) "failed\n", __FILE__, __LINE__); \
|
||||
*(int *)0 = 1;\
|
||||
abort(); \
|
||||
}\
|
||||
} while(0)
|
||||
|
||||
#endif
|
||||
|
||||
#define MC_ERROR(x, ...) mc_error(x, ##__VA_ARGS__)
|
||||
|
||||
#ifdef MC_MAINTAINER_MODE
|
||||
#define MC_SET_DEBUG(x) mc_set_debug(x)
|
||||
#define MC_GET_DEBUG() mc_get_debug()
|
||||
#define MC_SET_SYSLOG(x) mc_set_syslog(x)
|
||||
#define MC_DEBUG(x, ...) mc_debug(x, ##__VA_ARGS__)
|
||||
#define MC_INFO(x, ...) mc_info(x, ##__VA_ARGS__)
|
||||
#else
|
||||
#define MC_SET_DEBUG(x) if (0) mc_set_debug(x)
|
||||
#define MC_GET_DEBUG() (0)
|
||||
#define MC_SET_SYSLOG(x) if (0) mc_set_syslog(x)
|
||||
#define MC_DEBUG(x, ...) if (0) mc_debug(x, ##__VA_ARGS__)
|
||||
#define MC_INFO(x, ...) if (0) mc_info(x, ##__VA_ARGS__)
|
||||
#endif
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
11
json-c/json-c-uninstalled.pc.in
Normal file
11
json-c/json-c-uninstalled.pc.in
Normal file
@@ -0,0 +1,11 @@
|
||||
prefix=
|
||||
exec_prefix=
|
||||
libdir=@abs_top_builddir@
|
||||
includedir=@abs_top_srcdir@
|
||||
|
||||
Name: json
|
||||
Description: JSON implementation in C
|
||||
Version: @VERSION@
|
||||
Requires:
|
||||
Libs: -L@abs_top_builddir@ -ljson-c
|
||||
Cflags: -I@abs_top_srcdir@
|
||||
11
json-c/json-c.pc.in
Normal file
11
json-c/json-c.pc.in
Normal file
@@ -0,0 +1,11 @@
|
||||
prefix=@prefix@
|
||||
exec_prefix=@exec_prefix@
|
||||
libdir=@libdir@
|
||||
includedir=@includedir@
|
||||
|
||||
Name: json-c
|
||||
Description: JSON implementation in C
|
||||
Version: @VERSION@
|
||||
Requires:
|
||||
Libs: -L${libdir} -ljson-c
|
||||
Cflags: -I${includedir}/json-c
|
||||
33
json-c/json.h
Normal file
33
json-c/json.h
Normal file
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
* $Id: json.h,v 1.6 2006/01/26 02:16:28 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
* Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _json_h_
|
||||
#define _json_h_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#include "debug.h"
|
||||
#include "linkhash.h"
|
||||
#include "arraylist.h"
|
||||
#include "json_util.h"
|
||||
#include "json_object.h"
|
||||
#include "json_tokener.h"
|
||||
#include "json_object_iterator.h"
|
||||
#include "json_c_version.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
20
json-c/json_c_version.c
Normal file
20
json-c/json_c_version.c
Normal file
@@ -0,0 +1,20 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Eric Haszlakiewicz
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*/
|
||||
#include "config.h"
|
||||
|
||||
#include "json_c_version.h"
|
||||
|
||||
const char *json_c_version(void)
|
||||
{
|
||||
return JSON_C_VERSION;
|
||||
}
|
||||
|
||||
int json_c_version_num(void)
|
||||
{
|
||||
return JSON_C_VERSION_NUM;
|
||||
}
|
||||
|
||||
22
json-c/json_c_version.h
Normal file
22
json-c/json_c_version.h
Normal file
@@ -0,0 +1,22 @@
|
||||
/*
|
||||
* Copyright (c) 2012 Eric Haszlakiewicz
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*/
|
||||
|
||||
#ifndef _json_c_version_h_
|
||||
#define _json_c_version_h_
|
||||
|
||||
#define JSON_C_MAJOR_VERSION 0
|
||||
#define JSON_C_MINOR_VERSION 12
|
||||
#define JSON_C_MICRO_VERSION 99
|
||||
#define JSON_C_VERSION_NUM ((JSON_C_MAJOR_VERSION << 16) | \
|
||||
(JSON_C_MINOR_VERSION << 8) | \
|
||||
JSON_C_MICRO_VERSION)
|
||||
#define JSON_C_VERSION "0.12.99"
|
||||
|
||||
const char *json_c_version(void); /* Returns JSON_C_VERSION */
|
||||
int json_c_version_num(void); /* Returns JSON_C_VERSION_NUM */
|
||||
|
||||
#endif
|
||||
4
json-c/json_config.h
Normal file
4
json-c/json_config.h
Normal file
@@ -0,0 +1,4 @@
|
||||
/* json_config.h. Generated from json_config.h.in by configure. */
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#define JSON_C_HAVE_INTTYPES_H 1
|
||||
3
json-c/json_config.h.in
Normal file
3
json-c/json_config.h.in
Normal file
@@ -0,0 +1,3 @@
|
||||
|
||||
/* Define to 1 if you have the <inttypes.h> header file. */
|
||||
#undef JSON_C_HAVE_INTTYPES_H
|
||||
28
json-c/json_inttypes.h
Normal file
28
json-c/json_inttypes.h
Normal file
@@ -0,0 +1,28 @@
|
||||
|
||||
#ifndef _json_inttypes_h_
|
||||
#define _json_inttypes_h_
|
||||
|
||||
#include "json_config.h"
|
||||
|
||||
#if defined(_MSC_VER) && _MSC_VER <= 1700
|
||||
|
||||
/* Anything less than Visual Studio C++ 10 is missing stdint.h and inttypes.h */
|
||||
typedef __int32 int32_t;
|
||||
#define INT32_MIN ((int32_t)_I32_MIN)
|
||||
#define INT32_MAX ((int32_t)_I32_MAX)
|
||||
typedef __int64 int64_t;
|
||||
#define INT64_MIN ((int64_t)_I64_MIN)
|
||||
#define INT64_MAX ((int64_t)_I64_MAX)
|
||||
#define PRId64 "I64d"
|
||||
#define SCNd64 "I64d"
|
||||
|
||||
#else
|
||||
|
||||
#ifdef JSON_C_HAVE_INTTYPES_H
|
||||
#include <inttypes.h>
|
||||
#endif
|
||||
/* inttypes.h includes stdint.h */
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
913
json-c/json_object.c
Normal file
913
json-c/json_object.c
Normal file
@@ -0,0 +1,913 @@
|
||||
/*
|
||||
* $Id: json_object.c,v 1.17 2006/07/25 03:24:50 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
* Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <string.h>
|
||||
#include <math.h>
|
||||
#include <errno.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "printbuf.h"
|
||||
#include "linkhash.h"
|
||||
#include "arraylist.h"
|
||||
#include "json_inttypes.h"
|
||||
#include "json_object.h"
|
||||
#include "json_object_private.h"
|
||||
#include "json_util.h"
|
||||
#include "math_compat.h"
|
||||
|
||||
#if !defined(HAVE_STRDUP) && defined(_MSC_VER)
|
||||
/* MSC has the version as _strdup */
|
||||
# define strdup _strdup
|
||||
#elif !defined(HAVE_STRDUP)
|
||||
# error You do not have strdup on your system.
|
||||
#endif /* HAVE_STRDUP */
|
||||
|
||||
#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER)
|
||||
/* MSC has the version as _snprintf */
|
||||
# define snprintf _snprintf
|
||||
#elif !defined(HAVE_SNPRINTF)
|
||||
# error You do not have snprintf on your system.
|
||||
#endif /* HAVE_SNPRINTF */
|
||||
|
||||
// Don't define this. It's not thread-safe.
|
||||
/* #define REFCOUNT_DEBUG 1 */
|
||||
|
||||
const char *json_number_chars = "0123456789.+-eE";
|
||||
const char *json_hex_chars = "0123456789abcdefABCDEF";
|
||||
|
||||
static void json_object_generic_delete(struct json_object* jso);
|
||||
static struct json_object* json_object_new(enum json_type o_type);
|
||||
|
||||
static json_object_to_json_string_fn json_object_object_to_json_string;
|
||||
static json_object_to_json_string_fn json_object_boolean_to_json_string;
|
||||
static json_object_to_json_string_fn json_object_int_to_json_string;
|
||||
static json_object_to_json_string_fn json_object_double_to_json_string;
|
||||
static json_object_to_json_string_fn json_object_string_to_json_string;
|
||||
static json_object_to_json_string_fn json_object_array_to_json_string;
|
||||
|
||||
|
||||
/* ref count debugging */
|
||||
|
||||
#ifdef REFCOUNT_DEBUG
|
||||
|
||||
static struct lh_table *json_object_table;
|
||||
|
||||
static void json_object_init(void) __attribute__ ((constructor));
|
||||
static void json_object_init(void) {
|
||||
MC_DEBUG("json_object_init: creating object table\n");
|
||||
json_object_table = lh_kptr_table_new(128, "json_object_table", NULL);
|
||||
}
|
||||
|
||||
static void json_object_fini(void) __attribute__ ((destructor));
|
||||
static void json_object_fini(void)
|
||||
{
|
||||
struct lh_entry *ent;
|
||||
if (MC_GET_DEBUG())
|
||||
{
|
||||
if (json_object_table->count)
|
||||
{
|
||||
MC_DEBUG("json_object_fini: %d referenced objects at exit\n",
|
||||
json_object_table->count);
|
||||
lh_foreach(json_object_table, ent)
|
||||
{
|
||||
struct json_object* obj = (struct json_object*)ent->v;
|
||||
MC_DEBUG("\t%s:%p\n", json_type_to_name(obj->o_type), obj);
|
||||
}
|
||||
}
|
||||
}
|
||||
MC_DEBUG("json_object_fini: freeing object table\n");
|
||||
lh_table_free(json_object_table);
|
||||
}
|
||||
#endif /* REFCOUNT_DEBUG */
|
||||
|
||||
|
||||
/* string escaping */
|
||||
|
||||
static int json_escape_str(struct printbuf *pb, char *str, int len)
|
||||
{
|
||||
int pos = 0, start_offset = 0;
|
||||
unsigned char c;
|
||||
while (len--)
|
||||
{
|
||||
c = str[pos];
|
||||
switch(c)
|
||||
{
|
||||
case '\b':
|
||||
case '\n':
|
||||
case '\r':
|
||||
case '\t':
|
||||
case '\f':
|
||||
case '"':
|
||||
case '\\':
|
||||
case '/':
|
||||
if(pos - start_offset > 0)
|
||||
printbuf_memappend(pb, str + start_offset, pos - start_offset);
|
||||
|
||||
if(c == '\b') printbuf_memappend(pb, "\\b", 2);
|
||||
else if(c == '\n') printbuf_memappend(pb, "\\n", 2);
|
||||
else if(c == '\r') printbuf_memappend(pb, "\\r", 2);
|
||||
else if(c == '\t') printbuf_memappend(pb, "\\t", 2);
|
||||
else if(c == '\f') printbuf_memappend(pb, "\\f", 2);
|
||||
else if(c == '"') printbuf_memappend(pb, "\\\"", 2);
|
||||
else if(c == '\\') printbuf_memappend(pb, "\\\\", 2);
|
||||
else if(c == '/') printbuf_memappend(pb, "\\/", 2);
|
||||
|
||||
start_offset = ++pos;
|
||||
break;
|
||||
default:
|
||||
if(c < ' ')
|
||||
{
|
||||
if(pos - start_offset > 0)
|
||||
printbuf_memappend(pb, str + start_offset, pos - start_offset);
|
||||
sprintbuf(pb, "\\u00%c%c",
|
||||
json_hex_chars[c >> 4],
|
||||
json_hex_chars[c & 0xf]);
|
||||
start_offset = ++pos;
|
||||
} else
|
||||
pos++;
|
||||
}
|
||||
}
|
||||
if (pos - start_offset > 0)
|
||||
printbuf_memappend(pb, str + start_offset, pos - start_offset);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* reference counting */
|
||||
|
||||
extern struct json_object* json_object_get(struct json_object *jso)
|
||||
{
|
||||
if (jso)
|
||||
jso->_ref_count++;
|
||||
return jso;
|
||||
}
|
||||
|
||||
int json_object_put(struct json_object *jso)
|
||||
{
|
||||
if(jso)
|
||||
{
|
||||
jso->_ref_count--;
|
||||
if(!jso->_ref_count)
|
||||
{
|
||||
if (jso->_user_delete)
|
||||
jso->_user_delete(jso, jso->_userdata);
|
||||
jso->_delete(jso);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/* generic object construction and destruction parts */
|
||||
|
||||
static void json_object_generic_delete(struct json_object* jso)
|
||||
{
|
||||
#ifdef REFCOUNT_DEBUG
|
||||
MC_DEBUG("json_object_delete_%s: %p\n",
|
||||
json_type_to_name(jso->o_type), jso);
|
||||
lh_table_delete(json_object_table, jso);
|
||||
#endif /* REFCOUNT_DEBUG */
|
||||
printbuf_free(jso->_pb);
|
||||
free(jso);
|
||||
}
|
||||
|
||||
static struct json_object* json_object_new(enum json_type o_type)
|
||||
{
|
||||
struct json_object *jso;
|
||||
|
||||
jso = (struct json_object*)calloc(sizeof(struct json_object), 1);
|
||||
if (!jso)
|
||||
return NULL;
|
||||
jso->o_type = o_type;
|
||||
jso->_ref_count = 1;
|
||||
jso->_delete = &json_object_generic_delete;
|
||||
#ifdef REFCOUNT_DEBUG
|
||||
lh_table_insert(json_object_table, jso, jso);
|
||||
MC_DEBUG("json_object_new_%s: %p\n", json_type_to_name(jso->o_type), jso);
|
||||
#endif /* REFCOUNT_DEBUG */
|
||||
return jso;
|
||||
}
|
||||
|
||||
|
||||
/* type checking functions */
|
||||
|
||||
int json_object_is_type(struct json_object *jso, enum json_type type)
|
||||
{
|
||||
if (!jso)
|
||||
return (type == json_type_null);
|
||||
return (jso->o_type == type);
|
||||
}
|
||||
|
||||
enum json_type json_object_get_type(struct json_object *jso)
|
||||
{
|
||||
if (!jso)
|
||||
return json_type_null;
|
||||
return jso->o_type;
|
||||
}
|
||||
|
||||
/* set a custom conversion to string */
|
||||
|
||||
void json_object_set_serializer(json_object *jso,
|
||||
json_object_to_json_string_fn to_string_func,
|
||||
void *userdata,
|
||||
json_object_delete_fn *user_delete)
|
||||
{
|
||||
// First, clean up any previously existing user info
|
||||
if (jso->_user_delete)
|
||||
{
|
||||
jso->_user_delete(jso, jso->_userdata);
|
||||
}
|
||||
jso->_userdata = NULL;
|
||||
jso->_user_delete = NULL;
|
||||
|
||||
if (to_string_func == NULL)
|
||||
{
|
||||
// Reset to the standard serialization function
|
||||
switch(jso->o_type)
|
||||
{
|
||||
case json_type_null:
|
||||
jso->_to_json_string = NULL;
|
||||
break;
|
||||
case json_type_boolean:
|
||||
jso->_to_json_string = &json_object_boolean_to_json_string;
|
||||
break;
|
||||
case json_type_double:
|
||||
jso->_to_json_string = &json_object_double_to_json_string;
|
||||
break;
|
||||
case json_type_int:
|
||||
jso->_to_json_string = &json_object_int_to_json_string;
|
||||
break;
|
||||
case json_type_object:
|
||||
jso->_to_json_string = &json_object_object_to_json_string;
|
||||
break;
|
||||
case json_type_array:
|
||||
jso->_to_json_string = &json_object_array_to_json_string;
|
||||
break;
|
||||
case json_type_string:
|
||||
jso->_to_json_string = &json_object_string_to_json_string;
|
||||
break;
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
jso->_to_json_string = to_string_func;
|
||||
jso->_userdata = userdata;
|
||||
jso->_user_delete = user_delete;
|
||||
}
|
||||
|
||||
|
||||
/* extended conversion to string */
|
||||
|
||||
const char* json_object_to_json_string_ext(struct json_object *jso, int flags)
|
||||
{
|
||||
if (!jso)
|
||||
return "null";
|
||||
|
||||
if ((!jso->_pb) && !(jso->_pb = printbuf_new()))
|
||||
return NULL;
|
||||
|
||||
printbuf_reset(jso->_pb);
|
||||
|
||||
if(jso->_to_json_string(jso, jso->_pb, 0, flags) < 0)
|
||||
return NULL;
|
||||
|
||||
return jso->_pb->buf;
|
||||
}
|
||||
|
||||
/* backwards-compatible conversion to string */
|
||||
|
||||
const char* json_object_to_json_string(struct json_object *jso)
|
||||
{
|
||||
return json_object_to_json_string_ext(jso, JSON_C_TO_STRING_SPACED);
|
||||
}
|
||||
|
||||
static void indent(struct printbuf *pb, int level, int flags)
|
||||
{
|
||||
if (flags & JSON_C_TO_STRING_PRETTY)
|
||||
{
|
||||
printbuf_memset(pb, -1, ' ', level * 2);
|
||||
}
|
||||
}
|
||||
|
||||
/* json_object_object */
|
||||
|
||||
static int json_object_object_to_json_string(struct json_object* jso,
|
||||
struct printbuf *pb,
|
||||
int level,
|
||||
int flags)
|
||||
{
|
||||
int had_children = 0;
|
||||
struct json_object_iter iter;
|
||||
|
||||
sprintbuf(pb, "{" /*}*/);
|
||||
if (flags & JSON_C_TO_STRING_PRETTY)
|
||||
sprintbuf(pb, "\n");
|
||||
json_object_object_foreachC(jso, iter)
|
||||
{
|
||||
if (had_children)
|
||||
{
|
||||
sprintbuf(pb, ",");
|
||||
if (flags & JSON_C_TO_STRING_PRETTY)
|
||||
sprintbuf(pb, "\n");
|
||||
}
|
||||
had_children = 1;
|
||||
if (flags & JSON_C_TO_STRING_SPACED)
|
||||
sprintbuf(pb, " ");
|
||||
indent(pb, level+1, flags);
|
||||
sprintbuf(pb, "\"");
|
||||
json_escape_str(pb, iter.key, strlen(iter.key));
|
||||
if (flags & JSON_C_TO_STRING_SPACED)
|
||||
sprintbuf(pb, "\": ");
|
||||
else
|
||||
sprintbuf(pb, "\":");
|
||||
if(iter.val == NULL)
|
||||
sprintbuf(pb, "null");
|
||||
else
|
||||
iter.val->_to_json_string(iter.val, pb, level+1,flags);
|
||||
}
|
||||
if (flags & JSON_C_TO_STRING_PRETTY)
|
||||
{
|
||||
if (had_children)
|
||||
sprintbuf(pb, "\n");
|
||||
indent(pb,level,flags);
|
||||
}
|
||||
if (flags & JSON_C_TO_STRING_SPACED)
|
||||
return sprintbuf(pb, /*{*/ " }");
|
||||
else
|
||||
return sprintbuf(pb, /*{*/ "}");
|
||||
}
|
||||
|
||||
|
||||
static void json_object_lh_entry_free(struct lh_entry *ent)
|
||||
{
|
||||
free(ent->k);
|
||||
json_object_put((struct json_object*)ent->v);
|
||||
}
|
||||
|
||||
static void json_object_object_delete(struct json_object* jso)
|
||||
{
|
||||
lh_table_free(jso->o.c_object);
|
||||
json_object_generic_delete(jso);
|
||||
}
|
||||
|
||||
struct json_object* json_object_new_object(void)
|
||||
{
|
||||
struct json_object *jso = json_object_new(json_type_object);
|
||||
if (!jso)
|
||||
return NULL;
|
||||
jso->_delete = &json_object_object_delete;
|
||||
jso->_to_json_string = &json_object_object_to_json_string;
|
||||
jso->o.c_object = lh_kchar_table_new(JSON_OBJECT_DEF_HASH_ENTRIES,
|
||||
NULL, &json_object_lh_entry_free);
|
||||
if (!jso->o.c_object)
|
||||
{
|
||||
json_object_generic_delete(jso);
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
return jso;
|
||||
}
|
||||
|
||||
struct lh_table* json_object_get_object(struct json_object *jso)
|
||||
{
|
||||
if (!jso)
|
||||
return NULL;
|
||||
switch(jso->o_type)
|
||||
{
|
||||
case json_type_object:
|
||||
return jso->o.c_object;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void json_object_object_add(struct json_object* jso, const char *key,
|
||||
struct json_object *val)
|
||||
{
|
||||
// We lookup the entry and replace the value, rather than just deleting
|
||||
// and re-adding it, so the existing key remains valid.
|
||||
json_object *existing_value = NULL;
|
||||
struct lh_entry *existing_entry;
|
||||
existing_entry = lh_table_lookup_entry(jso->o.c_object, (void*)key);
|
||||
if (!existing_entry)
|
||||
{
|
||||
lh_table_insert(jso->o.c_object, strdup(key), val);
|
||||
return;
|
||||
}
|
||||
existing_value = (void *)existing_entry->v;
|
||||
if (existing_value)
|
||||
json_object_put(existing_value);
|
||||
existing_entry->v = val;
|
||||
}
|
||||
|
||||
int json_object_object_length(struct json_object *jso)
|
||||
{
|
||||
return lh_table_length(jso->o.c_object);
|
||||
}
|
||||
|
||||
struct json_object* json_object_object_get(struct json_object* jso, const char *key)
|
||||
{
|
||||
struct json_object *result = NULL;
|
||||
json_object_object_get_ex(jso, key, &result);
|
||||
return result;
|
||||
}
|
||||
|
||||
json_bool json_object_object_get_ex(struct json_object* jso, const char *key, struct json_object **value)
|
||||
{
|
||||
if (value != NULL)
|
||||
*value = NULL;
|
||||
|
||||
if (NULL == jso)
|
||||
return FALSE;
|
||||
|
||||
switch(jso->o_type)
|
||||
{
|
||||
case json_type_object:
|
||||
return lh_table_lookup_ex(jso->o.c_object, (void*)key, (void**)value);
|
||||
default:
|
||||
if (value != NULL)
|
||||
*value = NULL;
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
void json_object_object_del(struct json_object* jso, const char *key)
|
||||
{
|
||||
lh_table_delete(jso->o.c_object, key);
|
||||
}
|
||||
|
||||
|
||||
/* json_object_boolean */
|
||||
|
||||
static int json_object_boolean_to_json_string(struct json_object* jso,
|
||||
struct printbuf *pb,
|
||||
int level,
|
||||
int flags)
|
||||
{
|
||||
if (jso->o.c_boolean)
|
||||
return sprintbuf(pb, "true");
|
||||
else
|
||||
return sprintbuf(pb, "false");
|
||||
}
|
||||
|
||||
struct json_object* json_object_new_boolean(json_bool b)
|
||||
{
|
||||
struct json_object *jso = json_object_new(json_type_boolean);
|
||||
if (!jso)
|
||||
return NULL;
|
||||
jso->_to_json_string = &json_object_boolean_to_json_string;
|
||||
jso->o.c_boolean = b;
|
||||
return jso;
|
||||
}
|
||||
|
||||
json_bool json_object_get_boolean(struct json_object *jso)
|
||||
{
|
||||
if (!jso)
|
||||
return FALSE;
|
||||
switch(jso->o_type)
|
||||
{
|
||||
case json_type_boolean:
|
||||
return jso->o.c_boolean;
|
||||
case json_type_int:
|
||||
return (jso->o.c_int64 != 0);
|
||||
case json_type_double:
|
||||
return (jso->o.c_double != 0);
|
||||
case json_type_string:
|
||||
return (jso->o.c_string.len != 0);
|
||||
default:
|
||||
return FALSE;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* json_object_int */
|
||||
|
||||
static int json_object_int_to_json_string(struct json_object* jso,
|
||||
struct printbuf *pb,
|
||||
int level,
|
||||
int flags)
|
||||
{
|
||||
return sprintbuf(pb, "%"PRId64, jso->o.c_int64);
|
||||
}
|
||||
|
||||
struct json_object* json_object_new_int(int32_t i)
|
||||
{
|
||||
struct json_object *jso = json_object_new(json_type_int);
|
||||
if (!jso)
|
||||
return NULL;
|
||||
jso->_to_json_string = &json_object_int_to_json_string;
|
||||
jso->o.c_int64 = i;
|
||||
return jso;
|
||||
}
|
||||
|
||||
int32_t json_object_get_int(struct json_object *jso)
|
||||
{
|
||||
int64_t cint64;
|
||||
enum json_type o_type;
|
||||
|
||||
if(!jso) return 0;
|
||||
|
||||
o_type = jso->o_type;
|
||||
cint64 = jso->o.c_int64;
|
||||
|
||||
if (o_type == json_type_string)
|
||||
{
|
||||
/*
|
||||
* Parse strings into 64-bit numbers, then use the
|
||||
* 64-to-32-bit number handling below.
|
||||
*/
|
||||
if (json_parse_int64(jso->o.c_string.str, &cint64) != 0)
|
||||
return 0; /* whoops, it didn't work. */
|
||||
o_type = json_type_int;
|
||||
}
|
||||
|
||||
switch(o_type) {
|
||||
case json_type_int:
|
||||
/* Make sure we return the correct values for out of range numbers. */
|
||||
if (cint64 <= INT32_MIN)
|
||||
return INT32_MIN;
|
||||
else if (cint64 >= INT32_MAX)
|
||||
return INT32_MAX;
|
||||
else
|
||||
return (int32_t)cint64;
|
||||
case json_type_double:
|
||||
return (int32_t)jso->o.c_double;
|
||||
case json_type_boolean:
|
||||
return jso->o.c_boolean;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
struct json_object* json_object_new_int64(int64_t i)
|
||||
{
|
||||
struct json_object *jso = json_object_new(json_type_int);
|
||||
if (!jso)
|
||||
return NULL;
|
||||
jso->_to_json_string = &json_object_int_to_json_string;
|
||||
jso->o.c_int64 = i;
|
||||
return jso;
|
||||
}
|
||||
|
||||
int64_t json_object_get_int64(struct json_object *jso)
|
||||
{
|
||||
int64_t cint;
|
||||
|
||||
if (!jso)
|
||||
return 0;
|
||||
switch(jso->o_type)
|
||||
{
|
||||
case json_type_int:
|
||||
return jso->o.c_int64;
|
||||
case json_type_double:
|
||||
return (int64_t)jso->o.c_double;
|
||||
case json_type_boolean:
|
||||
return jso->o.c_boolean;
|
||||
case json_type_string:
|
||||
if (json_parse_int64(jso->o.c_string.str, &cint) == 0)
|
||||
return cint;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* json_object_double */
|
||||
|
||||
static int json_object_double_to_json_string(struct json_object* jso,
|
||||
struct printbuf *pb,
|
||||
int level,
|
||||
int flags)
|
||||
{
|
||||
char buf[128], *p, *q;
|
||||
int size;
|
||||
/* Although JSON RFC does not support
|
||||
NaN or Infinity as numeric values
|
||||
ECMA 262 section 9.8.1 defines
|
||||
how to handle these cases as strings */
|
||||
if(isnan(jso->o.c_double))
|
||||
size = snprintf(buf, sizeof(buf), "NaN");
|
||||
else if(isinf(jso->o.c_double))
|
||||
if(jso->o.c_double > 0)
|
||||
size = snprintf(buf, sizeof(buf), "Infinity");
|
||||
else
|
||||
size = snprintf(buf, sizeof(buf), "-Infinity");
|
||||
else
|
||||
size = snprintf(buf, sizeof(buf), "%.17g", jso->o.c_double);
|
||||
|
||||
p = strchr(buf, ',');
|
||||
if (p) {
|
||||
*p = '.';
|
||||
} else {
|
||||
p = strchr(buf, '.');
|
||||
}
|
||||
if (p && (flags & JSON_C_TO_STRING_NOZERO)) {
|
||||
/* last useful digit, always keep 1 zero */
|
||||
p++;
|
||||
for (q=p ; *q ; q++) {
|
||||
if (*q!='0') p=q;
|
||||
}
|
||||
/* drop trailing zeroes */
|
||||
*(++p) = 0;
|
||||
size = p-buf;
|
||||
}
|
||||
printbuf_memappend(pb, buf, size);
|
||||
return size;
|
||||
}
|
||||
|
||||
struct json_object* json_object_new_double(double d)
|
||||
{
|
||||
struct json_object *jso = json_object_new(json_type_double);
|
||||
if (!jso)
|
||||
return NULL;
|
||||
jso->_to_json_string = &json_object_double_to_json_string;
|
||||
jso->o.c_double = d;
|
||||
return jso;
|
||||
}
|
||||
|
||||
struct json_object* json_object_new_double_s(double d, const char *ds)
|
||||
{
|
||||
struct json_object *jso = json_object_new_double(d);
|
||||
if (!jso)
|
||||
return NULL;
|
||||
|
||||
char *new_ds = strdup(ds);
|
||||
if (!new_ds)
|
||||
{
|
||||
json_object_generic_delete(jso);
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
json_object_set_serializer(jso, json_object_userdata_to_json_string,
|
||||
new_ds, json_object_free_userdata);
|
||||
return jso;
|
||||
}
|
||||
|
||||
int json_object_userdata_to_json_string(struct json_object *jso,
|
||||
struct printbuf *pb, int level, int flags)
|
||||
{
|
||||
int userdata_len = strlen(jso->_userdata);
|
||||
printbuf_memappend(pb, jso->_userdata, userdata_len);
|
||||
return userdata_len;
|
||||
}
|
||||
|
||||
void json_object_free_userdata(struct json_object *jso, void *userdata)
|
||||
{
|
||||
free(userdata);
|
||||
}
|
||||
|
||||
double json_object_get_double(struct json_object *jso)
|
||||
{
|
||||
double cdouble;
|
||||
char *errPtr = NULL;
|
||||
|
||||
if(!jso) return 0.0;
|
||||
switch(jso->o_type) {
|
||||
case json_type_double:
|
||||
return jso->o.c_double;
|
||||
case json_type_int:
|
||||
return jso->o.c_int64;
|
||||
case json_type_boolean:
|
||||
return jso->o.c_boolean;
|
||||
case json_type_string:
|
||||
errno = 0;
|
||||
cdouble = strtod(jso->o.c_string.str,&errPtr);
|
||||
|
||||
/* if conversion stopped at the first character, return 0.0 */
|
||||
if (errPtr == jso->o.c_string.str)
|
||||
return 0.0;
|
||||
|
||||
/*
|
||||
* Check that the conversion terminated on something sensible
|
||||
*
|
||||
* For example, { "pay" : 123AB } would parse as 123.
|
||||
*/
|
||||
if (*errPtr != '\0')
|
||||
return 0.0;
|
||||
|
||||
/*
|
||||
* If strtod encounters a string which would exceed the
|
||||
* capacity of a double, it returns +/- HUGE_VAL and sets
|
||||
* errno to ERANGE. But +/- HUGE_VAL is also a valid result
|
||||
* from a conversion, so we need to check errno.
|
||||
*
|
||||
* Underflow also sets errno to ERANGE, but it returns 0 in
|
||||
* that case, which is what we will return anyway.
|
||||
*
|
||||
* See CERT guideline ERR30-C
|
||||
*/
|
||||
if ((HUGE_VAL == cdouble || -HUGE_VAL == cdouble) &&
|
||||
(ERANGE == errno))
|
||||
cdouble = 0.0;
|
||||
return cdouble;
|
||||
default:
|
||||
return 0.0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* json_object_string */
|
||||
|
||||
static int json_object_string_to_json_string(struct json_object* jso,
|
||||
struct printbuf *pb,
|
||||
int level,
|
||||
int flags)
|
||||
{
|
||||
sprintbuf(pb, "\"");
|
||||
json_escape_str(pb, jso->o.c_string.str, jso->o.c_string.len);
|
||||
sprintbuf(pb, "\"");
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void json_object_string_delete(struct json_object* jso)
|
||||
{
|
||||
free(jso->o.c_string.str);
|
||||
json_object_generic_delete(jso);
|
||||
}
|
||||
|
||||
struct json_object* json_object_new_string(const char *s)
|
||||
{
|
||||
struct json_object *jso = json_object_new(json_type_string);
|
||||
if (!jso)
|
||||
return NULL;
|
||||
jso->_delete = &json_object_string_delete;
|
||||
jso->_to_json_string = &json_object_string_to_json_string;
|
||||
jso->o.c_string.str = strdup(s);
|
||||
if (!jso->o.c_string.str)
|
||||
{
|
||||
json_object_generic_delete(jso);
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
jso->o.c_string.len = strlen(s);
|
||||
return jso;
|
||||
}
|
||||
|
||||
struct json_object* json_object_new_string_len(const char *s, int len)
|
||||
{
|
||||
struct json_object *jso = json_object_new(json_type_string);
|
||||
if (!jso)
|
||||
return NULL;
|
||||
jso->_delete = &json_object_string_delete;
|
||||
jso->_to_json_string = &json_object_string_to_json_string;
|
||||
jso->o.c_string.str = (char*)malloc(len + 1);
|
||||
if (!jso->o.c_string.str)
|
||||
{
|
||||
json_object_generic_delete(jso);
|
||||
errno = ENOMEM;
|
||||
return NULL;
|
||||
}
|
||||
memcpy(jso->o.c_string.str, (void *)s, len);
|
||||
jso->o.c_string.str[len] = '\0';
|
||||
jso->o.c_string.len = len;
|
||||
return jso;
|
||||
}
|
||||
|
||||
const char* json_object_get_string(struct json_object *jso)
|
||||
{
|
||||
if (!jso)
|
||||
return NULL;
|
||||
switch(jso->o_type)
|
||||
{
|
||||
case json_type_string:
|
||||
return jso->o.c_string.str;
|
||||
default:
|
||||
return json_object_to_json_string(jso);
|
||||
}
|
||||
}
|
||||
|
||||
int json_object_get_string_len(struct json_object *jso)
|
||||
{
|
||||
if (!jso)
|
||||
return 0;
|
||||
switch(jso->o_type)
|
||||
{
|
||||
case json_type_string:
|
||||
return jso->o.c_string.len;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* json_object_array */
|
||||
|
||||
static int json_object_array_to_json_string(struct json_object* jso,
|
||||
struct printbuf *pb,
|
||||
int level,
|
||||
int flags)
|
||||
{
|
||||
int had_children = 0;
|
||||
int ii;
|
||||
sprintbuf(pb, "[");
|
||||
if (flags & JSON_C_TO_STRING_PRETTY)
|
||||
sprintbuf(pb, "\n");
|
||||
for(ii=0; ii < json_object_array_length(jso); ii++)
|
||||
{
|
||||
struct json_object *val;
|
||||
if (had_children)
|
||||
{
|
||||
sprintbuf(pb, ",");
|
||||
if (flags & JSON_C_TO_STRING_PRETTY)
|
||||
sprintbuf(pb, "\n");
|
||||
}
|
||||
had_children = 1;
|
||||
if (flags & JSON_C_TO_STRING_SPACED)
|
||||
sprintbuf(pb, " ");
|
||||
indent(pb, level + 1, flags);
|
||||
val = json_object_array_get_idx(jso, ii);
|
||||
if(val == NULL)
|
||||
sprintbuf(pb, "null");
|
||||
else
|
||||
val->_to_json_string(val, pb, level+1, flags);
|
||||
}
|
||||
if (flags & JSON_C_TO_STRING_PRETTY)
|
||||
{
|
||||
if (had_children)
|
||||
sprintbuf(pb, "\n");
|
||||
indent(pb,level,flags);
|
||||
}
|
||||
|
||||
if (flags & JSON_C_TO_STRING_SPACED)
|
||||
return sprintbuf(pb, " ]");
|
||||
else
|
||||
return sprintbuf(pb, "]");
|
||||
}
|
||||
|
||||
static void json_object_array_entry_free(void *data)
|
||||
{
|
||||
json_object_put((struct json_object*)data);
|
||||
}
|
||||
|
||||
static void json_object_array_delete(struct json_object* jso)
|
||||
{
|
||||
array_list_free(jso->o.c_array);
|
||||
json_object_generic_delete(jso);
|
||||
}
|
||||
|
||||
struct json_object* json_object_new_array(void)
|
||||
{
|
||||
struct json_object *jso = json_object_new(json_type_array);
|
||||
if (!jso)
|
||||
return NULL;
|
||||
jso->_delete = &json_object_array_delete;
|
||||
jso->_to_json_string = &json_object_array_to_json_string;
|
||||
jso->o.c_array = array_list_new(&json_object_array_entry_free);
|
||||
return jso;
|
||||
}
|
||||
|
||||
struct array_list* json_object_get_array(struct json_object *jso)
|
||||
{
|
||||
if (!jso)
|
||||
return NULL;
|
||||
switch(jso->o_type)
|
||||
{
|
||||
case json_type_array:
|
||||
return jso->o.c_array;
|
||||
default:
|
||||
return NULL;
|
||||
}
|
||||
}
|
||||
|
||||
void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *))
|
||||
{
|
||||
array_list_sort(jso->o.c_array, sort_fn);
|
||||
}
|
||||
|
||||
int json_object_array_length(struct json_object *jso)
|
||||
{
|
||||
return array_list_length(jso->o.c_array);
|
||||
}
|
||||
|
||||
int json_object_array_add(struct json_object *jso,struct json_object *val)
|
||||
{
|
||||
return array_list_add(jso->o.c_array, val);
|
||||
}
|
||||
|
||||
int json_object_array_put_idx(struct json_object *jso, int idx,
|
||||
struct json_object *val)
|
||||
{
|
||||
return array_list_put_idx(jso->o.c_array, idx, val);
|
||||
}
|
||||
|
||||
struct json_object* json_object_array_get_idx(struct json_object *jso,
|
||||
int idx)
|
||||
{
|
||||
return (struct json_object*)array_list_get_idx(jso->o.c_array, idx);
|
||||
}
|
||||
|
||||
617
json-c/json_object.h
Normal file
617
json-c/json_object.h
Normal file
@@ -0,0 +1,617 @@
|
||||
/*
|
||||
* $Id: json_object.h,v 1.12 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
* Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _json_object_h_
|
||||
#define _json_object_h_
|
||||
|
||||
#ifdef __GNUC__
|
||||
#define THIS_FUNCTION_IS_DEPRECATED(func) func __attribute__ ((deprecated))
|
||||
#elif defined(_MSC_VER)
|
||||
#define THIS_FUNCTION_IS_DEPRECATED(func) __declspec(deprecated) func
|
||||
#else
|
||||
#define THIS_FUNCTION_IS_DEPRECATED(func) func
|
||||
#endif
|
||||
|
||||
#include "json_inttypes.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define JSON_OBJECT_DEF_HASH_ENTRIES 16
|
||||
|
||||
/**
|
||||
* A flag for the json_object_to_json_string_ext() and
|
||||
* json_object_to_file_ext() functions which causes the output
|
||||
* to have no extra whitespace or formatting applied.
|
||||
*/
|
||||
#define JSON_C_TO_STRING_PLAIN 0
|
||||
/**
|
||||
* A flag for the json_object_to_json_string_ext() and
|
||||
* json_object_to_file_ext() functions which causes the output to have
|
||||
* minimal whitespace inserted to make things slightly more readable.
|
||||
*/
|
||||
#define JSON_C_TO_STRING_SPACED (1<<0)
|
||||
/**
|
||||
* A flag for the json_object_to_json_string_ext() and
|
||||
* json_object_to_file_ext() functions which causes
|
||||
* the output to be formatted.
|
||||
*
|
||||
* See the "Two Space Tab" option at http://jsonformatter.curiousconcept.com/
|
||||
* for an example of the format.
|
||||
*/
|
||||
#define JSON_C_TO_STRING_PRETTY (1<<1)
|
||||
/**
|
||||
* A flag to drop trailing zero for float values
|
||||
*/
|
||||
#define JSON_C_TO_STRING_NOZERO (1<<2)
|
||||
|
||||
#undef FALSE
|
||||
#define FALSE ((json_bool)0)
|
||||
|
||||
#undef TRUE
|
||||
#define TRUE ((json_bool)1)
|
||||
|
||||
extern const char *json_number_chars;
|
||||
extern const char *json_hex_chars;
|
||||
|
||||
/* CAW: added for ANSI C iteration correctness */
|
||||
struct json_object_iter
|
||||
{
|
||||
char *key;
|
||||
struct json_object *val;
|
||||
struct lh_entry *entry;
|
||||
};
|
||||
|
||||
/* forward structure definitions */
|
||||
|
||||
typedef int json_bool;
|
||||
typedef struct printbuf printbuf;
|
||||
typedef struct lh_table lh_table;
|
||||
typedef struct array_list array_list;
|
||||
typedef struct json_object json_object;
|
||||
typedef struct json_object_iter json_object_iter;
|
||||
typedef struct json_tokener json_tokener;
|
||||
|
||||
/**
|
||||
* Type of custom user delete functions. See json_object_set_serializer.
|
||||
*/
|
||||
typedef void (json_object_delete_fn)(struct json_object *jso, void *userdata);
|
||||
|
||||
/**
|
||||
* Type of a custom serialization function. See json_object_set_serializer.
|
||||
*/
|
||||
typedef int (json_object_to_json_string_fn)(struct json_object *jso,
|
||||
struct printbuf *pb,
|
||||
int level,
|
||||
int flags);
|
||||
|
||||
/* supported object types */
|
||||
|
||||
typedef enum json_type {
|
||||
/* If you change this, be sure to update json_type_to_name() too */
|
||||
json_type_null,
|
||||
json_type_boolean,
|
||||
json_type_double,
|
||||
json_type_int,
|
||||
json_type_object,
|
||||
json_type_array,
|
||||
json_type_string
|
||||
} json_type;
|
||||
|
||||
/* reference counting functions */
|
||||
|
||||
/**
|
||||
* Increment the reference count of json_object, thereby grabbing shared
|
||||
* ownership of obj.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
*/
|
||||
extern struct json_object* json_object_get(struct json_object *obj);
|
||||
|
||||
/**
|
||||
* Decrement the reference count of json_object and free if it reaches zero.
|
||||
* You must have ownership of obj prior to doing this or you will cause an
|
||||
* imbalance in the reference count.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns 1 if the object was freed.
|
||||
*/
|
||||
int json_object_put(struct json_object *obj);
|
||||
|
||||
/**
|
||||
* Check if the json_object is of a given type
|
||||
* @param obj the json_object instance
|
||||
* @param type one of:
|
||||
json_type_null (i.e. obj == NULL),
|
||||
json_type_boolean,
|
||||
json_type_double,
|
||||
json_type_int,
|
||||
json_type_object,
|
||||
json_type_array,
|
||||
json_type_string
|
||||
*/
|
||||
extern int json_object_is_type(struct json_object *obj, enum json_type type);
|
||||
|
||||
/**
|
||||
* Get the type of the json_object. See also json_type_to_name() to turn this
|
||||
* into a string suitable, for instance, for logging.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns type being one of:
|
||||
json_type_null (i.e. obj == NULL),
|
||||
json_type_boolean,
|
||||
json_type_double,
|
||||
json_type_int,
|
||||
json_type_object,
|
||||
json_type_array,
|
||||
json_type_string
|
||||
*/
|
||||
extern enum json_type json_object_get_type(struct json_object *obj);
|
||||
|
||||
|
||||
/** Stringify object to json format.
|
||||
* Equivalent to json_object_to_json_string_ext(obj, JSON_C_TO_STRING_SPACED)
|
||||
* The pointer you get is an internal of your json object. You don't
|
||||
* have to free it, later use of json_object_put() should be sufficient.
|
||||
* If you can not ensure there's no concurrent access to *obj use
|
||||
* strdup().
|
||||
* @param obj the json_object instance
|
||||
* @returns a string in JSON format
|
||||
*/
|
||||
extern const char* json_object_to_json_string(struct json_object *obj);
|
||||
|
||||
/** Stringify object to json format
|
||||
* @see json_object_to_json_string() for details on how to free string.
|
||||
* @param obj the json_object instance
|
||||
* @param flags formatting options, see JSON_C_TO_STRING_PRETTY and other constants
|
||||
* @returns a string in JSON format
|
||||
*/
|
||||
extern const char* json_object_to_json_string_ext(struct json_object *obj, int
|
||||
flags);
|
||||
|
||||
/**
|
||||
* Set a custom serialization function to be used when this particular object
|
||||
* is converted to a string by json_object_to_json_string.
|
||||
*
|
||||
* If a custom serializer is already set on this object, any existing
|
||||
* user_delete function is called before the new one is set.
|
||||
*
|
||||
* If to_string_func is NULL, the other parameters are ignored
|
||||
* and the default behaviour is reset.
|
||||
*
|
||||
* The userdata parameter is optional and may be passed as NULL. If provided,
|
||||
* it is passed to to_string_func as-is. This parameter may be NULL even
|
||||
* if user_delete is non-NULL.
|
||||
*
|
||||
* The user_delete parameter is optional and may be passed as NULL, even if
|
||||
* the userdata parameter is non-NULL. It will be called just before the
|
||||
* json_object is deleted, after it's reference count goes to zero
|
||||
* (see json_object_put()).
|
||||
* If this is not provided, it is up to the caller to free the userdata at
|
||||
* an appropriate time. (i.e. after the json_object is deleted)
|
||||
*
|
||||
* @param jso the object to customize
|
||||
* @param to_string_func the custom serialization function
|
||||
* @param userdata an optional opaque cookie
|
||||
* @param user_delete an optional function from freeing userdata
|
||||
*/
|
||||
extern void json_object_set_serializer(json_object *jso,
|
||||
json_object_to_json_string_fn to_string_func,
|
||||
void *userdata,
|
||||
json_object_delete_fn *user_delete);
|
||||
|
||||
/**
|
||||
* Simply call free on the userdata pointer.
|
||||
* Can be used with json_object_set_serializer().
|
||||
*
|
||||
* @param jso unused
|
||||
* @param userdata the pointer that is passed to free().
|
||||
*/
|
||||
json_object_delete_fn json_object_free_userdata;
|
||||
|
||||
/**
|
||||
* Copy the jso->_userdata string over to pb as-is.
|
||||
* Can be used with json_object_set_serializer().
|
||||
*
|
||||
* @param jso The object whose _userdata is used.
|
||||
* @param pb The destination buffer.
|
||||
* @param level Ignored.
|
||||
* @param flags Ignored.
|
||||
*/
|
||||
json_object_to_json_string_fn json_object_userdata_to_json_string;
|
||||
|
||||
|
||||
/* object type methods */
|
||||
|
||||
/** Create a new empty object with a reference count of 1. The caller of
|
||||
* this object initially has sole ownership. Remember, when using
|
||||
* json_object_object_add or json_object_array_put_idx, ownership will
|
||||
* transfer to the object/array. Call json_object_get if you want to maintain
|
||||
* shared ownership or also add this object as a child of multiple objects or
|
||||
* arrays. Any ownerships you acquired but did not transfer must be released
|
||||
* through json_object_put.
|
||||
*
|
||||
* @returns a json_object of type json_type_object
|
||||
*/
|
||||
extern struct json_object* json_object_new_object(void);
|
||||
|
||||
/** Get the hashtable of a json_object of type json_type_object
|
||||
* @param obj the json_object instance
|
||||
* @returns a linkhash
|
||||
*/
|
||||
extern struct lh_table* json_object_get_object(struct json_object *obj);
|
||||
|
||||
/** Get the size of an object in terms of the number of fields it has.
|
||||
* @param obj the json_object whose length to return
|
||||
*/
|
||||
extern int json_object_object_length(struct json_object* obj);
|
||||
|
||||
/** Add an object field to a json_object of type json_type_object
|
||||
*
|
||||
* The reference count will *not* be incremented. This is to make adding
|
||||
* fields to objects in code more compact. If you want to retain a reference
|
||||
* to an added object, independent of the lifetime of obj, you must wrap the
|
||||
* passed object with json_object_get.
|
||||
*
|
||||
* Upon calling this, the ownership of val transfers to obj. Thus you must
|
||||
* make sure that you do in fact have ownership over this object. For instance,
|
||||
* json_object_new_object will give you ownership until you transfer it,
|
||||
* whereas json_object_object_get does not.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param key the object field name (a private copy will be duplicated)
|
||||
* @param val a json_object or NULL member to associate with the given field
|
||||
*/
|
||||
extern void json_object_object_add(struct json_object* obj, const char *key,
|
||||
struct json_object *val);
|
||||
|
||||
/** Get the json_object associate with a given object field
|
||||
*
|
||||
* *No* reference counts will be changed. There is no need to manually adjust
|
||||
* reference counts through the json_object_put/json_object_get methods unless
|
||||
* you need to have the child (value) reference maintain a different lifetime
|
||||
* than the owning parent (obj). Ownership of the returned value is retained
|
||||
* by obj (do not do json_object_put unless you have done a json_object_get).
|
||||
* If you delete the value from obj (json_object_object_del) and wish to access
|
||||
* the returned reference afterwards, make sure you have first gotten shared
|
||||
* ownership through json_object_get (& don't forget to do a json_object_put
|
||||
* or transfer ownership to prevent a memory leak).
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param key the object field name
|
||||
* @returns the json_object associated with the given field name
|
||||
* @deprecated Please use json_object_object_get_ex
|
||||
*/
|
||||
THIS_FUNCTION_IS_DEPRECATED(extern struct json_object* json_object_object_get(struct json_object* obj,
|
||||
const char *key));
|
||||
|
||||
/** Get the json_object associated with a given object field.
|
||||
*
|
||||
* This returns true if the key is found, false in all other cases (including
|
||||
* if obj isn't a json_type_object).
|
||||
*
|
||||
* *No* reference counts will be changed. There is no need to manually adjust
|
||||
* reference counts through the json_object_put/json_object_get methods unless
|
||||
* you need to have the child (value) reference maintain a different lifetime
|
||||
* than the owning parent (obj). Ownership of value is retained by obj.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param key the object field name
|
||||
* @param value a pointer where to store a reference to the json_object
|
||||
* associated with the given field name.
|
||||
*
|
||||
* It is safe to pass a NULL value.
|
||||
* @returns whether or not the key exists
|
||||
*/
|
||||
extern json_bool json_object_object_get_ex(struct json_object* obj,
|
||||
const char *key,
|
||||
struct json_object **value);
|
||||
|
||||
/** Delete the given json_object field
|
||||
*
|
||||
* The reference count will be decremented for the deleted object. If there
|
||||
* are no more owners of the value represented by this key, then the value is
|
||||
* freed. Otherwise, the reference to the value will remain in memory.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param key the object field name
|
||||
*/
|
||||
extern void json_object_object_del(struct json_object* obj, const char *key);
|
||||
|
||||
/**
|
||||
* Iterate through all keys and values of an object.
|
||||
*
|
||||
* Adding keys to the object while iterating is NOT allowed.
|
||||
*
|
||||
* Deleting an existing key, or replacing an existing key with a
|
||||
* new value IS allowed.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param key the local name for the char* key variable defined in the body
|
||||
* @param val the local name for the json_object* object variable defined in
|
||||
* the body
|
||||
*/
|
||||
#if defined(__GNUC__) && !defined(__STRICT_ANSI__) && __STDC_VERSION__ >= 199901L
|
||||
|
||||
# define json_object_object_foreach(obj,key,val) \
|
||||
char *key; \
|
||||
struct json_object *val __attribute__((__unused__)); \
|
||||
for(struct lh_entry *entry ## key = json_object_get_object(obj)->head, *entry_next ## key = NULL; \
|
||||
({ if(entry ## key) { \
|
||||
key = (char*)entry ## key->k; \
|
||||
val = (struct json_object*)entry ## key->v; \
|
||||
entry_next ## key = entry ## key->next; \
|
||||
} ; entry ## key; }); \
|
||||
entry ## key = entry_next ## key )
|
||||
|
||||
#else /* ANSI C or MSC */
|
||||
|
||||
# define json_object_object_foreach(obj,key,val) \
|
||||
char *key;\
|
||||
struct json_object *val; \
|
||||
struct lh_entry *entry ## key; \
|
||||
struct lh_entry *entry_next ## key = NULL; \
|
||||
for(entry ## key = json_object_get_object(obj)->head; \
|
||||
(entry ## key ? ( \
|
||||
key = (char*)entry ## key->k, \
|
||||
val = (struct json_object*)entry ## key->v, \
|
||||
entry_next ## key = entry ## key->next, \
|
||||
entry ## key) : 0); \
|
||||
entry ## key = entry_next ## key)
|
||||
|
||||
#endif /* defined(__GNUC__) && !defined(__STRICT_ANSI__) && __STDC_VERSION__ >= 199901L */
|
||||
|
||||
/** Iterate through all keys and values of an object (ANSI C Safe)
|
||||
* @param obj the json_object instance
|
||||
* @param iter the object iterator
|
||||
*/
|
||||
#define json_object_object_foreachC(obj,iter) \
|
||||
for(iter.entry = json_object_get_object(obj)->head; (iter.entry ? (iter.key = (char*)iter.entry->k, iter.val = (struct json_object*)iter.entry->v, iter.entry) : 0); iter.entry = iter.entry->next)
|
||||
|
||||
/* Array type methods */
|
||||
|
||||
/** Create a new empty json_object of type json_type_array
|
||||
* @returns a json_object of type json_type_array
|
||||
*/
|
||||
extern struct json_object* json_object_new_array(void);
|
||||
|
||||
/** Get the arraylist of a json_object of type json_type_array
|
||||
* @param obj the json_object instance
|
||||
* @returns an arraylist
|
||||
*/
|
||||
extern struct array_list* json_object_get_array(struct json_object *obj);
|
||||
|
||||
/** Get the length of a json_object of type json_type_array
|
||||
* @param obj the json_object instance
|
||||
* @returns an int
|
||||
*/
|
||||
extern int json_object_array_length(struct json_object *obj);
|
||||
|
||||
/** Sorts the elements of jso of type json_type_array
|
||||
*
|
||||
* Pointers to the json_object pointers will be passed as the two arguments
|
||||
* to @sort_fn
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param sort_fn a sorting function
|
||||
*/
|
||||
extern void json_object_array_sort(struct json_object *jso, int(*sort_fn)(const void *, const void *));
|
||||
|
||||
/** Add an element to the end of a json_object of type json_type_array
|
||||
*
|
||||
* The reference count will *not* be incremented. This is to make adding
|
||||
* fields to objects in code more compact. If you want to retain a reference
|
||||
* to an added object you must wrap the passed object with json_object_get
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param val the json_object to be added
|
||||
*/
|
||||
extern int json_object_array_add(struct json_object *obj,
|
||||
struct json_object *val);
|
||||
|
||||
/** Insert or replace an element at a specified index in an array (a json_object of type json_type_array)
|
||||
*
|
||||
* The reference count will *not* be incremented. This is to make adding
|
||||
* fields to objects in code more compact. If you want to retain a reference
|
||||
* to an added object you must wrap the passed object with json_object_get
|
||||
*
|
||||
* The reference count of a replaced object will be decremented.
|
||||
*
|
||||
* The array size will be automatically be expanded to the size of the
|
||||
* index if the index is larger than the current size.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @param idx the index to insert the element at
|
||||
* @param val the json_object to be added
|
||||
*/
|
||||
extern int json_object_array_put_idx(struct json_object *obj, int idx,
|
||||
struct json_object *val);
|
||||
|
||||
/** Get the element at specificed index of the array (a json_object of type json_type_array)
|
||||
* @param obj the json_object instance
|
||||
* @param idx the index to get the element at
|
||||
* @returns the json_object at the specified index (or NULL)
|
||||
*/
|
||||
extern struct json_object* json_object_array_get_idx(struct json_object *obj,
|
||||
int idx);
|
||||
|
||||
/* json_bool type methods */
|
||||
|
||||
/** Create a new empty json_object of type json_type_boolean
|
||||
* @param b a json_bool TRUE or FALSE (0 or 1)
|
||||
* @returns a json_object of type json_type_boolean
|
||||
*/
|
||||
extern struct json_object* json_object_new_boolean(json_bool b);
|
||||
|
||||
/** Get the json_bool value of a json_object
|
||||
*
|
||||
* The type is coerced to a json_bool if the passed object is not a json_bool.
|
||||
* integer and double objects will return FALSE if there value is zero
|
||||
* or TRUE otherwise. If the passed object is a string it will return
|
||||
* TRUE if it has a non zero length. If any other object type is passed
|
||||
* TRUE will be returned if the object is not NULL.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns a json_bool
|
||||
*/
|
||||
extern json_bool json_object_get_boolean(struct json_object *obj);
|
||||
|
||||
|
||||
/* int type methods */
|
||||
|
||||
/** Create a new empty json_object of type json_type_int
|
||||
* Note that values are stored as 64-bit values internally.
|
||||
* To ensure the full range is maintained, use json_object_new_int64 instead.
|
||||
* @param i the integer
|
||||
* @returns a json_object of type json_type_int
|
||||
*/
|
||||
extern struct json_object* json_object_new_int(int32_t i);
|
||||
|
||||
|
||||
/** Create a new empty json_object of type json_type_int
|
||||
* @param i the integer
|
||||
* @returns a json_object of type json_type_int
|
||||
*/
|
||||
extern struct json_object* json_object_new_int64(int64_t i);
|
||||
|
||||
|
||||
/** Get the int value of a json_object
|
||||
*
|
||||
* The type is coerced to a int if the passed object is not a int.
|
||||
* double objects will return their integer conversion. Strings will be
|
||||
* parsed as an integer. If no conversion exists then 0 is returned
|
||||
* and errno is set to EINVAL. null is equivalent to 0 (no error values set)
|
||||
*
|
||||
* Note that integers are stored internally as 64-bit values.
|
||||
* If the value of too big or too small to fit into 32-bit, INT32_MAX or
|
||||
* INT32_MIN are returned, respectively.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns an int
|
||||
*/
|
||||
extern int32_t json_object_get_int(struct json_object *obj);
|
||||
|
||||
/** Get the int value of a json_object
|
||||
*
|
||||
* The type is coerced to a int64 if the passed object is not a int64.
|
||||
* double objects will return their int64 conversion. Strings will be
|
||||
* parsed as an int64. If no conversion exists then 0 is returned.
|
||||
*
|
||||
* NOTE: Set errno to 0 directly before a call to this function to determine
|
||||
* whether or not conversion was successful (it does not clear the value for
|
||||
* you).
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns an int64
|
||||
*/
|
||||
extern int64_t json_object_get_int64(struct json_object *obj);
|
||||
|
||||
|
||||
/* double type methods */
|
||||
|
||||
/** Create a new empty json_object of type json_type_double
|
||||
* @param d the double
|
||||
* @returns a json_object of type json_type_double
|
||||
*/
|
||||
extern struct json_object* json_object_new_double(double d);
|
||||
|
||||
/**
|
||||
* Create a new json_object of type json_type_double, using
|
||||
* the exact serialized representation of the value.
|
||||
*
|
||||
* This allows for numbers that would otherwise get displayed
|
||||
* inefficiently (e.g. 12.3 => "12.300000000000001") to be
|
||||
* serialized with the more convenient form.
|
||||
*
|
||||
* Note: this is used by json_tokener_parse_ex() to allow for
|
||||
* an exact re-serialization of a parsed object.
|
||||
*
|
||||
* An equivalent sequence of calls is:
|
||||
* @code
|
||||
* jso = json_object_new_double(d);
|
||||
* json_object_set_serializer(d, json_object_userdata_to_json_string,
|
||||
* strdup(ds), json_object_free_userdata)
|
||||
* @endcode
|
||||
*
|
||||
* @param d the numeric value of the double.
|
||||
* @param ds the string representation of the double. This will be copied.
|
||||
*/
|
||||
extern struct json_object* json_object_new_double_s(double d, const char *ds);
|
||||
|
||||
/** Get the double floating point value of a json_object
|
||||
*
|
||||
* The type is coerced to a double if the passed object is not a double.
|
||||
* integer objects will return their double conversion. Strings will be
|
||||
* parsed as a double. If no conversion exists then 0.0 is returned and
|
||||
* errno is set to EINVAL. null is equivalent to 0 (no error values set)
|
||||
*
|
||||
* If the value is too big to fit in a double, then the value is set to
|
||||
* the closest infinity with errno set to ERANGE. If strings cannot be
|
||||
* converted to their double value, then EINVAL is set & NaN is returned.
|
||||
*
|
||||
* Arrays of length 0 are interpreted as 0 (with no error flags set).
|
||||
* Arrays of length 1 are effectively cast to the equivalent object and
|
||||
* converted using the above rules. All other arrays set the error to
|
||||
* EINVAL & return NaN.
|
||||
*
|
||||
* NOTE: Set errno to 0 directly before a call to this function to
|
||||
* determine whether or not conversion was successful (it does not clear
|
||||
* the value for you).
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns a double floating point number
|
||||
*/
|
||||
extern double json_object_get_double(struct json_object *obj);
|
||||
|
||||
|
||||
/* string type methods */
|
||||
|
||||
/** Create a new empty json_object of type json_type_string
|
||||
*
|
||||
* A copy of the string is made and the memory is managed by the json_object
|
||||
*
|
||||
* @param s the string
|
||||
* @returns a json_object of type json_type_string
|
||||
*/
|
||||
extern struct json_object* json_object_new_string(const char *s);
|
||||
|
||||
extern struct json_object* json_object_new_string_len(const char *s, int len);
|
||||
|
||||
/** Get the string value of a json_object
|
||||
*
|
||||
* If the passed object is not of type json_type_string then the JSON
|
||||
* representation of the object is returned.
|
||||
*
|
||||
* The returned string memory is managed by the json_object and will
|
||||
* be freed when the reference count of the json_object drops to zero.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns a string
|
||||
*/
|
||||
extern const char* json_object_get_string(struct json_object *obj);
|
||||
|
||||
/** Get the string length of a json_object
|
||||
*
|
||||
* If the passed object is not of type json_type_string then zero
|
||||
* will be returned.
|
||||
*
|
||||
* @param obj the json_object instance
|
||||
* @returns int
|
||||
*/
|
||||
extern int json_object_get_string_len(struct json_object *obj);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
168
json-c/json_object_iterator.c
Normal file
168
json-c/json_object_iterator.c
Normal file
@@ -0,0 +1,168 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file json_object_iterator.c
|
||||
*
|
||||
* Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
* @brief json-c forces clients to use its private data
|
||||
* structures for JSON Object iteration. This API
|
||||
* implementation corrects that by abstracting the
|
||||
* private json-c details.
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#include "json.h"
|
||||
#include "json_object_private.h"
|
||||
|
||||
#include "json_object_iterator.h"
|
||||
|
||||
/**
|
||||
* How It Works
|
||||
*
|
||||
* For each JSON Object, json-c maintains a linked list of zero
|
||||
* or more lh_entry (link-hash entry) structures inside the
|
||||
* Object's link-hash table (lh_table).
|
||||
*
|
||||
* Each lh_entry structure on the JSON Object's linked list
|
||||
* represents a single name/value pair. The "next" field of the
|
||||
* last lh_entry in the list is set to NULL, which terminates
|
||||
* the list.
|
||||
*
|
||||
* We represent a valid iterator that refers to an actual
|
||||
* name/value pair via a pointer to the pair's lh_entry
|
||||
* structure set as the iterator's opaque_ field.
|
||||
*
|
||||
* We follow json-c's current pair list representation by
|
||||
* representing a valid "end" iterator (one that refers past the
|
||||
* last pair) with a NULL value in the iterator's opaque_ field.
|
||||
*
|
||||
* A JSON Object without any pairs in it will have the "head"
|
||||
* field of its lh_table structure set to NULL. For such an
|
||||
* object, json_object_iter_begin will return an iterator with
|
||||
* the opaque_ field set to NULL, which is equivalent to the
|
||||
* "end" iterator.
|
||||
*
|
||||
* When iterating, we simply update the iterator's opaque_ field
|
||||
* to point to the next lh_entry structure in the linked list.
|
||||
* opaque_ will become NULL once we iterate past the last pair
|
||||
* in the list, which makes the iterator equivalent to the "end"
|
||||
* iterator.
|
||||
*/
|
||||
|
||||
/// Our current representation of the "end" iterator;
|
||||
///
|
||||
/// @note May not always be NULL
|
||||
static const void* kObjectEndIterValue = NULL;
|
||||
|
||||
/**
|
||||
* ****************************************************************************
|
||||
*/
|
||||
struct json_object_iterator
|
||||
json_object_iter_begin(struct json_object* obj)
|
||||
{
|
||||
struct json_object_iterator iter;
|
||||
struct lh_table* pTable;
|
||||
|
||||
/// @note json_object_get_object will return NULL if passed NULL
|
||||
/// or a non-json_type_object instance
|
||||
pTable = json_object_get_object(obj);
|
||||
JASSERT(NULL != pTable);
|
||||
|
||||
/// @note For a pair-less Object, head is NULL, which matches our
|
||||
/// definition of the "end" iterator
|
||||
iter.opaque_ = pTable->head;
|
||||
return iter;
|
||||
}
|
||||
|
||||
/**
|
||||
* ****************************************************************************
|
||||
*/
|
||||
struct json_object_iterator
|
||||
json_object_iter_end(const struct json_object* obj)
|
||||
{
|
||||
struct json_object_iterator iter;
|
||||
|
||||
JASSERT(NULL != obj);
|
||||
JASSERT(json_object_is_type(obj, json_type_object));
|
||||
|
||||
iter.opaque_ = kObjectEndIterValue;
|
||||
|
||||
return iter;
|
||||
}
|
||||
|
||||
/**
|
||||
* ****************************************************************************
|
||||
*/
|
||||
void
|
||||
json_object_iter_next(struct json_object_iterator* iter)
|
||||
{
|
||||
JASSERT(NULL != iter);
|
||||
JASSERT(kObjectEndIterValue != iter->opaque_);
|
||||
|
||||
iter->opaque_ = ((struct lh_entry *)iter->opaque_)->next;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ****************************************************************************
|
||||
*/
|
||||
const char*
|
||||
json_object_iter_peek_name(const struct json_object_iterator* iter)
|
||||
{
|
||||
JASSERT(NULL != iter);
|
||||
JASSERT(kObjectEndIterValue != iter->opaque_);
|
||||
|
||||
return (const char*)(((struct lh_entry *)iter->opaque_)->k);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ****************************************************************************
|
||||
*/
|
||||
struct json_object*
|
||||
json_object_iter_peek_value(const struct json_object_iterator* iter)
|
||||
{
|
||||
JASSERT(NULL != iter);
|
||||
JASSERT(kObjectEndIterValue != iter->opaque_);
|
||||
|
||||
return (struct json_object*)(((struct lh_entry *)iter->opaque_)->v);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ****************************************************************************
|
||||
*/
|
||||
json_bool
|
||||
json_object_iter_equal(const struct json_object_iterator* iter1,
|
||||
const struct json_object_iterator* iter2)
|
||||
{
|
||||
JASSERT(NULL != iter1);
|
||||
JASSERT(NULL != iter2);
|
||||
|
||||
return (iter1->opaque_ == iter2->opaque_);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* ****************************************************************************
|
||||
*/
|
||||
struct json_object_iterator
|
||||
json_object_iter_init_default(void)
|
||||
{
|
||||
struct json_object_iterator iter;
|
||||
|
||||
/**
|
||||
* @note Make this a negative, invalid value, such that
|
||||
* accidental access to it would likely be trapped by the
|
||||
* hardware as an invalid address.
|
||||
*/
|
||||
iter.opaque_ = NULL;
|
||||
|
||||
return iter;
|
||||
}
|
||||
239
json-c/json_object_iterator.h
Normal file
239
json-c/json_object_iterator.h
Normal file
@@ -0,0 +1,239 @@
|
||||
/**
|
||||
*******************************************************************************
|
||||
* @file json_object_iterator.h
|
||||
*
|
||||
* Copyright (c) 2009-2012 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
* @brief json-c forces clients to use its private data
|
||||
* structures for JSON Object iteration. This API
|
||||
* corrects that by abstracting the private json-c
|
||||
* details.
|
||||
*
|
||||
* API attributes: <br>
|
||||
* * Thread-safe: NO<br>
|
||||
* * Reentrant: NO
|
||||
*
|
||||
*******************************************************************************
|
||||
*/
|
||||
|
||||
|
||||
#ifndef JSON_OBJECT_ITERATOR_H
|
||||
#define JSON_OBJECT_ITERATOR_H
|
||||
|
||||
#include <stddef.h>
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* Forward declaration for the opaque iterator information.
|
||||
*/
|
||||
struct json_object_iter_info_;
|
||||
|
||||
/**
|
||||
* The opaque iterator that references a name/value pair within
|
||||
* a JSON Object instance or the "end" iterator value.
|
||||
*/
|
||||
struct json_object_iterator {
|
||||
const void* opaque_;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* forward declaration of json-c's JSON value instance structure
|
||||
*/
|
||||
struct json_object;
|
||||
|
||||
|
||||
/**
|
||||
* Initializes an iterator structure to a "default" value that
|
||||
* is convenient for initializing an iterator variable to a
|
||||
* default state (e.g., initialization list in a class'
|
||||
* constructor).
|
||||
*
|
||||
* @code
|
||||
* struct json_object_iterator iter = json_object_iter_init_default();
|
||||
* MyClass() : iter_(json_object_iter_init_default())
|
||||
* @endcode
|
||||
*
|
||||
* @note The initialized value doesn't reference any specific
|
||||
* pair, is considered an invalid iterator, and MUST NOT
|
||||
* be passed to any json-c API that expects a valid
|
||||
* iterator.
|
||||
*
|
||||
* @note User and internal code MUST NOT make any assumptions
|
||||
* about and dependencies on the value of the "default"
|
||||
* iterator value.
|
||||
*
|
||||
* @return json_object_iterator
|
||||
*/
|
||||
struct json_object_iterator
|
||||
json_object_iter_init_default(void);
|
||||
|
||||
/** Retrieves an iterator to the first pair of the JSON Object.
|
||||
*
|
||||
* @warning Any modification of the underlying pair invalidates all
|
||||
* iterators to that pair.
|
||||
*
|
||||
* @param obj JSON Object instance (MUST be of type json_object)
|
||||
*
|
||||
* @return json_object_iterator If the JSON Object has at
|
||||
* least one pair, on return, the iterator refers
|
||||
* to the first pair. If the JSON Object doesn't
|
||||
* have any pairs, the returned iterator is
|
||||
* equivalent to the "end" iterator for the same
|
||||
* JSON Object instance.
|
||||
*
|
||||
* @code
|
||||
* struct json_object_iterator it;
|
||||
* struct json_object_iterator itEnd;
|
||||
* struct json_object* obj;
|
||||
*
|
||||
* obj = json_tokener_parse("{'first':'george', 'age':100}");
|
||||
* it = json_object_iter_begin(obj);
|
||||
* itEnd = json_object_iter_end(obj);
|
||||
*
|
||||
* while (!json_object_iter_equal(&it, &itEnd)) {
|
||||
* printf("%s\n",
|
||||
* json_object_iter_peek_name(&it));
|
||||
* json_object_iter_next(&it);
|
||||
* }
|
||||
*
|
||||
* @endcode
|
||||
*/
|
||||
struct json_object_iterator
|
||||
json_object_iter_begin(struct json_object* obj);
|
||||
|
||||
/** Retrieves the iterator that represents the position beyond the
|
||||
* last pair of the given JSON Object instance.
|
||||
*
|
||||
* @warning Do NOT write code that assumes that the "end"
|
||||
* iterator value is NULL, even if it is so in a
|
||||
* particular instance of the implementation.
|
||||
*
|
||||
* @note The reason we do not (and MUST NOT) provide
|
||||
* "json_object_iter_is_end(json_object_iterator* iter)"
|
||||
* type of API is because it would limit the underlying
|
||||
* representation of name/value containment (or force us
|
||||
* to add additional, otherwise unnecessary, fields to
|
||||
* the iterator structure). The "end" iterator and the
|
||||
* equality test method, on the other hand, permit us to
|
||||
* cleanly abstract pretty much any reasonable underlying
|
||||
* representation without burdening the iterator
|
||||
* structure with unnecessary data.
|
||||
*
|
||||
* @note For performance reasons, memorize the "end" iterator prior
|
||||
* to any loop.
|
||||
*
|
||||
* @param obj JSON Object instance (MUST be of type json_object)
|
||||
*
|
||||
* @return json_object_iterator On return, the iterator refers
|
||||
* to the "end" of the Object instance's pairs
|
||||
* (i.e., NOT the last pair, but "beyond the last
|
||||
* pair" value)
|
||||
*/
|
||||
struct json_object_iterator
|
||||
json_object_iter_end(const struct json_object* obj);
|
||||
|
||||
/** Returns an iterator to the next pair, if any
|
||||
*
|
||||
* @warning Any modification of the underlying pair
|
||||
* invalidates all iterators to that pair.
|
||||
*
|
||||
* @param iter [IN/OUT] Pointer to iterator that references a
|
||||
* name/value pair; MUST be a valid, non-end iterator.
|
||||
* WARNING: bad things will happen if invalid or "end"
|
||||
* iterator is passed. Upon return will contain the
|
||||
* reference to the next pair if there is one; if there
|
||||
* are no more pairs, will contain the "end" iterator
|
||||
* value, which may be compared against the return value
|
||||
* of json_object_iter_end() for the same JSON Object
|
||||
* instance.
|
||||
*/
|
||||
void
|
||||
json_object_iter_next(struct json_object_iterator* iter);
|
||||
|
||||
|
||||
/** Returns a const pointer to the name of the pair referenced
|
||||
* by the given iterator.
|
||||
*
|
||||
* @param iter pointer to iterator that references a name/value
|
||||
* pair; MUST be a valid, non-end iterator.
|
||||
*
|
||||
* @warning bad things will happen if an invalid or
|
||||
* "end" iterator is passed.
|
||||
*
|
||||
* @return const char* Pointer to the name of the referenced
|
||||
* name/value pair. The name memory belongs to the
|
||||
* name/value pair, will be freed when the pair is
|
||||
* deleted or modified, and MUST NOT be modified or
|
||||
* freed by the user.
|
||||
*/
|
||||
const char*
|
||||
json_object_iter_peek_name(const struct json_object_iterator* iter);
|
||||
|
||||
|
||||
/** Returns a pointer to the json-c instance representing the
|
||||
* value of the referenced name/value pair, without altering
|
||||
* the instance's reference count.
|
||||
*
|
||||
* @param iter pointer to iterator that references a name/value
|
||||
* pair; MUST be a valid, non-end iterator.
|
||||
*
|
||||
* @warning bad things will happen if invalid or
|
||||
* "end" iterator is passed.
|
||||
*
|
||||
* @return struct json_object* Pointer to the json-c value
|
||||
* instance of the referenced name/value pair; the
|
||||
* value's reference count is not changed by this
|
||||
* function: if you plan to hold on to this json-c node,
|
||||
* take a look at json_object_get() and
|
||||
* json_object_put(). IMPORTANT: json-c API represents
|
||||
* the JSON Null value as a NULL json_object instance
|
||||
* pointer.
|
||||
*/
|
||||
struct json_object*
|
||||
json_object_iter_peek_value(const struct json_object_iterator* iter);
|
||||
|
||||
|
||||
/** Tests two iterators for equality. Typically used to test
|
||||
* for end of iteration by comparing an iterator to the
|
||||
* corresponding "end" iterator (that was derived from the same
|
||||
* JSON Object instance).
|
||||
*
|
||||
* @note The reason we do not (and MUST NOT) provide
|
||||
* "json_object_iter_is_end(json_object_iterator* iter)"
|
||||
* type of API is because it would limit the underlying
|
||||
* representation of name/value containment (or force us
|
||||
* to add additional, otherwise unnecessary, fields to
|
||||
* the iterator structure). The equality test method, on
|
||||
* the other hand, permits us to cleanly abstract pretty
|
||||
* much any reasonable underlying representation.
|
||||
*
|
||||
* @param iter1 Pointer to first valid, non-NULL iterator
|
||||
* @param iter2 POinter to second valid, non-NULL iterator
|
||||
*
|
||||
* @warning if a NULL iterator pointer or an uninitialized
|
||||
* or invalid iterator, or iterators derived from
|
||||
* different JSON Object instances are passed, bad things
|
||||
* will happen!
|
||||
*
|
||||
* @return json_bool non-zero if iterators are equal (i.e., both
|
||||
* reference the same name/value pair or are both at
|
||||
* "end"); zero if they are not equal.
|
||||
*/
|
||||
json_bool
|
||||
json_object_iter_equal(const struct json_object_iterator* iter1,
|
||||
const struct json_object_iterator* iter2);
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
#endif /* JSON_OBJECT_ITERATOR_H */
|
||||
47
json-c/json_object_private.h
Normal file
47
json-c/json_object_private.h
Normal file
@@ -0,0 +1,47 @@
|
||||
/*
|
||||
* $Id: json_object_private.h,v 1.4 2006/01/26 02:16:28 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _json_object_private_h_
|
||||
#define _json_object_private_h_
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
typedef void (json_object_private_delete_fn)(struct json_object *o);
|
||||
|
||||
struct json_object
|
||||
{
|
||||
enum json_type o_type;
|
||||
json_object_private_delete_fn *_delete;
|
||||
json_object_to_json_string_fn *_to_json_string;
|
||||
int _ref_count;
|
||||
struct printbuf *_pb;
|
||||
union data {
|
||||
json_bool c_boolean;
|
||||
double c_double;
|
||||
int64_t c_int64;
|
||||
struct lh_table *c_object;
|
||||
struct array_list *c_array;
|
||||
struct {
|
||||
char *str;
|
||||
int len;
|
||||
} c_string;
|
||||
} o;
|
||||
json_object_delete_fn *_user_delete;
|
||||
void *_userdata;
|
||||
};
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
887
json-c/json_tokener.c
Normal file
887
json-c/json_tokener.c
Normal file
@@ -0,0 +1,887 @@
|
||||
/*
|
||||
* $Id: json_tokener.c,v 1.20 2006/07/25 03:24:50 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*
|
||||
* Copyright (c) 2008-2009 Yahoo! Inc. All rights reserved.
|
||||
* The copyrights to the contents of this file are licensed under the MIT License
|
||||
* (http://www.opensource.org/licenses/mit-license.php)
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
|
||||
#include <math.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <ctype.h>
|
||||
#include <string.h>
|
||||
#include <limits.h>
|
||||
|
||||
#include "debug.h"
|
||||
#include "printbuf.h"
|
||||
#include "arraylist.h"
|
||||
#include "json_inttypes.h"
|
||||
#include "json_object.h"
|
||||
#include "json_tokener.h"
|
||||
#include "json_util.h"
|
||||
|
||||
#ifdef HAVE_LOCALE_H
|
||||
#include <locale.h>
|
||||
#endif /* HAVE_LOCALE_H */
|
||||
|
||||
#define jt_hexdigit(x) (((x) <= '9') ? (x) - '0' : ((x) & 7) + 9)
|
||||
|
||||
#if !HAVE_STRDUP && defined(_MSC_VER)
|
||||
/* MSC has the version as _strdup */
|
||||
# define strdup _strdup
|
||||
#elif !HAVE_STRDUP
|
||||
# error You do not have strdup on your system.
|
||||
#endif /* HAVE_STRDUP */
|
||||
|
||||
#if !HAVE_STRNCASECMP && defined(_MSC_VER)
|
||||
/* MSC has the version as _strnicmp */
|
||||
# define strncasecmp _strnicmp
|
||||
#elif !HAVE_STRNCASECMP
|
||||
# error You do not have strncasecmp on your system.
|
||||
#endif /* HAVE_STRNCASECMP */
|
||||
|
||||
/* Use C99 NAN by default; if not available, nan("") should work too. */
|
||||
#ifndef NAN
|
||||
#define NAN nan("")
|
||||
#endif /* !NAN */
|
||||
|
||||
static const char json_null_str[] = "null";
|
||||
static const int json_null_str_len = sizeof(json_null_str) - 1;
|
||||
static const char json_inf_str[] = "Infinity";
|
||||
static const int json_inf_str_len = sizeof(json_inf_str) - 1;
|
||||
static const char json_nan_str[] = "NaN";
|
||||
static const int json_nan_str_len = sizeof(json_nan_str) - 1;
|
||||
static const char json_true_str[] = "true";
|
||||
static const int json_true_str_len = sizeof(json_true_str) - 1;
|
||||
static const char json_false_str[] = "false";
|
||||
static const int json_false_str_len = sizeof(json_false_str) - 1;
|
||||
|
||||
static const char* json_tokener_errors[] = {
|
||||
"success",
|
||||
"continue",
|
||||
"nesting too deep",
|
||||
"unexpected end of data",
|
||||
"unexpected character",
|
||||
"null expected",
|
||||
"boolean expected",
|
||||
"number expected",
|
||||
"array value separator ',' expected",
|
||||
"quoted object property name expected",
|
||||
"object property name separator ':' expected",
|
||||
"object value separator ',' expected",
|
||||
"invalid string sequence",
|
||||
"expected comment",
|
||||
"buffer size overflow"
|
||||
};
|
||||
|
||||
const char *json_tokener_error_desc(enum json_tokener_error jerr)
|
||||
{
|
||||
int jerr_int = (int)jerr;
|
||||
if (jerr_int < 0 || jerr_int >= (int)(sizeof(json_tokener_errors) / sizeof(json_tokener_errors[0])))
|
||||
return "Unknown error, invalid json_tokener_error value passed to json_tokener_error_desc()";
|
||||
return json_tokener_errors[jerr];
|
||||
}
|
||||
|
||||
enum json_tokener_error json_tokener_get_error(json_tokener *tok)
|
||||
{
|
||||
return tok->err;
|
||||
}
|
||||
|
||||
/* Stuff for decoding unicode sequences */
|
||||
#define IS_HIGH_SURROGATE(uc) (((uc) & 0xFC00) == 0xD800)
|
||||
#define IS_LOW_SURROGATE(uc) (((uc) & 0xFC00) == 0xDC00)
|
||||
#define DECODE_SURROGATE_PAIR(hi,lo) ((((hi) & 0x3FF) << 10) + ((lo) & 0x3FF) + 0x10000)
|
||||
static unsigned char utf8_replacement_char[3] = { 0xEF, 0xBF, 0xBD };
|
||||
|
||||
struct json_tokener* json_tokener_new_ex(int depth)
|
||||
{
|
||||
struct json_tokener *tok;
|
||||
|
||||
tok = (struct json_tokener*)calloc(1, sizeof(struct json_tokener));
|
||||
if (!tok) return NULL;
|
||||
tok->stack = (struct json_tokener_srec *)calloc(depth, sizeof(struct json_tokener_srec));
|
||||
if (!tok->stack) {
|
||||
free(tok);
|
||||
return NULL;
|
||||
}
|
||||
tok->pb = printbuf_new();
|
||||
tok->max_depth = depth;
|
||||
json_tokener_reset(tok);
|
||||
return tok;
|
||||
}
|
||||
|
||||
struct json_tokener* json_tokener_new(void)
|
||||
{
|
||||
return json_tokener_new_ex(JSON_TOKENER_DEFAULT_DEPTH);
|
||||
}
|
||||
|
||||
void json_tokener_free(struct json_tokener *tok)
|
||||
{
|
||||
json_tokener_reset(tok);
|
||||
if (tok->pb) printbuf_free(tok->pb);
|
||||
if (tok->stack) free(tok->stack);
|
||||
free(tok);
|
||||
}
|
||||
|
||||
static void json_tokener_reset_level(struct json_tokener *tok, int depth)
|
||||
{
|
||||
tok->stack[depth].state = json_tokener_state_eatws;
|
||||
tok->stack[depth].saved_state = json_tokener_state_start;
|
||||
json_object_put(tok->stack[depth].current);
|
||||
tok->stack[depth].current = NULL;
|
||||
free(tok->stack[depth].obj_field_name);
|
||||
tok->stack[depth].obj_field_name = NULL;
|
||||
}
|
||||
|
||||
void json_tokener_reset(struct json_tokener *tok)
|
||||
{
|
||||
int i;
|
||||
if (!tok)
|
||||
return;
|
||||
|
||||
for(i = tok->depth; i >= 0; i--)
|
||||
json_tokener_reset_level(tok, i);
|
||||
tok->depth = 0;
|
||||
tok->err = json_tokener_success;
|
||||
}
|
||||
|
||||
struct json_object* json_tokener_parse(const char *str)
|
||||
{
|
||||
enum json_tokener_error jerr_ignored;
|
||||
struct json_object* obj;
|
||||
obj = json_tokener_parse_verbose(str, &jerr_ignored);
|
||||
return obj;
|
||||
}
|
||||
|
||||
struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error)
|
||||
{
|
||||
struct json_tokener* tok;
|
||||
struct json_object* obj;
|
||||
|
||||
tok = json_tokener_new();
|
||||
if (!tok)
|
||||
return NULL;
|
||||
obj = json_tokener_parse_ex(tok, str, -1);
|
||||
*error = tok->err;
|
||||
if(tok->err != json_tokener_success) {
|
||||
if (obj != NULL)
|
||||
json_object_put(obj);
|
||||
obj = NULL;
|
||||
}
|
||||
|
||||
json_tokener_free(tok);
|
||||
return obj;
|
||||
}
|
||||
|
||||
#define state tok->stack[tok->depth].state
|
||||
#define saved_state tok->stack[tok->depth].saved_state
|
||||
#define current tok->stack[tok->depth].current
|
||||
#define obj_field_name tok->stack[tok->depth].obj_field_name
|
||||
|
||||
/* Optimization:
|
||||
* json_tokener_parse_ex() consumed a lot of CPU in its main loop,
|
||||
* iterating character-by character. A large performance boost is
|
||||
* achieved by using tighter loops to locally handle units such as
|
||||
* comments and strings. Loops that handle an entire token within
|
||||
* their scope also gather entire strings and pass them to
|
||||
* printbuf_memappend() in a single call, rather than calling
|
||||
* printbuf_memappend() one char at a time.
|
||||
*
|
||||
* PEEK_CHAR() and ADVANCE_CHAR() macros are used for code that is
|
||||
* common to both the main loop and the tighter loops.
|
||||
*/
|
||||
|
||||
/* PEEK_CHAR(dest, tok) macro:
|
||||
* Peeks at the current char and stores it in dest.
|
||||
* Returns 1 on success, sets tok->err and returns 0 if no more chars.
|
||||
* Implicit inputs: str, len vars
|
||||
*/
|
||||
#define PEEK_CHAR(dest, tok) \
|
||||
(((tok)->char_offset == len) ? \
|
||||
(((tok)->depth == 0 && state == json_tokener_state_eatws && saved_state == json_tokener_state_finish) ? \
|
||||
(((tok)->err = json_tokener_success), 0) \
|
||||
: \
|
||||
(((tok)->err = json_tokener_continue), 0) \
|
||||
) : \
|
||||
(((dest) = *str), 1) \
|
||||
)
|
||||
|
||||
/* ADVANCE_CHAR() macro:
|
||||
* Incrementes str & tok->char_offset.
|
||||
* For convenience of existing conditionals, returns the old value of c (0 on eof)
|
||||
* Implicit inputs: c var
|
||||
*/
|
||||
#define ADVANCE_CHAR(str, tok) \
|
||||
( ++(str), ((tok)->char_offset)++, c)
|
||||
|
||||
|
||||
/* End optimization macro defs */
|
||||
|
||||
|
||||
struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
|
||||
const char *str, int len)
|
||||
{
|
||||
struct json_object *obj = NULL;
|
||||
char c = '\1';
|
||||
#ifdef HAVE_SETLOCALE
|
||||
char *oldlocale=NULL, *tmplocale;
|
||||
|
||||
tmplocale = setlocale(LC_NUMERIC, NULL);
|
||||
if (tmplocale) oldlocale = strdup(tmplocale);
|
||||
setlocale(LC_NUMERIC, "C");
|
||||
#endif
|
||||
|
||||
tok->char_offset = 0;
|
||||
tok->err = json_tokener_success;
|
||||
|
||||
/* this interface is presently not 64-bit clean due to the int len argument
|
||||
and the internal printbuf interface that takes 32-bit int len arguments
|
||||
so the function limits the maximum string size to INT32_MAX (2GB).
|
||||
If the function is called with len == -1 then strlen is called to check
|
||||
the string length is less than INT32_MAX (2GB) */
|
||||
if ((len < -1) || (len == -1 && strlen(str) > INT32_MAX)) {
|
||||
tok->err = json_tokener_error_size;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
while (PEEK_CHAR(c, tok)) {
|
||||
|
||||
redo_char:
|
||||
switch(state) {
|
||||
|
||||
case json_tokener_state_eatws:
|
||||
/* Advance until we change state */
|
||||
while (isspace((int)c)) {
|
||||
if ((!ADVANCE_CHAR(str, tok)) || (!PEEK_CHAR(c, tok)))
|
||||
goto out;
|
||||
}
|
||||
if(c == '/' && !(tok->flags & JSON_TOKENER_STRICT)) {
|
||||
printbuf_reset(tok->pb);
|
||||
printbuf_memappend_fast(tok->pb, &c, 1);
|
||||
state = json_tokener_state_comment_start;
|
||||
} else {
|
||||
state = saved_state;
|
||||
goto redo_char;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_start:
|
||||
switch(c) {
|
||||
case '{':
|
||||
state = json_tokener_state_eatws;
|
||||
saved_state = json_tokener_state_object_field_start;
|
||||
current = json_object_new_object();
|
||||
break;
|
||||
case '[':
|
||||
state = json_tokener_state_eatws;
|
||||
saved_state = json_tokener_state_array;
|
||||
current = json_object_new_array();
|
||||
break;
|
||||
case 'I':
|
||||
case 'i':
|
||||
state = json_tokener_state_inf;
|
||||
printbuf_reset(tok->pb);
|
||||
tok->st_pos = 0;
|
||||
goto redo_char;
|
||||
case 'N':
|
||||
case 'n':
|
||||
state = json_tokener_state_null; // or NaN
|
||||
printbuf_reset(tok->pb);
|
||||
tok->st_pos = 0;
|
||||
goto redo_char;
|
||||
case '\'':
|
||||
if (tok->flags & JSON_TOKENER_STRICT) {
|
||||
/* in STRICT mode only double-quote are allowed */
|
||||
tok->err = json_tokener_error_parse_unexpected;
|
||||
goto out;
|
||||
}
|
||||
case '"':
|
||||
state = json_tokener_state_string;
|
||||
printbuf_reset(tok->pb);
|
||||
tok->quote_char = c;
|
||||
break;
|
||||
case 'T':
|
||||
case 't':
|
||||
case 'F':
|
||||
case 'f':
|
||||
state = json_tokener_state_boolean;
|
||||
printbuf_reset(tok->pb);
|
||||
tok->st_pos = 0;
|
||||
goto redo_char;
|
||||
#if defined(__GNUC__)
|
||||
case '0' ... '9':
|
||||
#else
|
||||
case '0':
|
||||
case '1':
|
||||
case '2':
|
||||
case '3':
|
||||
case '4':
|
||||
case '5':
|
||||
case '6':
|
||||
case '7':
|
||||
case '8':
|
||||
case '9':
|
||||
#endif
|
||||
case '-':
|
||||
state = json_tokener_state_number;
|
||||
printbuf_reset(tok->pb);
|
||||
tok->is_double = 0;
|
||||
goto redo_char;
|
||||
default:
|
||||
tok->err = json_tokener_error_parse_unexpected;
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_finish:
|
||||
if(tok->depth == 0) goto out;
|
||||
obj = json_object_get(current);
|
||||
json_tokener_reset_level(tok, tok->depth);
|
||||
tok->depth--;
|
||||
goto redo_char;
|
||||
|
||||
case json_tokener_state_inf: /* aka starts with 'i' */
|
||||
{
|
||||
int size_inf;
|
||||
int is_negative = 0;
|
||||
|
||||
printbuf_memappend_fast(tok->pb, &c, 1);
|
||||
size_inf = json_min(tok->st_pos+1, json_inf_str_len);
|
||||
char *infbuf = tok->pb->buf;
|
||||
if (*infbuf == '-')
|
||||
{
|
||||
infbuf++;
|
||||
is_negative = 1;
|
||||
}
|
||||
if ((!(tok->flags & JSON_TOKENER_STRICT) &&
|
||||
strncasecmp(json_inf_str, infbuf, size_inf) == 0) ||
|
||||
(strncmp(json_inf_str, infbuf, size_inf) == 0)
|
||||
)
|
||||
{
|
||||
if (tok->st_pos == json_inf_str_len)
|
||||
{
|
||||
current = json_object_new_double(is_negative ? -INFINITY : INFINITY);
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
goto redo_char;
|
||||
}
|
||||
} else {
|
||||
tok->err = json_tokener_error_parse_unexpected;
|
||||
goto out;
|
||||
}
|
||||
tok->st_pos++;
|
||||
}
|
||||
break;
|
||||
case json_tokener_state_null: /* aka starts with 'n' */
|
||||
{
|
||||
int size;
|
||||
int size_nan;
|
||||
printbuf_memappend_fast(tok->pb, &c, 1);
|
||||
size = json_min(tok->st_pos+1, json_null_str_len);
|
||||
size_nan = json_min(tok->st_pos+1, json_nan_str_len);
|
||||
if((!(tok->flags & JSON_TOKENER_STRICT) &&
|
||||
strncasecmp(json_null_str, tok->pb->buf, size) == 0)
|
||||
|| (strncmp(json_null_str, tok->pb->buf, size) == 0)
|
||||
) {
|
||||
if (tok->st_pos == json_null_str_len) {
|
||||
current = NULL;
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
goto redo_char;
|
||||
}
|
||||
}
|
||||
else if ((!(tok->flags & JSON_TOKENER_STRICT) &&
|
||||
strncasecmp(json_nan_str, tok->pb->buf, size_nan) == 0) ||
|
||||
(strncmp(json_nan_str, tok->pb->buf, size_nan) == 0)
|
||||
)
|
||||
{
|
||||
if (tok->st_pos == json_nan_str_len)
|
||||
{
|
||||
current = json_object_new_double(NAN);
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
goto redo_char;
|
||||
}
|
||||
} else {
|
||||
tok->err = json_tokener_error_parse_null;
|
||||
goto out;
|
||||
}
|
||||
tok->st_pos++;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_comment_start:
|
||||
if(c == '*') {
|
||||
state = json_tokener_state_comment;
|
||||
} else if(c == '/') {
|
||||
state = json_tokener_state_comment_eol;
|
||||
} else {
|
||||
tok->err = json_tokener_error_parse_comment;
|
||||
goto out;
|
||||
}
|
||||
printbuf_memappend_fast(tok->pb, &c, 1);
|
||||
break;
|
||||
|
||||
case json_tokener_state_comment:
|
||||
{
|
||||
/* Advance until we change state */
|
||||
const char *case_start = str;
|
||||
while(c != '*') {
|
||||
if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
|
||||
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
printbuf_memappend_fast(tok->pb, case_start, 1+str-case_start);
|
||||
state = json_tokener_state_comment_end;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_comment_eol:
|
||||
{
|
||||
/* Advance until we change state */
|
||||
const char *case_start = str;
|
||||
while(c != '\n') {
|
||||
if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
|
||||
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
||||
MC_DEBUG("json_tokener_comment: %s\n", tok->pb->buf);
|
||||
state = json_tokener_state_eatws;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_comment_end:
|
||||
printbuf_memappend_fast(tok->pb, &c, 1);
|
||||
if(c == '/') {
|
||||
MC_DEBUG("json_tokener_comment: %s\n", tok->pb->buf);
|
||||
state = json_tokener_state_eatws;
|
||||
} else {
|
||||
state = json_tokener_state_comment;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_string:
|
||||
{
|
||||
/* Advance until we change state */
|
||||
const char *case_start = str;
|
||||
while(1) {
|
||||
if(c == tok->quote_char) {
|
||||
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
||||
current = json_object_new_string_len(tok->pb->buf, tok->pb->bpos);
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
break;
|
||||
} else if(c == '\\') {
|
||||
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
||||
saved_state = json_tokener_state_string;
|
||||
state = json_tokener_state_string_escape;
|
||||
break;
|
||||
}
|
||||
if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
|
||||
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_string_escape:
|
||||
switch(c) {
|
||||
case '"':
|
||||
case '\\':
|
||||
case '/':
|
||||
printbuf_memappend_fast(tok->pb, &c, 1);
|
||||
state = saved_state;
|
||||
break;
|
||||
case 'b':
|
||||
case 'n':
|
||||
case 'r':
|
||||
case 't':
|
||||
case 'f':
|
||||
if(c == 'b') printbuf_memappend_fast(tok->pb, "\b", 1);
|
||||
else if(c == 'n') printbuf_memappend_fast(tok->pb, "\n", 1);
|
||||
else if(c == 'r') printbuf_memappend_fast(tok->pb, "\r", 1);
|
||||
else if(c == 't') printbuf_memappend_fast(tok->pb, "\t", 1);
|
||||
else if(c == 'f') printbuf_memappend_fast(tok->pb, "\f", 1);
|
||||
state = saved_state;
|
||||
break;
|
||||
case 'u':
|
||||
tok->ucs_char = 0;
|
||||
tok->st_pos = 0;
|
||||
state = json_tokener_state_escape_unicode;
|
||||
break;
|
||||
default:
|
||||
tok->err = json_tokener_error_parse_string;
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_escape_unicode:
|
||||
{
|
||||
unsigned int got_hi_surrogate = 0;
|
||||
|
||||
/* Handle a 4-byte sequence, or two sequences if a surrogate pair */
|
||||
while(1) {
|
||||
if(strchr(json_hex_chars, c)) {
|
||||
tok->ucs_char += ((unsigned int)jt_hexdigit(c) << ((3-tok->st_pos++)*4));
|
||||
if(tok->st_pos == 4) {
|
||||
unsigned char unescaped_utf[4];
|
||||
|
||||
if (got_hi_surrogate) {
|
||||
if (IS_LOW_SURROGATE(tok->ucs_char)) {
|
||||
/* Recalculate the ucs_char, then fall thru to process normally */
|
||||
tok->ucs_char = DECODE_SURROGATE_PAIR(got_hi_surrogate, tok->ucs_char);
|
||||
} else {
|
||||
/* Hi surrogate was not followed by a low surrogate */
|
||||
/* Replace the hi and process the rest normally */
|
||||
printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
|
||||
}
|
||||
got_hi_surrogate = 0;
|
||||
}
|
||||
|
||||
if (tok->ucs_char < 0x80) {
|
||||
unescaped_utf[0] = tok->ucs_char;
|
||||
printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 1);
|
||||
} else if (tok->ucs_char < 0x800) {
|
||||
unescaped_utf[0] = 0xc0 | (tok->ucs_char >> 6);
|
||||
unescaped_utf[1] = 0x80 | (tok->ucs_char & 0x3f);
|
||||
printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 2);
|
||||
} else if (IS_HIGH_SURROGATE(tok->ucs_char)) {
|
||||
/* Got a high surrogate. Remember it and look for the
|
||||
* the beginning of another sequence, which should be the
|
||||
* low surrogate.
|
||||
*/
|
||||
got_hi_surrogate = tok->ucs_char;
|
||||
/* Not at end, and the next two chars should be "\u" */
|
||||
if ((tok->char_offset+1 != len) &&
|
||||
(tok->char_offset+2 != len) &&
|
||||
(str[1] == '\\') &&
|
||||
(str[2] == 'u'))
|
||||
{
|
||||
/* Advance through the 16 bit surrogate, and move on to the
|
||||
* next sequence. The next step is to process the following
|
||||
* characters.
|
||||
*/
|
||||
if( !ADVANCE_CHAR(str, tok) || !ADVANCE_CHAR(str, tok) ) {
|
||||
printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
|
||||
}
|
||||
/* Advance to the first char of the next sequence and
|
||||
* continue processing with the next sequence.
|
||||
*/
|
||||
if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
|
||||
printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
|
||||
goto out;
|
||||
}
|
||||
tok->ucs_char = 0;
|
||||
tok->st_pos = 0;
|
||||
continue; /* other json_tokener_state_escape_unicode */
|
||||
} else {
|
||||
/* Got a high surrogate without another sequence following
|
||||
* it. Put a replacement char in for the hi surrogate
|
||||
* and pretend we finished.
|
||||
*/
|
||||
printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
|
||||
}
|
||||
} else if (IS_LOW_SURROGATE(tok->ucs_char)) {
|
||||
/* Got a low surrogate not preceded by a high */
|
||||
printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
|
||||
} else if (tok->ucs_char < 0x10000) {
|
||||
unescaped_utf[0] = 0xe0 | (tok->ucs_char >> 12);
|
||||
unescaped_utf[1] = 0x80 | ((tok->ucs_char >> 6) & 0x3f);
|
||||
unescaped_utf[2] = 0x80 | (tok->ucs_char & 0x3f);
|
||||
printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 3);
|
||||
} else if (tok->ucs_char < 0x110000) {
|
||||
unescaped_utf[0] = 0xf0 | ((tok->ucs_char >> 18) & 0x07);
|
||||
unescaped_utf[1] = 0x80 | ((tok->ucs_char >> 12) & 0x3f);
|
||||
unescaped_utf[2] = 0x80 | ((tok->ucs_char >> 6) & 0x3f);
|
||||
unescaped_utf[3] = 0x80 | (tok->ucs_char & 0x3f);
|
||||
printbuf_memappend_fast(tok->pb, (char*)unescaped_utf, 4);
|
||||
} else {
|
||||
/* Don't know what we got--insert the replacement char */
|
||||
printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
|
||||
}
|
||||
state = saved_state;
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
tok->err = json_tokener_error_parse_string;
|
||||
goto out;
|
||||
}
|
||||
if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
|
||||
if (got_hi_surrogate) /* Clean up any pending chars */
|
||||
printbuf_memappend_fast(tok->pb, (char*)utf8_replacement_char, 3);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_boolean:
|
||||
{
|
||||
int size1, size2;
|
||||
printbuf_memappend_fast(tok->pb, &c, 1);
|
||||
size1 = json_min(tok->st_pos+1, json_true_str_len);
|
||||
size2 = json_min(tok->st_pos+1, json_false_str_len);
|
||||
if((!(tok->flags & JSON_TOKENER_STRICT) &&
|
||||
strncasecmp(json_true_str, tok->pb->buf, size1) == 0)
|
||||
|| (strncmp(json_true_str, tok->pb->buf, size1) == 0)
|
||||
) {
|
||||
if(tok->st_pos == json_true_str_len) {
|
||||
current = json_object_new_boolean(1);
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
goto redo_char;
|
||||
}
|
||||
} else if((!(tok->flags & JSON_TOKENER_STRICT) &&
|
||||
strncasecmp(json_false_str, tok->pb->buf, size2) == 0)
|
||||
|| (strncmp(json_false_str, tok->pb->buf, size2) == 0)) {
|
||||
if(tok->st_pos == json_false_str_len) {
|
||||
current = json_object_new_boolean(0);
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
goto redo_char;
|
||||
}
|
||||
} else {
|
||||
tok->err = json_tokener_error_parse_boolean;
|
||||
goto out;
|
||||
}
|
||||
tok->st_pos++;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_number:
|
||||
{
|
||||
/* Advance until we change state */
|
||||
const char *case_start = str;
|
||||
int case_len=0;
|
||||
while(c && strchr(json_number_chars, c)) {
|
||||
++case_len;
|
||||
if(c == '.' || c == 'e' || c == 'E')
|
||||
tok->is_double = 1;
|
||||
if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
|
||||
printbuf_memappend_fast(tok->pb, case_start, case_len);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
if (case_len>0)
|
||||
printbuf_memappend_fast(tok->pb, case_start, case_len);
|
||||
|
||||
// Check for -Infinity
|
||||
if (tok->pb->buf[0] == '-' && case_len == 1 &&
|
||||
(c == 'i' || c == 'I'))
|
||||
{
|
||||
state = json_tokener_state_inf;
|
||||
goto redo_char;
|
||||
}
|
||||
}
|
||||
{
|
||||
int64_t num64;
|
||||
double numd;
|
||||
if (!tok->is_double && json_parse_int64(tok->pb->buf, &num64) == 0) {
|
||||
if (num64 && tok->pb->buf[0]=='0' && (tok->flags & JSON_TOKENER_STRICT)) {
|
||||
/* in strict mode, number must not start with 0 */
|
||||
tok->err = json_tokener_error_parse_number;
|
||||
goto out;
|
||||
}
|
||||
current = json_object_new_int64(num64);
|
||||
}
|
||||
else if(tok->is_double && json_parse_double(tok->pb->buf, &numd) == 0)
|
||||
{
|
||||
current = json_object_new_double_s(numd, tok->pb->buf);
|
||||
} else {
|
||||
tok->err = json_tokener_error_parse_number;
|
||||
goto out;
|
||||
}
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
goto redo_char;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_array_after_sep:
|
||||
case json_tokener_state_array:
|
||||
if(c == ']') {
|
||||
if (state == json_tokener_state_array_after_sep &&
|
||||
(tok->flags & JSON_TOKENER_STRICT))
|
||||
{
|
||||
tok->err = json_tokener_error_parse_unexpected;
|
||||
goto out;
|
||||
}
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
} else {
|
||||
if(tok->depth >= tok->max_depth-1) {
|
||||
tok->err = json_tokener_error_depth;
|
||||
goto out;
|
||||
}
|
||||
state = json_tokener_state_array_add;
|
||||
tok->depth++;
|
||||
json_tokener_reset_level(tok, tok->depth);
|
||||
goto redo_char;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_array_add:
|
||||
json_object_array_add(current, obj);
|
||||
saved_state = json_tokener_state_array_sep;
|
||||
state = json_tokener_state_eatws;
|
||||
goto redo_char;
|
||||
|
||||
case json_tokener_state_array_sep:
|
||||
if(c == ']') {
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
} else if(c == ',') {
|
||||
saved_state = json_tokener_state_array_after_sep;
|
||||
state = json_tokener_state_eatws;
|
||||
} else {
|
||||
tok->err = json_tokener_error_parse_array;
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_object_field_start:
|
||||
case json_tokener_state_object_field_start_after_sep:
|
||||
if(c == '}') {
|
||||
if (state == json_tokener_state_object_field_start_after_sep &&
|
||||
(tok->flags & JSON_TOKENER_STRICT))
|
||||
{
|
||||
tok->err = json_tokener_error_parse_unexpected;
|
||||
goto out;
|
||||
}
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
} else if (c == '"' || c == '\'') {
|
||||
tok->quote_char = c;
|
||||
printbuf_reset(tok->pb);
|
||||
state = json_tokener_state_object_field;
|
||||
} else {
|
||||
tok->err = json_tokener_error_parse_object_key_name;
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_object_field:
|
||||
{
|
||||
/* Advance until we change state */
|
||||
const char *case_start = str;
|
||||
while(1) {
|
||||
if(c == tok->quote_char) {
|
||||
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
||||
obj_field_name = strdup(tok->pb->buf);
|
||||
saved_state = json_tokener_state_object_field_end;
|
||||
state = json_tokener_state_eatws;
|
||||
break;
|
||||
} else if(c == '\\') {
|
||||
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
||||
saved_state = json_tokener_state_object_field;
|
||||
state = json_tokener_state_string_escape;
|
||||
break;
|
||||
}
|
||||
if (!ADVANCE_CHAR(str, tok) || !PEEK_CHAR(c, tok)) {
|
||||
printbuf_memappend_fast(tok->pb, case_start, str-case_start);
|
||||
goto out;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_object_field_end:
|
||||
if(c == ':') {
|
||||
saved_state = json_tokener_state_object_value;
|
||||
state = json_tokener_state_eatws;
|
||||
} else {
|
||||
tok->err = json_tokener_error_parse_object_key_sep;
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
|
||||
case json_tokener_state_object_value:
|
||||
if(tok->depth >= tok->max_depth-1) {
|
||||
tok->err = json_tokener_error_depth;
|
||||
goto out;
|
||||
}
|
||||
state = json_tokener_state_object_value_add;
|
||||
tok->depth++;
|
||||
json_tokener_reset_level(tok, tok->depth);
|
||||
goto redo_char;
|
||||
|
||||
case json_tokener_state_object_value_add:
|
||||
json_object_object_add(current, obj_field_name, obj);
|
||||
free(obj_field_name);
|
||||
obj_field_name = NULL;
|
||||
saved_state = json_tokener_state_object_sep;
|
||||
state = json_tokener_state_eatws;
|
||||
goto redo_char;
|
||||
|
||||
case json_tokener_state_object_sep:
|
||||
if(c == '}') {
|
||||
saved_state = json_tokener_state_finish;
|
||||
state = json_tokener_state_eatws;
|
||||
} else if(c == ',') {
|
||||
saved_state = json_tokener_state_object_field_start_after_sep;
|
||||
state = json_tokener_state_eatws;
|
||||
} else {
|
||||
tok->err = json_tokener_error_parse_object_value_sep;
|
||||
goto out;
|
||||
}
|
||||
break;
|
||||
|
||||
}
|
||||
if (!ADVANCE_CHAR(str, tok))
|
||||
goto out;
|
||||
} /* while(POP_CHAR) */
|
||||
|
||||
out:
|
||||
if (c &&
|
||||
(state == json_tokener_state_finish) &&
|
||||
(tok->depth == 0) &&
|
||||
(tok->flags & JSON_TOKENER_STRICT)) {
|
||||
/* unexpected char after JSON data */
|
||||
tok->err = json_tokener_error_parse_unexpected;
|
||||
}
|
||||
if (!c) { /* We hit an eof char (0) */
|
||||
if(state != json_tokener_state_finish &&
|
||||
saved_state != json_tokener_state_finish)
|
||||
tok->err = json_tokener_error_parse_eof;
|
||||
}
|
||||
|
||||
#ifdef HAVE_SETLOCALE
|
||||
setlocale(LC_NUMERIC, oldlocale);
|
||||
if (oldlocale) free(oldlocale);
|
||||
#endif
|
||||
|
||||
if (tok->err == json_tokener_success)
|
||||
{
|
||||
json_object *ret = json_object_get(current);
|
||||
int ii;
|
||||
|
||||
/* Partially reset, so we parse additional objects on subsequent calls. */
|
||||
for(ii = tok->depth; ii >= 0; ii--)
|
||||
json_tokener_reset_level(tok, ii);
|
||||
return ret;
|
||||
}
|
||||
|
||||
MC_DEBUG("json_tokener_parse_ex: error %s at offset %d\n",
|
||||
json_tokener_errors[tok->err], tok->char_offset);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
void json_tokener_set_flags(struct json_tokener *tok, int flags)
|
||||
{
|
||||
tok->flags = flags;
|
||||
}
|
||||
208
json-c/json_tokener.h
Normal file
208
json-c/json_tokener.h
Normal file
@@ -0,0 +1,208 @@
|
||||
/*
|
||||
* $Id: json_tokener.h,v 1.10 2006/07/25 03:24:50 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _json_tokener_h_
|
||||
#define _json_tokener_h_
|
||||
|
||||
#include <stddef.h>
|
||||
#include "json_object.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
enum json_tokener_error {
|
||||
json_tokener_success,
|
||||
json_tokener_continue,
|
||||
json_tokener_error_depth,
|
||||
json_tokener_error_parse_eof,
|
||||
json_tokener_error_parse_unexpected,
|
||||
json_tokener_error_parse_null,
|
||||
json_tokener_error_parse_boolean,
|
||||
json_tokener_error_parse_number,
|
||||
json_tokener_error_parse_array,
|
||||
json_tokener_error_parse_object_key_name,
|
||||
json_tokener_error_parse_object_key_sep,
|
||||
json_tokener_error_parse_object_value_sep,
|
||||
json_tokener_error_parse_string,
|
||||
json_tokener_error_parse_comment,
|
||||
json_tokener_error_size
|
||||
};
|
||||
|
||||
enum json_tokener_state {
|
||||
json_tokener_state_eatws,
|
||||
json_tokener_state_start,
|
||||
json_tokener_state_finish,
|
||||
json_tokener_state_null,
|
||||
json_tokener_state_comment_start,
|
||||
json_tokener_state_comment,
|
||||
json_tokener_state_comment_eol,
|
||||
json_tokener_state_comment_end,
|
||||
json_tokener_state_string,
|
||||
json_tokener_state_string_escape,
|
||||
json_tokener_state_escape_unicode,
|
||||
json_tokener_state_boolean,
|
||||
json_tokener_state_number,
|
||||
json_tokener_state_array,
|
||||
json_tokener_state_array_add,
|
||||
json_tokener_state_array_sep,
|
||||
json_tokener_state_object_field_start,
|
||||
json_tokener_state_object_field,
|
||||
json_tokener_state_object_field_end,
|
||||
json_tokener_state_object_value,
|
||||
json_tokener_state_object_value_add,
|
||||
json_tokener_state_object_sep,
|
||||
json_tokener_state_array_after_sep,
|
||||
json_tokener_state_object_field_start_after_sep,
|
||||
json_tokener_state_inf
|
||||
};
|
||||
|
||||
struct json_tokener_srec
|
||||
{
|
||||
enum json_tokener_state state, saved_state;
|
||||
struct json_object *obj;
|
||||
struct json_object *current;
|
||||
char *obj_field_name;
|
||||
};
|
||||
|
||||
#define JSON_TOKENER_DEFAULT_DEPTH 32
|
||||
|
||||
struct json_tokener
|
||||
{
|
||||
char *str;
|
||||
struct printbuf *pb;
|
||||
int max_depth, depth, is_double, st_pos, char_offset;
|
||||
enum json_tokener_error err;
|
||||
unsigned int ucs_char;
|
||||
char quote_char;
|
||||
struct json_tokener_srec *stack;
|
||||
int flags;
|
||||
};
|
||||
|
||||
/**
|
||||
* Be strict when parsing JSON input. Use caution with
|
||||
* this flag as what is considered valid may become more
|
||||
* restrictive from one release to the next, causing your
|
||||
* code to fail on previously working input.
|
||||
*
|
||||
* This flag is not set by default.
|
||||
*
|
||||
* @see json_tokener_set_flags()
|
||||
*/
|
||||
#define JSON_TOKENER_STRICT 0x01
|
||||
|
||||
/**
|
||||
* Given an error previously returned by json_tokener_get_error(),
|
||||
* return a human readable description of the error.
|
||||
*
|
||||
* @return a generic error message is returned if an invalid error value is provided.
|
||||
*/
|
||||
const char *json_tokener_error_desc(enum json_tokener_error jerr);
|
||||
|
||||
/**
|
||||
* Retrieve the error caused by the last call to json_tokener_parse_ex(),
|
||||
* or json_tokener_success if there is no error.
|
||||
*
|
||||
* When parsing a JSON string in pieces, if the tokener is in the middle
|
||||
* of parsing this will return json_tokener_continue.
|
||||
*
|
||||
* See also json_tokener_error_desc().
|
||||
*/
|
||||
enum json_tokener_error json_tokener_get_error(struct json_tokener *tok);
|
||||
|
||||
extern struct json_tokener* json_tokener_new(void);
|
||||
extern struct json_tokener* json_tokener_new_ex(int depth);
|
||||
extern void json_tokener_free(struct json_tokener *tok);
|
||||
extern void json_tokener_reset(struct json_tokener *tok);
|
||||
extern struct json_object* json_tokener_parse(const char *str);
|
||||
extern struct json_object* json_tokener_parse_verbose(const char *str, enum json_tokener_error *error);
|
||||
|
||||
/**
|
||||
* Set flags that control how parsing will be done.
|
||||
*/
|
||||
extern void json_tokener_set_flags(struct json_tokener *tok, int flags);
|
||||
|
||||
/**
|
||||
* Parse a string and return a non-NULL json_object if a valid JSON value
|
||||
* is found. The string does not need to be a JSON object or array;
|
||||
* it can also be a string, number or boolean value.
|
||||
*
|
||||
* A partial JSON string can be parsed. If the parsing is incomplete,
|
||||
* NULL will be returned and json_tokener_get_error() will be return
|
||||
* json_tokener_continue.
|
||||
* json_tokener_parse_ex() can then be called with additional bytes in str
|
||||
* to continue the parsing.
|
||||
*
|
||||
* If json_tokener_parse_ex() returns NULL and the error anything other than
|
||||
* json_tokener_continue, a fatal error has occurred and parsing must be
|
||||
* halted. Then tok object must not be re-used until json_tokener_reset() is
|
||||
* called.
|
||||
*
|
||||
* When a valid JSON value is parsed, a non-NULL json_object will be
|
||||
* returned. Also, json_tokener_get_error() will return json_tokener_success.
|
||||
* Be sure to check the type with json_object_is_type() or
|
||||
* json_object_get_type() before using the object.
|
||||
*
|
||||
* @b XXX this shouldn't use internal fields:
|
||||
* Trailing characters after the parsed value do not automatically cause an
|
||||
* error. It is up to the caller to decide whether to treat this as an
|
||||
* error or to handle the additional characters, perhaps by parsing another
|
||||
* json value starting from that point.
|
||||
*
|
||||
* Extra characters can be detected by comparing the tok->char_offset against
|
||||
* the length of the last len parameter passed in.
|
||||
*
|
||||
* The tokener does \b not maintain an internal buffer so the caller is
|
||||
* responsible for calling json_tokener_parse_ex with an appropriate str
|
||||
* parameter starting with the extra characters.
|
||||
*
|
||||
* This interface is presently not 64-bit clean due to the int len argument
|
||||
* so the function limits the maximum string size to INT32_MAX (2GB).
|
||||
* If the function is called with len == -1 then strlen is called to check
|
||||
* the string length is less than INT32_MAX (2GB)
|
||||
*
|
||||
* Example:
|
||||
* @code
|
||||
json_object *jobj = NULL;
|
||||
const char *mystring = NULL;
|
||||
int stringlen = 0;
|
||||
enum json_tokener_error jerr;
|
||||
do {
|
||||
mystring = ... // get JSON string, e.g. read from file, etc...
|
||||
stringlen = strlen(mystring);
|
||||
jobj = json_tokener_parse_ex(tok, mystring, stringlen);
|
||||
} while ((jerr = json_tokener_get_error(tok)) == json_tokener_continue);
|
||||
if (jerr != json_tokener_success)
|
||||
{
|
||||
fprintf(stderr, "Error: %s\n", json_tokener_error_desc(jerr));
|
||||
// Handle errors, as appropriate for your application.
|
||||
}
|
||||
if (tok->char_offset < stringlen) // XXX shouldn't access internal fields
|
||||
{
|
||||
// Handle extra characters after parsed object as desired.
|
||||
// e.g. issue an error, parse another object from that point, etc...
|
||||
}
|
||||
// Success, use jobj here.
|
||||
|
||||
@endcode
|
||||
*
|
||||
* @param tok a json_tokener previously allocated with json_tokener_new()
|
||||
* @param str an string with any valid JSON expression, or portion of. This does not need to be null terminated.
|
||||
* @param len the length of str
|
||||
*/
|
||||
extern struct json_object* json_tokener_parse_ex(struct json_tokener *tok,
|
||||
const char *str, int len);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
299
json-c/json_util.c
Normal file
299
json-c/json_util.c
Normal file
@@ -0,0 +1,299 @@
|
||||
/*
|
||||
* $Id: json_util.c,v 1.4 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include "config.h"
|
||||
#undef realloc
|
||||
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <stddef.h>
|
||||
#include <limits.h>
|
||||
#include <string.h>
|
||||
#include <errno.h>
|
||||
#include <ctype.h>
|
||||
|
||||
#ifdef HAVE_SYS_TYPES_H
|
||||
#include <sys/types.h>
|
||||
#endif /* HAVE_SYS_TYPES_H */
|
||||
|
||||
#ifdef HAVE_SYS_STAT_H
|
||||
#include <sys/stat.h>
|
||||
#endif /* HAVE_SYS_STAT_H */
|
||||
|
||||
#ifdef HAVE_FCNTL_H
|
||||
#include <fcntl.h>
|
||||
#endif /* HAVE_FCNTL_H */
|
||||
|
||||
#ifdef HAVE_UNISTD_H
|
||||
# include <unistd.h>
|
||||
#endif /* HAVE_UNISTD_H */
|
||||
|
||||
#ifdef WIN32
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# include <windows.h>
|
||||
# include <io.h>
|
||||
#endif /* defined(WIN32) */
|
||||
|
||||
#if !defined(HAVE_OPEN) && defined(WIN32)
|
||||
# define open _open
|
||||
#endif
|
||||
|
||||
#if !defined(HAVE_SNPRINTF) && defined(_MSC_VER)
|
||||
/* MSC has the version as _snprintf */
|
||||
# define snprintf _snprintf
|
||||
#elif !defined(HAVE_SNPRINTF)
|
||||
# error You do not have snprintf on your system.
|
||||
#endif /* HAVE_SNPRINTF */
|
||||
|
||||
#include "debug.h"
|
||||
#include "printbuf.h"
|
||||
#include "json_inttypes.h"
|
||||
#include "json_object.h"
|
||||
#include "json_tokener.h"
|
||||
#include "json_util.h"
|
||||
|
||||
static int sscanf_is_broken = 0;
|
||||
static int sscanf_is_broken_testdone = 0;
|
||||
static void sscanf_is_broken_test(void);
|
||||
|
||||
struct json_object* json_object_from_file(const char *filename)
|
||||
{
|
||||
struct printbuf *pb;
|
||||
struct json_object *obj;
|
||||
char buf[JSON_FILE_BUF_SIZE];
|
||||
int fd, ret;
|
||||
|
||||
if((fd = open(filename, O_RDONLY)) < 0) {
|
||||
MC_ERROR("json_object_from_file: error opening file %s: %s\n",
|
||||
filename, strerror(errno));
|
||||
return NULL;
|
||||
}
|
||||
if(!(pb = printbuf_new())) {
|
||||
close(fd);
|
||||
MC_ERROR("json_object_from_file: printbuf_new failed\n");
|
||||
return NULL;
|
||||
}
|
||||
while((ret = read(fd, buf, JSON_FILE_BUF_SIZE)) > 0) {
|
||||
printbuf_memappend(pb, buf, ret);
|
||||
}
|
||||
close(fd);
|
||||
if(ret < 0) {
|
||||
MC_ERROR("json_object_from_file: error reading file %s: %s\n",
|
||||
filename, strerror(errno));
|
||||
printbuf_free(pb);
|
||||
return NULL;
|
||||
}
|
||||
obj = json_tokener_parse(pb->buf);
|
||||
printbuf_free(pb);
|
||||
return obj;
|
||||
}
|
||||
|
||||
/* extended "format and write to file" function */
|
||||
|
||||
int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags)
|
||||
{
|
||||
const char *json_str;
|
||||
int fd, ret;
|
||||
unsigned int wpos, wsize;
|
||||
|
||||
if(!obj) {
|
||||
MC_ERROR("json_object_to_file: object is null\n");
|
||||
return -1;
|
||||
}
|
||||
|
||||
if((fd = open(filename, O_WRONLY | O_TRUNC | O_CREAT, 0644)) < 0) {
|
||||
MC_ERROR("json_object_to_file: error opening file %s: %s\n",
|
||||
filename, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
if(!(json_str = json_object_to_json_string_ext(obj,flags))) {
|
||||
close(fd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
wsize = (unsigned int)(strlen(json_str) & UINT_MAX); /* CAW: probably unnecessary, but the most 64bit safe */
|
||||
wpos = 0;
|
||||
while(wpos < wsize) {
|
||||
if((ret = write(fd, json_str + wpos, wsize-wpos)) < 0) {
|
||||
close(fd);
|
||||
MC_ERROR("json_object_to_file: error writing file %s: %s\n",
|
||||
filename, strerror(errno));
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* because of the above check for ret < 0, we can safely cast and add */
|
||||
wpos += (unsigned int)ret;
|
||||
}
|
||||
|
||||
close(fd);
|
||||
return 0;
|
||||
}
|
||||
|
||||
// backwards compatible "format and write to file" function
|
||||
|
||||
int json_object_to_file(const char *filename, struct json_object *obj)
|
||||
{
|
||||
return json_object_to_file_ext(filename, obj, JSON_C_TO_STRING_PLAIN);
|
||||
}
|
||||
|
||||
int json_parse_double(const char *buf, double *retval)
|
||||
{
|
||||
return (sscanf(buf, "%lf", retval)==1 ? 0 : 1);
|
||||
}
|
||||
|
||||
/*
|
||||
* Not all implementations of sscanf actually work properly.
|
||||
* Check whether the one we're currently using does, and if
|
||||
* it's broken, enable the workaround code.
|
||||
*/
|
||||
static void sscanf_is_broken_test()
|
||||
{
|
||||
int64_t num64;
|
||||
int ret_errno, is_int64_min, ret_errno2, is_int64_max;
|
||||
|
||||
(void)sscanf(" -01234567890123456789012345", "%" SCNd64, &num64);
|
||||
ret_errno = errno;
|
||||
is_int64_min = (num64 == INT64_MIN);
|
||||
|
||||
(void)sscanf(" 01234567890123456789012345", "%" SCNd64, &num64);
|
||||
ret_errno2 = errno;
|
||||
is_int64_max = (num64 == INT64_MAX);
|
||||
|
||||
if (ret_errno != ERANGE || !is_int64_min ||
|
||||
ret_errno2 != ERANGE || !is_int64_max)
|
||||
{
|
||||
MC_DEBUG("sscanf_is_broken_test failed, enabling workaround code\n");
|
||||
sscanf_is_broken = 1;
|
||||
}
|
||||
}
|
||||
|
||||
int json_parse_int64(const char *buf, int64_t *retval)
|
||||
{
|
||||
int64_t num64;
|
||||
const char *buf_sig_digits;
|
||||
int orig_has_neg;
|
||||
int saved_errno;
|
||||
|
||||
if (!sscanf_is_broken_testdone)
|
||||
{
|
||||
sscanf_is_broken_test();
|
||||
sscanf_is_broken_testdone = 1;
|
||||
}
|
||||
|
||||
// Skip leading spaces
|
||||
while (isspace((int)*buf) && *buf)
|
||||
buf++;
|
||||
|
||||
errno = 0; // sscanf won't always set errno, so initialize
|
||||
if (sscanf(buf, "%" SCNd64, &num64) != 1)
|
||||
{
|
||||
MC_DEBUG("Failed to parse, sscanf != 1\n");
|
||||
return 1;
|
||||
}
|
||||
|
||||
saved_errno = errno;
|
||||
buf_sig_digits = buf;
|
||||
orig_has_neg = 0;
|
||||
if (*buf_sig_digits == '-')
|
||||
{
|
||||
buf_sig_digits++;
|
||||
orig_has_neg = 1;
|
||||
}
|
||||
|
||||
// Not all sscanf implementations actually work
|
||||
if (sscanf_is_broken && saved_errno != ERANGE)
|
||||
{
|
||||
char buf_cmp[100];
|
||||
char *buf_cmp_start = buf_cmp;
|
||||
int recheck_has_neg = 0;
|
||||
int buf_cmp_len;
|
||||
|
||||
// Skip leading zeros, but keep at least one digit
|
||||
while (buf_sig_digits[0] == '0' && buf_sig_digits[1] != '\0')
|
||||
buf_sig_digits++;
|
||||
if (num64 == 0) // assume all sscanf impl's will parse -0 to 0
|
||||
orig_has_neg = 0; // "-0" is the same as just plain "0"
|
||||
|
||||
snprintf(buf_cmp_start, sizeof(buf_cmp), "%" PRId64, num64);
|
||||
if (*buf_cmp_start == '-')
|
||||
{
|
||||
recheck_has_neg = 1;
|
||||
buf_cmp_start++;
|
||||
}
|
||||
// No need to skip leading spaces or zeros here.
|
||||
|
||||
buf_cmp_len = strlen(buf_cmp_start);
|
||||
/**
|
||||
* If the sign is different, or
|
||||
* some of the digits are different, or
|
||||
* there is another digit present in the original string
|
||||
* then we have NOT successfully parsed the value.
|
||||
*/
|
||||
if (orig_has_neg != recheck_has_neg ||
|
||||
strncmp(buf_sig_digits, buf_cmp_start, strlen(buf_cmp_start)) != 0 ||
|
||||
((int)strlen(buf_sig_digits) != buf_cmp_len &&
|
||||
isdigit((int)buf_sig_digits[buf_cmp_len])
|
||||
)
|
||||
)
|
||||
{
|
||||
saved_errno = ERANGE;
|
||||
}
|
||||
}
|
||||
|
||||
// Not all sscanf impl's set the value properly when out of range.
|
||||
// Always do this, even for properly functioning implementations,
|
||||
// since it shouldn't slow things down much.
|
||||
if (saved_errno == ERANGE)
|
||||
{
|
||||
if (orig_has_neg)
|
||||
num64 = INT64_MIN;
|
||||
else
|
||||
num64 = INT64_MAX;
|
||||
}
|
||||
*retval = num64;
|
||||
return 0;
|
||||
}
|
||||
|
||||
#ifndef HAVE_REALLOC
|
||||
void* rpl_realloc(void* p, size_t n)
|
||||
{
|
||||
if (n == 0)
|
||||
n = 1;
|
||||
if (p == 0)
|
||||
return malloc(n);
|
||||
return realloc(p, n);
|
||||
}
|
||||
#endif
|
||||
|
||||
#define NELEM(a) (sizeof(a) / sizeof(a[0]))
|
||||
static const char* json_type_name[] = {
|
||||
/* If you change this, be sure to update the enum json_type definition too */
|
||||
"null",
|
||||
"boolean",
|
||||
"double",
|
||||
"int",
|
||||
"object",
|
||||
"array",
|
||||
"string",
|
||||
};
|
||||
|
||||
const char *json_type_to_name(enum json_type o_type)
|
||||
{
|
||||
int o_type_int = (int)o_type;
|
||||
if (o_type_int < 0 || o_type_int >= (int)NELEM(json_type_name))
|
||||
{
|
||||
MC_ERROR("json_type_to_name: type %d is out of range [0,%d]\n", o_type, NELEM(json_type_name));
|
||||
return NULL;
|
||||
}
|
||||
return json_type_name[o_type];
|
||||
}
|
||||
|
||||
50
json-c/json_util.h
Normal file
50
json-c/json_util.h
Normal file
@@ -0,0 +1,50 @@
|
||||
/*
|
||||
* $Id: json_util.h,v 1.4 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _json_util_h_
|
||||
#define _json_util_h_
|
||||
|
||||
#include "json_object.h"
|
||||
|
||||
#ifndef json_min
|
||||
#define json_min(a,b) ((a) < (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
#ifndef json_max
|
||||
#define json_max(a,b) ((a) > (b) ? (a) : (b))
|
||||
#endif
|
||||
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
#define JSON_FILE_BUF_SIZE 4096
|
||||
|
||||
/* utility functions */
|
||||
extern struct json_object* json_object_from_file(const char *filename);
|
||||
extern int json_object_to_file(const char *filename, struct json_object *obj);
|
||||
extern int json_object_to_file_ext(const char *filename, struct json_object *obj, int flags);
|
||||
extern int json_parse_int64(const char *buf, int64_t *retval);
|
||||
extern int json_parse_double(const char *buf, double *retval);
|
||||
|
||||
|
||||
/**
|
||||
* Return a string describing the type of the object.
|
||||
* e.g. "int", or "object", etc...
|
||||
*/
|
||||
extern const char *json_type_to_name(enum json_type o_type);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
26
json-c/libjson.c
Normal file
26
json-c/libjson.c
Normal file
@@ -0,0 +1,26 @@
|
||||
|
||||
/* dummy source file for compatibility purposes */
|
||||
|
||||
#if defined(HAVE_CDEFS_H)
|
||||
#include <sys/cdefs.h>
|
||||
#endif
|
||||
|
||||
#ifndef __warn_references
|
||||
|
||||
#if defined(__GNUC__) && defined (HAS_GNU_WARNING_LONG)
|
||||
|
||||
#define __warn_references(sym,msg) \
|
||||
__asm__(".section .gnu" #sym ",\n\t.ascii \"" msg "\"\n\t.text");
|
||||
|
||||
#else
|
||||
#define __warn_references(sym,msg) /* nothing */
|
||||
#endif
|
||||
|
||||
#endif
|
||||
|
||||
#include "json_object.h"
|
||||
|
||||
__warn_references(json_object_get, "Warning: please link against libjson-c instead of libjson");
|
||||
|
||||
/* __asm__(".section .gnu.warning." __STRING(sym) \
|
||||
" ; .ascii \"" msg "\" ; .text") */
|
||||
602
json-c/linkhash.c
Normal file
602
json-c/linkhash.c
Normal file
@@ -0,0 +1,602 @@
|
||||
/*
|
||||
* $Id: linkhash.c,v 1.4 2006/01/26 02:16:28 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
* Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef HAVE_ENDIAN_H
|
||||
# include <endian.h> /* attempt to define endianness */
|
||||
#endif
|
||||
|
||||
#include "random_seed.h"
|
||||
#include "linkhash.h"
|
||||
|
||||
void lh_abort(const char *msg, ...)
|
||||
{
|
||||
va_list ap;
|
||||
va_start(ap, msg);
|
||||
vprintf(msg, ap);
|
||||
va_end(ap);
|
||||
exit(1);
|
||||
}
|
||||
|
||||
unsigned long lh_ptr_hash(const void *k)
|
||||
{
|
||||
/* CAW: refactored to be 64bit nice */
|
||||
return (unsigned long)((((ptrdiff_t)k * LH_PRIME) >> 4) & ULONG_MAX);
|
||||
}
|
||||
|
||||
int lh_ptr_equal(const void *k1, const void *k2)
|
||||
{
|
||||
return (k1 == k2);
|
||||
}
|
||||
|
||||
/*
|
||||
* hashlittle from lookup3.c, by Bob Jenkins, May 2006, Public Domain.
|
||||
* http://burtleburtle.net/bob/c/lookup3.c
|
||||
* minor modifications to make functions static so no symbols are exported
|
||||
* minor mofifications to compile with -Werror
|
||||
*/
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
lookup3.c, by Bob Jenkins, May 2006, Public Domain.
|
||||
|
||||
These are functions for producing 32-bit hashes for hash table lookup.
|
||||
hashword(), hashlittle(), hashlittle2(), hashbig(), mix(), and final()
|
||||
are externally useful functions. Routines to test the hash are included
|
||||
if SELF_TEST is defined. You can use this free for any purpose. It's in
|
||||
the public domain. It has no warranty.
|
||||
|
||||
You probably want to use hashlittle(). hashlittle() and hashbig()
|
||||
hash byte arrays. hashlittle() is is faster than hashbig() on
|
||||
little-endian machines. Intel and AMD are little-endian machines.
|
||||
On second thought, you probably want hashlittle2(), which is identical to
|
||||
hashlittle() except it returns two 32-bit hashes for the price of one.
|
||||
You could implement hashbig2() if you wanted but I haven't bothered here.
|
||||
|
||||
If you want to find a hash of, say, exactly 7 integers, do
|
||||
a = i1; b = i2; c = i3;
|
||||
mix(a,b,c);
|
||||
a += i4; b += i5; c += i6;
|
||||
mix(a,b,c);
|
||||
a += i7;
|
||||
final(a,b,c);
|
||||
then use c as the hash value. If you have a variable length array of
|
||||
4-byte integers to hash, use hashword(). If you have a byte array (like
|
||||
a character string), use hashlittle(). If you have several byte arrays, or
|
||||
a mix of things, see the comments above hashlittle().
|
||||
|
||||
Why is this so big? I read 12 bytes at a time into 3 4-byte integers,
|
||||
then mix those integers. This is fast (you can do a lot more thorough
|
||||
mixing with 12*3 instructions on 3 integers than you can with 3 instructions
|
||||
on 1 byte), but shoehorning those bytes into integers efficiently is messy.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
/*
|
||||
* My best guess at if you are big-endian or little-endian. This may
|
||||
* need adjustment.
|
||||
*/
|
||||
#if (defined(__BYTE_ORDER) && defined(__LITTLE_ENDIAN) && \
|
||||
__BYTE_ORDER == __LITTLE_ENDIAN) || \
|
||||
(defined(i386) || defined(__i386__) || defined(__i486__) || \
|
||||
defined(__i586__) || defined(__i686__) || defined(vax) || defined(MIPSEL))
|
||||
# define HASH_LITTLE_ENDIAN 1
|
||||
# define HASH_BIG_ENDIAN 0
|
||||
#elif (defined(__BYTE_ORDER) && defined(__BIG_ENDIAN) && \
|
||||
__BYTE_ORDER == __BIG_ENDIAN) || \
|
||||
(defined(sparc) || defined(POWERPC) || defined(mc68000) || defined(sel))
|
||||
# define HASH_LITTLE_ENDIAN 0
|
||||
# define HASH_BIG_ENDIAN 1
|
||||
#else
|
||||
# define HASH_LITTLE_ENDIAN 0
|
||||
# define HASH_BIG_ENDIAN 0
|
||||
#endif
|
||||
|
||||
#define hashsize(n) ((uint32_t)1<<(n))
|
||||
#define hashmask(n) (hashsize(n)-1)
|
||||
#define rot(x,k) (((x)<<(k)) | ((x)>>(32-(k))))
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
mix -- mix 3 32-bit values reversibly.
|
||||
|
||||
This is reversible, so any information in (a,b,c) before mix() is
|
||||
still in (a,b,c) after mix().
|
||||
|
||||
If four pairs of (a,b,c) inputs are run through mix(), or through
|
||||
mix() in reverse, there are at least 32 bits of the output that
|
||||
are sometimes the same for one pair and different for another pair.
|
||||
This was tested for:
|
||||
* pairs that differed by one bit, by two bits, in any combination
|
||||
of top bits of (a,b,c), or in any combination of bottom bits of
|
||||
(a,b,c).
|
||||
* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed
|
||||
the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
|
||||
is commonly produced by subtraction) look like a single 1-bit
|
||||
difference.
|
||||
* the base values were pseudorandom, all zero but one bit set, or
|
||||
all zero plus a counter that starts at zero.
|
||||
|
||||
Some k values for my "a-=c; a^=rot(c,k); c+=b;" arrangement that
|
||||
satisfy this are
|
||||
4 6 8 16 19 4
|
||||
9 15 3 18 27 15
|
||||
14 9 3 7 17 3
|
||||
Well, "9 15 3 18 27 15" didn't quite get 32 bits diffing
|
||||
for "differ" defined as + with a one-bit base and a two-bit delta. I
|
||||
used http://burtleburtle.net/bob/hash/avalanche.html to choose
|
||||
the operations, constants, and arrangements of the variables.
|
||||
|
||||
This does not achieve avalanche. There are input bits of (a,b,c)
|
||||
that fail to affect some output bits of (a,b,c), especially of a. The
|
||||
most thoroughly mixed value is c, but it doesn't really even achieve
|
||||
avalanche in c.
|
||||
|
||||
This allows some parallelism. Read-after-writes are good at doubling
|
||||
the number of bits affected, so the goal of mixing pulls in the opposite
|
||||
direction as the goal of parallelism. I did what I could. Rotates
|
||||
seem to cost as much as shifts on every machine I could lay my hands
|
||||
on, and rotates are much kinder to the top and bottom bits, so I used
|
||||
rotates.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
#define mix(a,b,c) \
|
||||
{ \
|
||||
a -= c; a ^= rot(c, 4); c += b; \
|
||||
b -= a; b ^= rot(a, 6); a += c; \
|
||||
c -= b; c ^= rot(b, 8); b += a; \
|
||||
a -= c; a ^= rot(c,16); c += b; \
|
||||
b -= a; b ^= rot(a,19); a += c; \
|
||||
c -= b; c ^= rot(b, 4); b += a; \
|
||||
}
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
final -- final mixing of 3 32-bit values (a,b,c) into c
|
||||
|
||||
Pairs of (a,b,c) values differing in only a few bits will usually
|
||||
produce values of c that look totally different. This was tested for
|
||||
* pairs that differed by one bit, by two bits, in any combination
|
||||
of top bits of (a,b,c), or in any combination of bottom bits of
|
||||
(a,b,c).
|
||||
* "differ" is defined as +, -, ^, or ~^. For + and -, I transformed
|
||||
the output delta to a Gray code (a^(a>>1)) so a string of 1's (as
|
||||
is commonly produced by subtraction) look like a single 1-bit
|
||||
difference.
|
||||
* the base values were pseudorandom, all zero but one bit set, or
|
||||
all zero plus a counter that starts at zero.
|
||||
|
||||
These constants passed:
|
||||
14 11 25 16 4 14 24
|
||||
12 14 25 16 4 14 24
|
||||
and these came close:
|
||||
4 8 15 26 3 22 24
|
||||
10 8 15 26 3 22 24
|
||||
11 8 15 26 3 22 24
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
#define final(a,b,c) \
|
||||
{ \
|
||||
c ^= b; c -= rot(b,14); \
|
||||
a ^= c; a -= rot(c,11); \
|
||||
b ^= a; b -= rot(a,25); \
|
||||
c ^= b; c -= rot(b,16); \
|
||||
a ^= c; a -= rot(c,4); \
|
||||
b ^= a; b -= rot(a,14); \
|
||||
c ^= b; c -= rot(b,24); \
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
-------------------------------------------------------------------------------
|
||||
hashlittle() -- hash a variable-length key into a 32-bit value
|
||||
k : the key (the unaligned variable-length array of bytes)
|
||||
length : the length of the key, counting by bytes
|
||||
initval : can be any 4-byte value
|
||||
Returns a 32-bit value. Every bit of the key affects every bit of
|
||||
the return value. Two keys differing by one or two bits will have
|
||||
totally different hash values.
|
||||
|
||||
The best hash table sizes are powers of 2. There is no need to do
|
||||
mod a prime (mod is sooo slow!). If you need less than 32 bits,
|
||||
use a bitmask. For example, if you need only 10 bits, do
|
||||
h = (h & hashmask(10));
|
||||
In which case, the hash table should have hashsize(10) elements.
|
||||
|
||||
If you are hashing n strings (uint8_t **)k, do it like this:
|
||||
for (i=0, h=0; i<n; ++i) h = hashlittle( k[i], len[i], h);
|
||||
|
||||
By Bob Jenkins, 2006. bob_jenkins@burtleburtle.net. You may use this
|
||||
code any way you wish, private, educational, or commercial. It's free.
|
||||
|
||||
Use for hash table lookup, or anything where one collision in 2^^32 is
|
||||
acceptable. Do NOT use for cryptographic purposes.
|
||||
-------------------------------------------------------------------------------
|
||||
*/
|
||||
|
||||
static uint32_t hashlittle( const void *key, size_t length, uint32_t initval)
|
||||
{
|
||||
uint32_t a,b,c; /* internal state */
|
||||
union { const void *ptr; size_t i; } u; /* needed for Mac Powerbook G4 */
|
||||
|
||||
/* Set up the internal state */
|
||||
a = b = c = 0xdeadbeef + ((uint32_t)length) + initval;
|
||||
|
||||
u.ptr = key;
|
||||
if (HASH_LITTLE_ENDIAN && ((u.i & 0x3) == 0)) {
|
||||
const uint32_t *k = (const uint32_t *)key; /* read 32-bit chunks */
|
||||
|
||||
/*------ all but last block: aligned reads and affect 32 bits of (a,b,c) */
|
||||
while (length > 12)
|
||||
{
|
||||
a += k[0];
|
||||
b += k[1];
|
||||
c += k[2];
|
||||
mix(a,b,c);
|
||||
length -= 12;
|
||||
k += 3;
|
||||
}
|
||||
|
||||
/*----------------------------- handle the last (probably partial) block */
|
||||
/*
|
||||
* "k[2]&0xffffff" actually reads beyond the end of the string, but
|
||||
* then masks off the part it's not allowed to read. Because the
|
||||
* string is aligned, the masked-off tail is in the same word as the
|
||||
* rest of the string. Every machine with memory protection I've seen
|
||||
* does it on word boundaries, so is OK with this. But VALGRIND will
|
||||
* still catch it and complain. The masking trick does make the hash
|
||||
* noticably faster for short strings (like English words).
|
||||
*/
|
||||
#ifndef VALGRIND
|
||||
|
||||
switch(length)
|
||||
{
|
||||
case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
|
||||
case 11: c+=k[2]&0xffffff; b+=k[1]; a+=k[0]; break;
|
||||
case 10: c+=k[2]&0xffff; b+=k[1]; a+=k[0]; break;
|
||||
case 9 : c+=k[2]&0xff; b+=k[1]; a+=k[0]; break;
|
||||
case 8 : b+=k[1]; a+=k[0]; break;
|
||||
case 7 : b+=k[1]&0xffffff; a+=k[0]; break;
|
||||
case 6 : b+=k[1]&0xffff; a+=k[0]; break;
|
||||
case 5 : b+=k[1]&0xff; a+=k[0]; break;
|
||||
case 4 : a+=k[0]; break;
|
||||
case 3 : a+=k[0]&0xffffff; break;
|
||||
case 2 : a+=k[0]&0xffff; break;
|
||||
case 1 : a+=k[0]&0xff; break;
|
||||
case 0 : return c; /* zero length strings require no mixing */
|
||||
}
|
||||
|
||||
#else /* make valgrind happy */
|
||||
|
||||
const uint8_t *k8 = (const uint8_t *)k;
|
||||
switch(length)
|
||||
{
|
||||
case 12: c+=k[2]; b+=k[1]; a+=k[0]; break;
|
||||
case 11: c+=((uint32_t)k8[10])<<16; /* fall through */
|
||||
case 10: c+=((uint32_t)k8[9])<<8; /* fall through */
|
||||
case 9 : c+=k8[8]; /* fall through */
|
||||
case 8 : b+=k[1]; a+=k[0]; break;
|
||||
case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */
|
||||
case 6 : b+=((uint32_t)k8[5])<<8; /* fall through */
|
||||
case 5 : b+=k8[4]; /* fall through */
|
||||
case 4 : a+=k[0]; break;
|
||||
case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */
|
||||
case 2 : a+=((uint32_t)k8[1])<<8; /* fall through */
|
||||
case 1 : a+=k8[0]; break;
|
||||
case 0 : return c;
|
||||
}
|
||||
|
||||
#endif /* !valgrind */
|
||||
|
||||
} else if (HASH_LITTLE_ENDIAN && ((u.i & 0x1) == 0)) {
|
||||
const uint16_t *k = (const uint16_t *)key; /* read 16-bit chunks */
|
||||
const uint8_t *k8;
|
||||
|
||||
/*--------------- all but last block: aligned reads and different mixing */
|
||||
while (length > 12)
|
||||
{
|
||||
a += k[0] + (((uint32_t)k[1])<<16);
|
||||
b += k[2] + (((uint32_t)k[3])<<16);
|
||||
c += k[4] + (((uint32_t)k[5])<<16);
|
||||
mix(a,b,c);
|
||||
length -= 12;
|
||||
k += 6;
|
||||
}
|
||||
|
||||
/*----------------------------- handle the last (probably partial) block */
|
||||
k8 = (const uint8_t *)k;
|
||||
switch(length)
|
||||
{
|
||||
case 12: c+=k[4]+(((uint32_t)k[5])<<16);
|
||||
b+=k[2]+(((uint32_t)k[3])<<16);
|
||||
a+=k[0]+(((uint32_t)k[1])<<16);
|
||||
break;
|
||||
case 11: c+=((uint32_t)k8[10])<<16; /* fall through */
|
||||
case 10: c+=k[4];
|
||||
b+=k[2]+(((uint32_t)k[3])<<16);
|
||||
a+=k[0]+(((uint32_t)k[1])<<16);
|
||||
break;
|
||||
case 9 : c+=k8[8]; /* fall through */
|
||||
case 8 : b+=k[2]+(((uint32_t)k[3])<<16);
|
||||
a+=k[0]+(((uint32_t)k[1])<<16);
|
||||
break;
|
||||
case 7 : b+=((uint32_t)k8[6])<<16; /* fall through */
|
||||
case 6 : b+=k[2];
|
||||
a+=k[0]+(((uint32_t)k[1])<<16);
|
||||
break;
|
||||
case 5 : b+=k8[4]; /* fall through */
|
||||
case 4 : a+=k[0]+(((uint32_t)k[1])<<16);
|
||||
break;
|
||||
case 3 : a+=((uint32_t)k8[2])<<16; /* fall through */
|
||||
case 2 : a+=k[0];
|
||||
break;
|
||||
case 1 : a+=k8[0];
|
||||
break;
|
||||
case 0 : return c; /* zero length requires no mixing */
|
||||
}
|
||||
|
||||
} else { /* need to read the key one byte at a time */
|
||||
const uint8_t *k = (const uint8_t *)key;
|
||||
|
||||
/*--------------- all but the last block: affect some 32 bits of (a,b,c) */
|
||||
while (length > 12)
|
||||
{
|
||||
a += k[0];
|
||||
a += ((uint32_t)k[1])<<8;
|
||||
a += ((uint32_t)k[2])<<16;
|
||||
a += ((uint32_t)k[3])<<24;
|
||||
b += k[4];
|
||||
b += ((uint32_t)k[5])<<8;
|
||||
b += ((uint32_t)k[6])<<16;
|
||||
b += ((uint32_t)k[7])<<24;
|
||||
c += k[8];
|
||||
c += ((uint32_t)k[9])<<8;
|
||||
c += ((uint32_t)k[10])<<16;
|
||||
c += ((uint32_t)k[11])<<24;
|
||||
mix(a,b,c);
|
||||
length -= 12;
|
||||
k += 12;
|
||||
}
|
||||
|
||||
/*-------------------------------- last block: affect all 32 bits of (c) */
|
||||
switch(length) /* all the case statements fall through */
|
||||
{
|
||||
case 12: c+=((uint32_t)k[11])<<24;
|
||||
case 11: c+=((uint32_t)k[10])<<16;
|
||||
case 10: c+=((uint32_t)k[9])<<8;
|
||||
case 9 : c+=k[8];
|
||||
case 8 : b+=((uint32_t)k[7])<<24;
|
||||
case 7 : b+=((uint32_t)k[6])<<16;
|
||||
case 6 : b+=((uint32_t)k[5])<<8;
|
||||
case 5 : b+=k[4];
|
||||
case 4 : a+=((uint32_t)k[3])<<24;
|
||||
case 3 : a+=((uint32_t)k[2])<<16;
|
||||
case 2 : a+=((uint32_t)k[1])<<8;
|
||||
case 1 : a+=k[0];
|
||||
break;
|
||||
case 0 : return c;
|
||||
}
|
||||
}
|
||||
|
||||
final(a,b,c);
|
||||
return c;
|
||||
}
|
||||
|
||||
unsigned long lh_char_hash(const void *k)
|
||||
{
|
||||
static volatile int random_seed = -1;
|
||||
|
||||
if (random_seed == -1) {
|
||||
int seed;
|
||||
/* we can't use -1 as it is the unitialized sentinel */
|
||||
while ((seed = json_c_get_random_seed()) == -1);
|
||||
#if defined __GNUC__
|
||||
__sync_val_compare_and_swap(&random_seed, -1, seed);
|
||||
#elif defined _MSC_VER
|
||||
InterlockedCompareExchange(&random_seed, seed, -1);
|
||||
#else
|
||||
#warning "racy random seed initializtion if used by multiple threads"
|
||||
random_seed = seed; /* potentially racy */
|
||||
#endif
|
||||
}
|
||||
|
||||
return hashlittle((const char*)k, strlen((const char*)k), random_seed);
|
||||
}
|
||||
|
||||
int lh_char_equal(const void *k1, const void *k2)
|
||||
{
|
||||
return (strcmp((const char*)k1, (const char*)k2) == 0);
|
||||
}
|
||||
|
||||
struct lh_table* lh_table_new(int size, const char *name,
|
||||
lh_entry_free_fn *free_fn,
|
||||
lh_hash_fn *hash_fn,
|
||||
lh_equal_fn *equal_fn)
|
||||
{
|
||||
int i;
|
||||
struct lh_table *t;
|
||||
|
||||
t = (struct lh_table*)calloc(1, sizeof(struct lh_table));
|
||||
if(!t) lh_abort("lh_table_new: calloc failed\n");
|
||||
t->count = 0;
|
||||
t->size = size;
|
||||
t->name = name;
|
||||
t->table = (struct lh_entry*)calloc(size, sizeof(struct lh_entry));
|
||||
if(!t->table) lh_abort("lh_table_new: calloc failed\n");
|
||||
t->free_fn = free_fn;
|
||||
t->hash_fn = hash_fn;
|
||||
t->equal_fn = equal_fn;
|
||||
for(i = 0; i < size; i++) t->table[i].k = LH_EMPTY;
|
||||
return t;
|
||||
}
|
||||
|
||||
struct lh_table* lh_kchar_table_new(int size, const char *name,
|
||||
lh_entry_free_fn *free_fn)
|
||||
{
|
||||
return lh_table_new(size, name, free_fn, lh_char_hash, lh_char_equal);
|
||||
}
|
||||
|
||||
struct lh_table* lh_kptr_table_new(int size, const char *name,
|
||||
lh_entry_free_fn *free_fn)
|
||||
{
|
||||
return lh_table_new(size, name, free_fn, lh_ptr_hash, lh_ptr_equal);
|
||||
}
|
||||
|
||||
void lh_table_resize(struct lh_table *t, int new_size)
|
||||
{
|
||||
struct lh_table *new_t;
|
||||
struct lh_entry *ent;
|
||||
|
||||
new_t = lh_table_new(new_size, t->name, NULL, t->hash_fn, t->equal_fn);
|
||||
ent = t->head;
|
||||
while(ent) {
|
||||
lh_table_insert(new_t, ent->k, ent->v);
|
||||
ent = ent->next;
|
||||
}
|
||||
free(t->table);
|
||||
t->table = new_t->table;
|
||||
t->size = new_size;
|
||||
t->head = new_t->head;
|
||||
t->tail = new_t->tail;
|
||||
t->resizes++;
|
||||
free(new_t);
|
||||
}
|
||||
|
||||
void lh_table_free(struct lh_table *t)
|
||||
{
|
||||
struct lh_entry *c;
|
||||
for(c = t->head; c != NULL; c = c->next) {
|
||||
if(t->free_fn) {
|
||||
t->free_fn(c);
|
||||
}
|
||||
}
|
||||
free(t->table);
|
||||
free(t);
|
||||
}
|
||||
|
||||
|
||||
int lh_table_insert(struct lh_table *t, void *k, const void *v)
|
||||
{
|
||||
unsigned long h, n;
|
||||
|
||||
t->inserts++;
|
||||
if(t->count >= t->size * LH_LOAD_FACTOR) lh_table_resize(t, t->size * 2);
|
||||
|
||||
h = t->hash_fn(k);
|
||||
n = h % t->size;
|
||||
|
||||
while( 1 ) {
|
||||
if(t->table[n].k == LH_EMPTY || t->table[n].k == LH_FREED) break;
|
||||
t->collisions++;
|
||||
if ((int)++n == t->size) n = 0;
|
||||
}
|
||||
|
||||
t->table[n].k = k;
|
||||
t->table[n].v = v;
|
||||
t->count++;
|
||||
|
||||
if(t->head == NULL) {
|
||||
t->head = t->tail = &t->table[n];
|
||||
t->table[n].next = t->table[n].prev = NULL;
|
||||
} else {
|
||||
t->tail->next = &t->table[n];
|
||||
t->table[n].prev = t->tail;
|
||||
t->table[n].next = NULL;
|
||||
t->tail = &t->table[n];
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k)
|
||||
{
|
||||
unsigned long h = t->hash_fn(k);
|
||||
unsigned long n = h % t->size;
|
||||
int count = 0;
|
||||
|
||||
t->lookups++;
|
||||
while( count < t->size ) {
|
||||
if(t->table[n].k == LH_EMPTY) return NULL;
|
||||
if(t->table[n].k != LH_FREED &&
|
||||
t->equal_fn(t->table[n].k, k)) return &t->table[n];
|
||||
if ((int)++n == t->size) n = 0;
|
||||
count++;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
const void* lh_table_lookup(struct lh_table *t, const void *k)
|
||||
{
|
||||
void *result;
|
||||
lh_table_lookup_ex(t, k, &result);
|
||||
return result;
|
||||
}
|
||||
|
||||
json_bool lh_table_lookup_ex(struct lh_table* t, const void* k, void **v)
|
||||
{
|
||||
struct lh_entry *e = lh_table_lookup_entry(t, k);
|
||||
if (e != NULL) {
|
||||
if (v != NULL) *v = (void *)e->v;
|
||||
return TRUE; /* key found */
|
||||
}
|
||||
if (v != NULL) *v = NULL;
|
||||
return FALSE; /* key not found */
|
||||
}
|
||||
|
||||
int lh_table_delete_entry(struct lh_table *t, struct lh_entry *e)
|
||||
{
|
||||
ptrdiff_t n = (ptrdiff_t)(e - t->table); /* CAW: fixed to be 64bit nice, still need the crazy negative case... */
|
||||
|
||||
/* CAW: this is bad, really bad, maybe stack goes other direction on this machine... */
|
||||
if(n < 0) { return -2; }
|
||||
|
||||
if(t->table[n].k == LH_EMPTY || t->table[n].k == LH_FREED) return -1;
|
||||
t->count--;
|
||||
if(t->free_fn) t->free_fn(e);
|
||||
t->table[n].v = NULL;
|
||||
t->table[n].k = LH_FREED;
|
||||
if(t->tail == &t->table[n] && t->head == &t->table[n]) {
|
||||
t->head = t->tail = NULL;
|
||||
} else if (t->head == &t->table[n]) {
|
||||
t->head->next->prev = NULL;
|
||||
t->head = t->head->next;
|
||||
} else if (t->tail == &t->table[n]) {
|
||||
t->tail->prev->next = NULL;
|
||||
t->tail = t->tail->prev;
|
||||
} else {
|
||||
t->table[n].prev->next = t->table[n].next;
|
||||
t->table[n].next->prev = t->table[n].prev;
|
||||
}
|
||||
t->table[n].next = t->table[n].prev = NULL;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int lh_table_delete(struct lh_table *t, const void *k)
|
||||
{
|
||||
struct lh_entry *e = lh_table_lookup_entry(t, k);
|
||||
if(!e) return -1;
|
||||
return lh_table_delete_entry(t, e);
|
||||
}
|
||||
|
||||
int lh_table_length(struct lh_table *t)
|
||||
{
|
||||
return t->count;
|
||||
}
|
||||
292
json-c/linkhash.h
Normal file
292
json-c/linkhash.h
Normal file
@@ -0,0 +1,292 @@
|
||||
/*
|
||||
* $Id: linkhash.h,v 1.6 2006/01/30 23:07:57 mclark Exp $
|
||||
*
|
||||
* Copyright (c) 2004, 2005 Metaparadigm Pte. Ltd.
|
||||
* Michael Clark <michael@metaparadigm.com>
|
||||
* Copyright (c) 2009 Hewlett-Packard Development Company, L.P.
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the MIT license. See COPYING for details.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef _linkhash_h_
|
||||
#define _linkhash_h_
|
||||
|
||||
#include "json_object.h"
|
||||
|
||||
#ifdef __cplusplus
|
||||
extern "C" {
|
||||
#endif
|
||||
|
||||
/**
|
||||
* golden prime used in hash functions
|
||||
*/
|
||||
#define LH_PRIME 0x9e370001UL
|
||||
|
||||
/**
|
||||
* The fraction of filled hash buckets until an insert will cause the table
|
||||
* to be resized.
|
||||
* This can range from just above 0 up to 1.0.
|
||||
*/
|
||||
#define LH_LOAD_FACTOR 0.66
|
||||
|
||||
/**
|
||||
* sentinel pointer value for empty slots
|
||||
*/
|
||||
#define LH_EMPTY (void*)-1
|
||||
|
||||
/**
|
||||
* sentinel pointer value for freed slots
|
||||
*/
|
||||
#define LH_FREED (void*)-2
|
||||
|
||||
struct lh_entry;
|
||||
|
||||
/**
|
||||
* callback function prototypes
|
||||
*/
|
||||
typedef void (lh_entry_free_fn) (struct lh_entry *e);
|
||||
/**
|
||||
* callback function prototypes
|
||||
*/
|
||||
typedef unsigned long (lh_hash_fn) (const void *k);
|
||||
/**
|
||||
* callback function prototypes
|
||||
*/
|
||||
typedef int (lh_equal_fn) (const void *k1, const void *k2);
|
||||
|
||||
/**
|
||||
* An entry in the hash table
|
||||
*/
|
||||
struct lh_entry {
|
||||
/**
|
||||
* The key.
|
||||
*/
|
||||
void *k;
|
||||
/**
|
||||
* The value.
|
||||
*/
|
||||
const void *v;
|
||||
/**
|
||||
* The next entry
|
||||
*/
|
||||
struct lh_entry *next;
|
||||
/**
|
||||
* The previous entry.
|
||||
*/
|
||||
struct lh_entry *prev;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* The hash table structure.
|
||||
*/
|
||||
struct lh_table {
|
||||
/**
|
||||
* Size of our hash.
|
||||
*/
|
||||
int size;
|
||||
/**
|
||||
* Numbers of entries.
|
||||
*/
|
||||
int count;
|
||||
|
||||
/**
|
||||
* Number of collisions.
|
||||
*/
|
||||
int collisions;
|
||||
|
||||
/**
|
||||
* Number of resizes.
|
||||
*/
|
||||
int resizes;
|
||||
|
||||
/**
|
||||
* Number of lookups.
|
||||
*/
|
||||
int lookups;
|
||||
|
||||
/**
|
||||
* Number of inserts.
|
||||
*/
|
||||
int inserts;
|
||||
|
||||
/**
|
||||
* Number of deletes.
|
||||
*/
|
||||
int deletes;
|
||||
|
||||
/**
|
||||
* Name of the hash table.
|
||||
*/
|
||||
const char *name;
|
||||
|
||||
/**
|
||||
* The first entry.
|
||||
*/
|
||||
struct lh_entry *head;
|
||||
|
||||
/**
|
||||
* The last entry.
|
||||
*/
|
||||
struct lh_entry *tail;
|
||||
|
||||
struct lh_entry *table;
|
||||
|
||||
/**
|
||||
* A pointer onto the function responsible for freeing an entry.
|
||||
*/
|
||||
lh_entry_free_fn *free_fn;
|
||||
lh_hash_fn *hash_fn;
|
||||
lh_equal_fn *equal_fn;
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
* Pre-defined hash and equality functions
|
||||
*/
|
||||
extern unsigned long lh_ptr_hash(const void *k);
|
||||
extern int lh_ptr_equal(const void *k1, const void *k2);
|
||||
|
||||
extern unsigned long lh_char_hash(const void *k);
|
||||
extern int lh_char_equal(const void *k1, const void *k2);
|
||||
|
||||
|
||||
/**
|
||||
* Convenience list iterator.
|
||||
*/
|
||||
#define lh_foreach(table, entry) \
|
||||
for(entry = table->head; entry; entry = entry->next)
|
||||
|
||||
/**
|
||||
* lh_foreach_safe allows calling of deletion routine while iterating.
|
||||
*/
|
||||
#define lh_foreach_safe(table, entry, tmp) \
|
||||
for(entry = table->head; entry && ((tmp = entry->next) || 1); entry = tmp)
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Create a new linkhash table.
|
||||
* @param size initial table size. The table is automatically resized
|
||||
* although this incurs a performance penalty.
|
||||
* @param name the table name.
|
||||
* @param free_fn callback function used to free memory for entries
|
||||
* when lh_table_free or lh_table_delete is called.
|
||||
* If NULL is provided, then memory for keys and values
|
||||
* must be freed by the caller.
|
||||
* @param hash_fn function used to hash keys. 2 standard ones are defined:
|
||||
* lh_ptr_hash and lh_char_hash for hashing pointer values
|
||||
* and C strings respectively.
|
||||
* @param equal_fn comparison function to compare keys. 2 standard ones defined:
|
||||
* lh_ptr_hash and lh_char_hash for comparing pointer values
|
||||
* and C strings respectively.
|
||||
* @return a pointer onto the linkhash table.
|
||||
*/
|
||||
extern struct lh_table* lh_table_new(int size, const char *name,
|
||||
lh_entry_free_fn *free_fn,
|
||||
lh_hash_fn *hash_fn,
|
||||
lh_equal_fn *equal_fn);
|
||||
|
||||
/**
|
||||
* Convenience function to create a new linkhash
|
||||
* table with char keys.
|
||||
* @param size initial table size.
|
||||
* @param name table name.
|
||||
* @param free_fn callback function used to free memory for entries.
|
||||
* @return a pointer onto the linkhash table.
|
||||
*/
|
||||
extern struct lh_table* lh_kchar_table_new(int size, const char *name,
|
||||
lh_entry_free_fn *free_fn);
|
||||
|
||||
|
||||
/**
|
||||
* Convenience function to create a new linkhash
|
||||
* table with ptr keys.
|
||||
* @param size initial table size.
|
||||
* @param name table name.
|
||||
* @param free_fn callback function used to free memory for entries.
|
||||
* @return a pointer onto the linkhash table.
|
||||
*/
|
||||
extern struct lh_table* lh_kptr_table_new(int size, const char *name,
|
||||
lh_entry_free_fn *free_fn);
|
||||
|
||||
|
||||
/**
|
||||
* Free a linkhash table.
|
||||
* If a callback free function is provided then it is called for all
|
||||
* entries in the table.
|
||||
* @param t table to free.
|
||||
*/
|
||||
extern void lh_table_free(struct lh_table *t);
|
||||
|
||||
|
||||
/**
|
||||
* Insert a record into the table.
|
||||
* @param t the table to insert into.
|
||||
* @param k a pointer to the key to insert.
|
||||
* @param v a pointer to the value to insert.
|
||||
*/
|
||||
extern int lh_table_insert(struct lh_table *t, void *k, const void *v);
|
||||
|
||||
|
||||
/**
|
||||
* Lookup a record into the table.
|
||||
* @param t the table to lookup
|
||||
* @param k a pointer to the key to lookup
|
||||
* @return a pointer to the record structure of the value or NULL if it does not exist.
|
||||
*/
|
||||
extern struct lh_entry* lh_table_lookup_entry(struct lh_table *t, const void *k);
|
||||
|
||||
/**
|
||||
* Lookup a record into the table
|
||||
* @param t the table to lookup
|
||||
* @param k a pointer to the key to lookup
|
||||
* @return a pointer to the found value or NULL if it does not exist.
|
||||
* @deprecated Use lh_table_lookup_ex instead.
|
||||
*/
|
||||
THIS_FUNCTION_IS_DEPRECATED(extern const void* lh_table_lookup(struct lh_table *t, const void *k));
|
||||
|
||||
/**
|
||||
* Lookup a record in the table
|
||||
* @param t the table to lookup
|
||||
* @param k a pointer to the key to lookup
|
||||
* @param v a pointer to a where to store the found value (set to NULL if it doesn't exist).
|
||||
* @return whether or not the key was found
|
||||
*/
|
||||
extern json_bool lh_table_lookup_ex(struct lh_table *t, const void *k, void **v);
|
||||
|
||||
/**
|
||||
* Delete a record from the table.
|
||||
* If a callback free function is provided then it is called for the
|
||||
* for the item being deleted.
|
||||
* @param t the table to delete from.
|
||||
* @param e a pointer to the entry to delete.
|
||||
* @return 0 if the item was deleted.
|
||||
* @return -1 if it was not found.
|
||||
*/
|
||||
extern int lh_table_delete_entry(struct lh_table *t, struct lh_entry *e);
|
||||
|
||||
|
||||
/**
|
||||
* Delete a record from the table.
|
||||
* If a callback free function is provided then it is called for the
|
||||
* for the item being deleted.
|
||||
* @param t the table to delete from.
|
||||
* @param k a pointer to the key to delete.
|
||||
* @return 0 if the item was deleted.
|
||||
* @return -1 if it was not found.
|
||||
*/
|
||||
extern int lh_table_delete(struct lh_table *t, const void *k);
|
||||
|
||||
extern int lh_table_length(struct lh_table *t);
|
||||
|
||||
void lh_abort(const char *msg, ...);
|
||||
void lh_table_resize(struct lh_table *t, int new_size);
|
||||
|
||||
#ifdef __cplusplus
|
||||
}
|
||||
#endif
|
||||
|
||||
#endif
|
||||
28
json-c/math_compat.h
Normal file
28
json-c/math_compat.h
Normal file
@@ -0,0 +1,28 @@
|
||||
#ifndef __math_compat_h
|
||||
#define __math_compat_h
|
||||
|
||||
/* Define isnan and isinf on Windows/MSVC */
|
||||
|
||||
#ifndef HAVE_DECL_ISNAN
|
||||
# ifdef HAVE_DECL__ISNAN
|
||||
#include <float.h>
|
||||
#define isnan(x) _isnan(x)
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DECL_ISINF
|
||||
# ifdef HAVE_DECL__FINITE
|
||||
#include <float.h>
|
||||
#define isinf(x) (!_finite(x))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DECL_NAN
|
||||
#error This platform does not have nan()
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_DECL_INFINITY
|
||||
#error This platform does not have INFINITY
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user