creation
parent
22dbdb5e49
commit
bca40cdc11
|
@ -1,339 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2020 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.network;
|
|
||||||
|
|
||||||
import android.content.ContentResolver;
|
|
||||||
import android.content.Context;
|
|
||||||
import android.content.res.Resources;
|
|
||||||
import android.database.ContentObserver;
|
|
||||||
import android.net.LinkProperties;
|
|
||||||
import android.net.Network;
|
|
||||||
import android.os.Handler;
|
|
||||||
import android.os.Looper;
|
|
||||||
import android.os.UserHandle;
|
|
||||||
import android.os.UserManager;
|
|
||||||
import android.provider.Settings;
|
|
||||||
import androidx.preference.ListPreference;
|
|
||||||
import androidx.preference.Preference;
|
|
||||||
import androidx.preference.PreferenceScreen;
|
|
||||||
import com.android.internal.util.ArrayUtils;
|
|
||||||
import com.android.settings.R;
|
|
||||||
import com.android.settings.core.BasePreferenceController;
|
|
||||||
import com.android.settings.core.PreferenceControllerMixin;
|
|
||||||
import com.android.settingslib.RestrictedLockUtils.EnforcedAdmin;
|
|
||||||
import com.android.settingslib.RestrictedLockUtilsInternal;
|
|
||||||
import com.android.settingslib.core.lifecycle.events.OnResume;
|
|
||||||
|
|
||||||
public class ConnectivityCheckPreferenceController
|
|
||||||
extends BasePreferenceController
|
|
||||||
implements PreferenceControllerMixin, Preference.OnPreferenceChangeListener,
|
|
||||||
OnResume {
|
|
||||||
|
|
||||||
// imported defaults from AOSP NetworkStack
|
|
||||||
private static final String STANDARD_HTTPS_URL =
|
|
||||||
"http://captiveportal.kuketz.de/generate_204";
|
|
||||||
private static final String STANDARD_HTTP_URL =
|
|
||||||
"http://captiveportal.kuketz.de/generate_204";
|
|
||||||
private static final String STANDARD_FALLBACK_URL =
|
|
||||||
"http://captiveportal.kuketz.de/gen_204";
|
|
||||||
private static final String STANDARD_OTHER_FALLBACK_URLS =
|
|
||||||
"http://captiveportal.kuketz.de/generate_204";
|
|
||||||
|
|
||||||
// GrapheneOS
|
|
||||||
private static final String GRAPHENEOS_CAPTIVE_PORTAL_HTTPS_URL =
|
|
||||||
"https://connectivitycheck.grapheneos.network/generate_204";
|
|
||||||
private static final String GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL =
|
|
||||||
"http://connectivitycheck.grapheneos.network/generate_204";
|
|
||||||
private static final String GRAPHENEOS_CAPTIVE_PORTAL_FALLBACK_URL =
|
|
||||||
"http://grapheneos.online/gen_204";
|
|
||||||
private static final String GRAPHENEOS_CAPTIVE_PORTAL_OTHER_FALLBACK_URL =
|
|
||||||
"http://grapheneos.online/generate_204";
|
|
||||||
|
|
||||||
// DivestOS
|
|
||||||
private static final String DIVESTOS_HTTPS_URL =
|
|
||||||
"https://divestos.org/generate_204";
|
|
||||||
private static final String DIVESTOS_HTTP_URL =
|
|
||||||
"http://divestos.org/generate_204";
|
|
||||||
|
|
||||||
// openSUSE
|
|
||||||
private static final String OPENSUSE_HTTPS_URL =
|
|
||||||
"https://conncheck.opensuse.org";
|
|
||||||
private static final String OPENSUSE_HTTP_URL =
|
|
||||||
"http://conncheck.opensuse.org";
|
|
||||||
|
|
||||||
// Ubuntu
|
|
||||||
private static final String UBUNTU_HTTPS_URL =
|
|
||||||
"https://connectivity-check.ubuntu.com";
|
|
||||||
private static final String UBUNTU_HTTP_URL =
|
|
||||||
"http://connectivity-check.ubuntu.com";
|
|
||||||
|
|
||||||
// Amazon Fire OS
|
|
||||||
private static final String AMAZON_HTTPS_URL =
|
|
||||||
"https://fireoscaptiveportal.com/generate_204";
|
|
||||||
private static final String AMAZON_HTTP_URL =
|
|
||||||
"http://fireoscaptiveportal.com/generate_204";
|
|
||||||
|
|
||||||
// Microsoft Edge
|
|
||||||
private static final String MICROSOFT_HTTP_URL =
|
|
||||||
"http://edge-http.microsoft.com/captiveportal/generate_204";
|
|
||||||
|
|
||||||
// Kuketz, https://www.kuketz-blog.de/android-captive-portal-check-204-http-antwort-von-captiveportal-kuketz-de/
|
|
||||||
private static final String KUKETZ_HTTPS_URL =
|
|
||||||
"https://captiveportal.kuketz.de";
|
|
||||||
private static final String KUKETZ_HTTP_URL =
|
|
||||||
"http://captiveportal.kuketz.de";
|
|
||||||
|
|
||||||
private static final int DISABLED_CAPTIVE_PORTAL_INTVAL = 0;
|
|
||||||
private static final int STANDARD_CAPTIVE_PORTAL_HTTP_URL_INTVAL = 1;
|
|
||||||
private static final int GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL_INTVAL = 2;
|
|
||||||
private static final int DIVESTOS_CAPTIVE_PORTAL_HTTP_URL_INTVAL = 3;
|
|
||||||
private static final int OPENSUSE_CAPTIVE_PORTAL_HTTP_URL_INTVAL = 4;
|
|
||||||
private static final int UBUNTU_CAPTIVE_PORTAL_HTTP_URL_INTVAL = 5;
|
|
||||||
private static final int AMAZON_CAPTIVE_PORTAL_HTTP_URL_INTVAL = 6;
|
|
||||||
private static final int MICROSOFT_CAPTIVE_PORTAL_HTTP_URL_INTVAL = 7;
|
|
||||||
private static final int KUKETZ_CAPTIVE_PORTAL_HTTP_URL_INTVAL = 8;
|
|
||||||
|
|
||||||
private static final String KEY_CONNECTIVITY_CHECK_SETTINGS =
|
|
||||||
"connectivity_check_settings";
|
|
||||||
|
|
||||||
private ListPreference mConnectivityPreference;
|
|
||||||
|
|
||||||
public ConnectivityCheckPreferenceController(Context context) {
|
|
||||||
super(context, KEY_CONNECTIVITY_CHECK_SETTINGS);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public int getAvailabilityStatus() {
|
|
||||||
if (isDisabledByAdmin()) {
|
|
||||||
return BasePreferenceController.DISABLED_FOR_USER;
|
|
||||||
}
|
|
||||||
return BasePreferenceController.AVAILABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void displayPreference(PreferenceScreen screen) {
|
|
||||||
ListPreference captiveList = new ListPreference(screen.getContext());
|
|
||||||
captiveList.setKey(KEY_CONNECTIVITY_CHECK_SETTINGS);
|
|
||||||
captiveList.setOrder(30);
|
|
||||||
captiveList.setIcon(R.drawable.ic_settings_language);
|
|
||||||
captiveList.setTitle(R.string.connectivity_check_title);
|
|
||||||
captiveList.setSummary(R.string.connectivity_check_summary);
|
|
||||||
captiveList.setEntries(R.array.connectivity_check_entries);
|
|
||||||
captiveList.setEntryValues(R.array.connectivity_check_values);
|
|
||||||
|
|
||||||
if (mConnectivityPreference == null) {
|
|
||||||
screen.addPreference(captiveList);
|
|
||||||
mConnectivityPreference = captiveList;
|
|
||||||
}
|
|
||||||
super.displayPreference(screen);
|
|
||||||
updatePreferenceState();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPreferenceKey() {
|
|
||||||
return KEY_CONNECTIVITY_CHECK_SETTINGS;
|
|
||||||
}
|
|
||||||
|
|
||||||
private void updatePreferenceState() {
|
|
||||||
if (Settings.Global.getInt(mContext.getContentResolver(),
|
|
||||||
Settings.Global.CAPTIVE_PORTAL_MODE, Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT)
|
|
||||||
== Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE) {
|
|
||||||
mConnectivityPreference.setValueIndex(DISABLED_CAPTIVE_PORTAL_INTVAL);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
String pref = Settings.Global.getString(
|
|
||||||
mContext.getContentResolver(), Settings.Global.CAPTIVE_PORTAL_HTTP_URL);
|
|
||||||
if (STANDARD_HTTP_URL.equals(pref)) {
|
|
||||||
mConnectivityPreference.setValueIndex(
|
|
||||||
STANDARD_CAPTIVE_PORTAL_HTTP_URL_INTVAL);
|
|
||||||
} else if (GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL.equals(pref)) {
|
|
||||||
mConnectivityPreference.setValueIndex(
|
|
||||||
GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL_INTVAL);
|
|
||||||
} else if (DIVESTOS_HTTP_URL.equals(pref)) {
|
|
||||||
mConnectivityPreference.setValueIndex(
|
|
||||||
DIVESTOS_CAPTIVE_PORTAL_HTTP_URL_INTVAL);
|
|
||||||
} else if (OPENSUSE_HTTP_URL.equals(pref)) {
|
|
||||||
mConnectivityPreference.setValueIndex(
|
|
||||||
OPENSUSE_CAPTIVE_PORTAL_HTTP_URL_INTVAL);
|
|
||||||
} else if (UBUNTU_HTTP_URL.equals(pref)) {
|
|
||||||
mConnectivityPreference.setValueIndex(
|
|
||||||
UBUNTU_CAPTIVE_PORTAL_HTTP_URL_INTVAL);
|
|
||||||
} else if (AMAZON_HTTP_URL.equals(pref)) {
|
|
||||||
mConnectivityPreference.setValueIndex(
|
|
||||||
AMAZON_CAPTIVE_PORTAL_HTTP_URL_INTVAL);
|
|
||||||
} else if (MICROSOFT_HTTP_URL.equals(pref)) {
|
|
||||||
mConnectivityPreference.setValueIndex(
|
|
||||||
MICROSOFT_CAPTIVE_PORTAL_HTTP_URL_INTVAL);
|
|
||||||
} else if (KUKETZ_HTTP_URL.equals(pref)) {
|
|
||||||
mConnectivityPreference.setValueIndex(
|
|
||||||
KUKETZ_CAPTIVE_PORTAL_HTTP_URL_INTVAL);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
updatePreferenceState();
|
|
||||||
if (mConnectivityPreference != null) {
|
|
||||||
setCaptivePortalURLs(
|
|
||||||
mContext.getContentResolver(),
|
|
||||||
Integer.parseInt(mConnectivityPreference.getValue()));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private void setCaptivePortalURLs(ContentResolver cr, int mode) {
|
|
||||||
switch (mode) {
|
|
||||||
case STANDARD_CAPTIVE_PORTAL_HTTP_URL_INTVAL:
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
|
|
||||||
STANDARD_HTTP_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
|
|
||||||
STANDARD_HTTPS_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL,
|
|
||||||
STANDARD_FALLBACK_URL);
|
|
||||||
Settings.Global.putString(
|
|
||||||
cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS,
|
|
||||||
STANDARD_OTHER_FALLBACK_URLS);
|
|
||||||
Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE,
|
|
||||||
Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT);
|
|
||||||
break;
|
|
||||||
case GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL_INTVAL:
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
|
|
||||||
GRAPHENEOS_CAPTIVE_PORTAL_HTTP_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
|
|
||||||
GRAPHENEOS_CAPTIVE_PORTAL_HTTPS_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL,
|
|
||||||
GRAPHENEOS_CAPTIVE_PORTAL_FALLBACK_URL);
|
|
||||||
Settings.Global.putString(
|
|
||||||
cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS,
|
|
||||||
GRAPHENEOS_CAPTIVE_PORTAL_OTHER_FALLBACK_URL);
|
|
||||||
Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE,
|
|
||||||
Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT);
|
|
||||||
break;
|
|
||||||
case DIVESTOS_CAPTIVE_PORTAL_HTTP_URL_INTVAL:
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
|
|
||||||
DIVESTOS_HTTP_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
|
|
||||||
DIVESTOS_HTTPS_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL,
|
|
||||||
DIVESTOS_HTTP_URL);
|
|
||||||
Settings.Global.putString(
|
|
||||||
cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS,
|
|
||||||
DIVESTOS_HTTP_URL);
|
|
||||||
Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE,
|
|
||||||
Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT);
|
|
||||||
break;
|
|
||||||
case OPENSUSE_CAPTIVE_PORTAL_HTTP_URL_INTVAL:
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
|
|
||||||
OPENSUSE_HTTP_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
|
|
||||||
OPENSUSE_HTTPS_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL,
|
|
||||||
OPENSUSE_HTTP_URL);
|
|
||||||
Settings.Global.putString(
|
|
||||||
cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS,
|
|
||||||
OPENSUSE_HTTP_URL);
|
|
||||||
Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE,
|
|
||||||
Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT);
|
|
||||||
break;
|
|
||||||
case UBUNTU_CAPTIVE_PORTAL_HTTP_URL_INTVAL:
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
|
|
||||||
UBUNTU_HTTP_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
|
|
||||||
UBUNTU_HTTPS_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL,
|
|
||||||
UBUNTU_HTTP_URL);
|
|
||||||
Settings.Global.putString(
|
|
||||||
cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS,
|
|
||||||
UBUNTU_HTTP_URL);
|
|
||||||
Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE,
|
|
||||||
Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT);
|
|
||||||
break;
|
|
||||||
case AMAZON_CAPTIVE_PORTAL_HTTP_URL_INTVAL:
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
|
|
||||||
AMAZON_HTTP_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
|
|
||||||
AMAZON_HTTPS_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL,
|
|
||||||
AMAZON_HTTP_URL);
|
|
||||||
Settings.Global.putString(
|
|
||||||
cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS,
|
|
||||||
AMAZON_HTTP_URL);
|
|
||||||
Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE,
|
|
||||||
Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT);
|
|
||||||
break;
|
|
||||||
case MICROSOFT_CAPTIVE_PORTAL_HTTP_URL_INTVAL:
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
|
|
||||||
MICROSOFT_HTTP_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
|
|
||||||
MICROSOFT_HTTP_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL,
|
|
||||||
MICROSOFT_HTTP_URL);
|
|
||||||
Settings.Global.putString(
|
|
||||||
cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS,
|
|
||||||
MICROSOFT_HTTP_URL);
|
|
||||||
Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE,
|
|
||||||
Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT);
|
|
||||||
break;
|
|
||||||
case KUKETZ_CAPTIVE_PORTAL_HTTP_URL_INTVAL:
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
|
|
||||||
KUKETZ_HTTP_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
|
|
||||||
KUKETZ_HTTPS_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL,
|
|
||||||
KUKETZ_HTTP_URL);
|
|
||||||
Settings.Global.putString(
|
|
||||||
cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS,
|
|
||||||
KUKETZ_HTTP_URL);
|
|
||||||
Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE,
|
|
||||||
Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT);
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
// Default URLs as placeholder
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTP_URL,
|
|
||||||
STANDARD_HTTP_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_HTTPS_URL,
|
|
||||||
STANDARD_HTTPS_URL);
|
|
||||||
Settings.Global.putString(cr, Settings.Global.CAPTIVE_PORTAL_FALLBACK_URL,
|
|
||||||
STANDARD_FALLBACK_URL);
|
|
||||||
Settings.Global.putString(
|
|
||||||
cr, Settings.Global.CAPTIVE_PORTAL_OTHER_FALLBACK_URLS,
|
|
||||||
STANDARD_OTHER_FALLBACK_URLS);
|
|
||||||
Settings.Global.putInt(cr, Settings.Global.CAPTIVE_PORTAL_MODE,
|
|
||||||
Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object value) {
|
|
||||||
final String key = preference.getKey();
|
|
||||||
if (KEY_CONNECTIVITY_CHECK_SETTINGS.equals(key)) {
|
|
||||||
setCaptivePortalURLs(mContext.getContentResolver(),
|
|
||||||
Integer.parseInt((String)value));
|
|
||||||
return true;
|
|
||||||
} else {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private EnforcedAdmin getEnforcedAdmin() {
|
|
||||||
return RestrictedLockUtilsInternal.checkIfRestrictionEnforced(
|
|
||||||
mContext, UserManager.DISALLOW_CONFIG_PRIVATE_DNS,
|
|
||||||
UserHandle.myUserId());
|
|
||||||
}
|
|
||||||
|
|
||||||
private boolean isDisabledByAdmin() { return getEnforcedAdmin() != null; }
|
|
||||||
}
|
|
|
@ -1,522 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2020 The LineageOS 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 <fcntl.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <strings.h>
|
|
||||||
#include <sys/file.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <utime.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
#include <netinet/in6.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
#include <arpa/nameser.h>
|
|
||||||
|
|
||||||
#include "hostent.h"
|
|
||||||
#include "resolv_private.h"
|
|
||||||
|
|
||||||
constexpr int MAXALIASES = 35;
|
|
||||||
constexpr int MAXADDRS = 35;
|
|
||||||
|
|
||||||
#define MAX_ADDRLEN (INET6_ADDRSTRLEN - (1 + 5))
|
|
||||||
#define MAX_HOSTLEN MAXHOSTNAMELEN
|
|
||||||
|
|
||||||
#define ESTIMATED_LINELEN 32
|
|
||||||
#define HCFILE_ALLOC_SIZE 256
|
|
||||||
|
|
||||||
/* From sethostent.c */
|
|
||||||
#define ALIGNBYTES (sizeof(uintptr_t) - 1)
|
|
||||||
#define ALIGN(p) (((uintptr_t)(p) + ALIGNBYTES) &~ ALIGNBYTES)
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Host cache entry for hcfile.c_data.
|
|
||||||
* Offsets are into hcfile.h_data.
|
|
||||||
* Strings are *not* terminated by NULL, but by whitespace (isspace) or '#'.
|
|
||||||
* Use hstr* functions with these.
|
|
||||||
*/
|
|
||||||
struct hcent
|
|
||||||
{
|
|
||||||
uint32_t addr;
|
|
||||||
uint32_t name;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Overall host cache file state.
|
|
||||||
*/
|
|
||||||
struct hcfile
|
|
||||||
{
|
|
||||||
int h_fd;
|
|
||||||
struct stat h_st;
|
|
||||||
char* h_data;
|
|
||||||
|
|
||||||
uint32_t c_alloc;
|
|
||||||
uint32_t c_len;
|
|
||||||
struct hcent* c_data;
|
|
||||||
};
|
|
||||||
static struct hcfile hcfile;
|
|
||||||
static pthread_mutex_t hclock = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
|
|
||||||
static size_t hstrlen(const char *s)
|
|
||||||
{
|
|
||||||
const char *p = s;
|
|
||||||
while (*p && *p != '#' && !isspace(*p))
|
|
||||||
++p;
|
|
||||||
return p - s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int hstrcmp(const char *a, const char *b)
|
|
||||||
{
|
|
||||||
size_t alen = hstrlen(a);
|
|
||||||
size_t blen = hstrlen(b);
|
|
||||||
int res = strncmp(a, b, MIN(alen, blen));
|
|
||||||
if (res == 0)
|
|
||||||
res = alen - blen;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *hstrcpy(char *dest, const char *src)
|
|
||||||
{
|
|
||||||
size_t len = hstrlen(src);
|
|
||||||
memcpy(dest, src, len);
|
|
||||||
dest[len] = '\0';
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *hstrdup(const char *s)
|
|
||||||
{
|
|
||||||
size_t len = hstrlen(s);
|
|
||||||
char *dest = (char *)malloc(len + 1);
|
|
||||||
if (!dest)
|
|
||||||
return NULL;
|
|
||||||
memcpy(dest, s, len);
|
|
||||||
dest[len] = '\0';
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cmp_hcent_name(const void *a, const void *b)
|
|
||||||
{
|
|
||||||
struct hcent *ea = (struct hcent *)a;
|
|
||||||
const char *na = hcfile.h_data + ea->name;
|
|
||||||
struct hcent *eb = (struct hcent *)b;
|
|
||||||
const char *nb = hcfile.h_data + eb->name;
|
|
||||||
|
|
||||||
return hstrcmp(na, nb);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct hcent *_hcfindname(const char *name)
|
|
||||||
{
|
|
||||||
size_t first, last, mid;
|
|
||||||
struct hcent *cur = NULL;
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
if (hcfile.c_len == 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
first = 0;
|
|
||||||
last = hcfile.c_len - 1;
|
|
||||||
mid = (first + last) / 2;
|
|
||||||
while (first <= last) {
|
|
||||||
cur = hcfile.c_data + mid;
|
|
||||||
cmp = hstrcmp(hcfile.h_data + cur->name, name);
|
|
||||||
if (cmp == 0)
|
|
||||||
goto found;
|
|
||||||
if (cmp < 0)
|
|
||||||
first = mid + 1;
|
|
||||||
else {
|
|
||||||
if (mid > 0)
|
|
||||||
last = mid - 1;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
mid = (first + last) / 2;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
found:
|
|
||||||
while (cur > hcfile.c_data) {
|
|
||||||
struct hcent *prev = cur - 1;
|
|
||||||
cmp = cmp_hcent_name(cur, prev);
|
|
||||||
if (cmp)
|
|
||||||
break;
|
|
||||||
cur = prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
return cur;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Find next name on line, if any.
|
|
||||||
*
|
|
||||||
* Assumes that line is terminated by LF.
|
|
||||||
*/
|
|
||||||
static const char *_hcnextname(const char *name)
|
|
||||||
{
|
|
||||||
while (!isspace(*name)) {
|
|
||||||
if (*name == '#')
|
|
||||||
return NULL;
|
|
||||||
++name;
|
|
||||||
}
|
|
||||||
while (isspace(*name)) {
|
|
||||||
if (*name == '\n')
|
|
||||||
return NULL;
|
|
||||||
++name;
|
|
||||||
}
|
|
||||||
if (*name == '#')
|
|
||||||
return NULL;
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _hcfilemmap(void)
|
|
||||||
{
|
|
||||||
struct stat st;
|
|
||||||
int h_fd;
|
|
||||||
char *h_addr;
|
|
||||||
const char *p, *pend;
|
|
||||||
uint32_t c_alloc;
|
|
||||||
|
|
||||||
h_fd = open(_PATH_HOSTS, O_CLOEXEC);
|
|
||||||
if (h_fd < 0)
|
|
||||||
return -1;
|
|
||||||
if (flock(h_fd, LOCK_EX) != 0) {
|
|
||||||
close(h_fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hcfile.h_data) {
|
|
||||||
memset(&st, 0, sizeof(st));
|
|
||||||
if (fstat(h_fd, &st) == 0) {
|
|
||||||
if (st.st_size == hcfile.h_st.st_size &&
|
|
||||||
st.st_mtime == hcfile.h_st.st_mtime) {
|
|
||||||
flock(h_fd, LOCK_UN);
|
|
||||||
close(h_fd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(hcfile.c_data);
|
|
||||||
munmap(hcfile.h_data, hcfile.h_st.st_size);
|
|
||||||
close(hcfile.h_fd);
|
|
||||||
memset(&hcfile, 0, sizeof(struct hcfile));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fstat(h_fd, &st) != 0) {
|
|
||||||
flock(h_fd, LOCK_UN);
|
|
||||||
close(h_fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
h_addr = (char*)mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, h_fd, 0);
|
|
||||||
if (h_addr == MAP_FAILED) {
|
|
||||||
flock(h_fd, LOCK_UN);
|
|
||||||
close(h_fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
hcfile.h_fd = h_fd;
|
|
||||||
hcfile.h_st = st;
|
|
||||||
hcfile.h_data = h_addr;
|
|
||||||
|
|
||||||
c_alloc = 0;
|
|
||||||
/*
|
|
||||||
* Do an initial allocation if the file is "large". Estimate
|
|
||||||
* 32 bytes per line and define "large" as more than half of
|
|
||||||
* the alloc growth size (256 entries).
|
|
||||||
*/
|
|
||||||
if (st.st_size >= ESTIMATED_LINELEN * HCFILE_ALLOC_SIZE / 2) {
|
|
||||||
c_alloc = st.st_size / ESTIMATED_LINELEN;
|
|
||||||
hcfile.c_data = (struct hcent*)malloc(c_alloc * sizeof(struct hcent));
|
|
||||||
if (!hcfile.c_data) {
|
|
||||||
goto oom;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
p = (const char *)h_addr;
|
|
||||||
pend = p + st.st_size;
|
|
||||||
while (p < pend) {
|
|
||||||
const char *eol, *addr, *name;
|
|
||||||
size_t len;
|
|
||||||
addr = p;
|
|
||||||
eol = (const char*)memchr(p, '\n', pend - p);
|
|
||||||
if (!eol)
|
|
||||||
break;
|
|
||||||
p = eol + 1;
|
|
||||||
if (*addr == '#' || *addr == '\n')
|
|
||||||
continue;
|
|
||||||
len = hstrlen(addr);
|
|
||||||
if (len > MAX_ADDRLEN)
|
|
||||||
continue;
|
|
||||||
name = addr + len;
|
|
||||||
while (name < eol && isspace(*name))
|
|
||||||
++name;
|
|
||||||
while (name < eol) {
|
|
||||||
len = hstrlen(name);
|
|
||||||
if (len == 0)
|
|
||||||
break;
|
|
||||||
if (len < MAX_HOSTLEN) {
|
|
||||||
struct hcent *ent;
|
|
||||||
if (c_alloc <= hcfile.c_len) {
|
|
||||||
struct hcent *c_data;
|
|
||||||
c_alloc += HCFILE_ALLOC_SIZE;
|
|
||||||
c_data = (struct hcent*)realloc(hcfile.c_data, c_alloc * sizeof(struct hcent));
|
|
||||||
if (!c_data) {
|
|
||||||
goto oom;
|
|
||||||
}
|
|
||||||
hcfile.c_data = c_data;
|
|
||||||
}
|
|
||||||
ent = hcfile.c_data + hcfile.c_len;
|
|
||||||
ent->addr = addr - h_addr;
|
|
||||||
ent->name = name - h_addr;
|
|
||||||
++hcfile.c_len;
|
|
||||||
}
|
|
||||||
name += len;
|
|
||||||
while (name < eol && isspace(*name))
|
|
||||||
++name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qsort(hcfile.c_data, hcfile.c_len,
|
|
||||||
sizeof(struct hcent), cmp_hcent_name);
|
|
||||||
|
|
||||||
flock(h_fd, LOCK_UN);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
oom:
|
|
||||||
free(hcfile.c_data);
|
|
||||||
munmap(hcfile.h_data, hcfile.h_st.st_size);
|
|
||||||
flock(hcfile.h_fd, LOCK_UN);
|
|
||||||
close(hcfile.h_fd);
|
|
||||||
memset(&hcfile, 0, sizeof(struct hcfile));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Caching version of getaddrinfo.
|
|
||||||
*
|
|
||||||
* If we find the requested host name in the cache, use getaddrinfo to
|
|
||||||
* populate the result for each address we find.
|
|
||||||
*
|
|
||||||
* Note glibc and bionic differ in the handling of ai_canonname. POSIX
|
|
||||||
* says that ai_canonname is only populated in the first result entry.
|
|
||||||
* glibc does this. bionic populates ai_canonname in all result entries.
|
|
||||||
* We choose the POSIX/glibc way here.
|
|
||||||
*/
|
|
||||||
int hc_getaddrinfo(const char *name, const struct addrinfo* hints, struct addrinfo** result)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
struct hcent *ent, *cur;
|
|
||||||
struct addrinfo *ai;
|
|
||||||
struct addrinfo rhints;
|
|
||||||
struct addrinfo *last;
|
|
||||||
int canonname = 0;
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
if (getenv("ANDROID_HOSTS_CACHE_DISABLE") != NULL)
|
|
||||||
return EAI_SYSTEM;
|
|
||||||
|
|
||||||
if (!name)
|
|
||||||
return EAI_SYSTEM;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&hclock);
|
|
||||||
|
|
||||||
if (_hcfilemmap() != 0) {
|
|
||||||
ret = EAI_SYSTEM;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ent = _hcfindname(name);
|
|
||||||
if (!ent) {
|
|
||||||
ret = EAI_NONAME;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hints) {
|
|
||||||
canonname = (hints->ai_flags & AI_CANONNAME);
|
|
||||||
memcpy(&rhints, hints, sizeof(rhints));
|
|
||||||
rhints.ai_flags &= ~AI_CANONNAME;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memset(&rhints, 0, sizeof(rhints));
|
|
||||||
}
|
|
||||||
rhints.ai_flags |= AI_NUMERICHOST;
|
|
||||||
|
|
||||||
last = NULL;
|
|
||||||
cur = ent;
|
|
||||||
do {
|
|
||||||
char addrstr[MAX_ADDRLEN];
|
|
||||||
struct addrinfo *res;
|
|
||||||
|
|
||||||
hstrcpy(addrstr, hcfile.h_data + cur->addr);
|
|
||||||
|
|
||||||
if (getaddrinfo_numeric(addrstr, nullptr, rhints, &res) == 0) {
|
|
||||||
if (!last)
|
|
||||||
(*result)->ai_next = res;
|
|
||||||
else
|
|
||||||
last->ai_next = res;
|
|
||||||
last = res;
|
|
||||||
while (last->ai_next)
|
|
||||||
last = last->ai_next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cur + 1 >= hcfile.c_data + hcfile.c_len)
|
|
||||||
break;
|
|
||||||
cmp = cmp_hcent_name(cur, cur + 1);
|
|
||||||
cur = cur + 1;
|
|
||||||
}
|
|
||||||
while (!cmp);
|
|
||||||
|
|
||||||
if (last == NULL) {
|
|
||||||
/* This check is equivalent to (*result)->ai_next == NULL */
|
|
||||||
ret = EAI_NODATA;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (canonname) {
|
|
||||||
ai = (*result)->ai_next;
|
|
||||||
free(ai->ai_canonname);
|
|
||||||
ai->ai_canonname = hstrdup(hcfile.h_data + ent->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
pthread_mutex_unlock(&hclock);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Caching version of gethtbyname.
|
|
||||||
*
|
|
||||||
* Note glibc and bionic differ in the handling of aliases. glibc returns
|
|
||||||
* all aliases for all entries, regardless of whether they match h_addrtype.
|
|
||||||
* bionic returns only the aliases for the first hosts entry. We return all
|
|
||||||
* aliases for all IPv4 entries.
|
|
||||||
*
|
|
||||||
* Additionally, if an alias is IPv6 and the primary name for an alias also
|
|
||||||
* has an IPv4 entry, glibc will return the IPv4 address(es), but bionic
|
|
||||||
* will not. Neither do we.
|
|
||||||
*/
|
|
||||||
int hc_gethtbyname(const char *host, int af, struct getnamaddr *info)
|
|
||||||
{
|
|
||||||
int ret = NETDB_SUCCESS;
|
|
||||||
struct hcent *ent, *cur;
|
|
||||||
int cmp;
|
|
||||||
size_t addrlen;
|
|
||||||
unsigned int naliases = 0;
|
|
||||||
char *aliases[MAXALIASES];
|
|
||||||
unsigned int naddrs = 0;
|
|
||||||
char *addr_ptrs[MAXADDRS];
|
|
||||||
unsigned int n;
|
|
||||||
|
|
||||||
if (getenv("ANDROID_HOSTS_CACHE_DISABLE") != NULL)
|
|
||||||
return NETDB_INTERNAL;
|
|
||||||
|
|
||||||
switch (af) {
|
|
||||||
case AF_INET: addrlen = NS_INADDRSZ; break;
|
|
||||||
case AF_INET6: addrlen = NS_IN6ADDRSZ; break;
|
|
||||||
default:
|
|
||||||
return NETDB_INTERNAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_lock(&hclock);
|
|
||||||
|
|
||||||
if (_hcfilemmap() != 0) {
|
|
||||||
ret = NETDB_INTERNAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ent = _hcfindname(host);
|
|
||||||
if (!ent) {
|
|
||||||
ret = HOST_NOT_FOUND;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
cur = ent;
|
|
||||||
do {
|
|
||||||
char addr[16];
|
|
||||||
char addrstr[MAX_ADDRLEN];
|
|
||||||
char namestr[MAX_HOSTLEN];
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
hstrcpy(addrstr, hcfile.h_data + cur->addr);
|
|
||||||
if (inet_pton(af, addrstr, &addr) == 1) {
|
|
||||||
/* char *aligned;
|
|
||||||
First match is considered the official hostname */
|
|
||||||
if (naddrs == 0) {
|
|
||||||
hstrcpy(namestr, hcfile.h_data + cur->name);
|
|
||||||
HENT_SCOPY(info->hp->h_name, namestr, info->buf, info->buflen);
|
|
||||||
}
|
|
||||||
for (name = hcfile.h_data + cur->name; name; name = _hcnextname(name)) {
|
|
||||||
if (!hstrcmp(name, host))
|
|
||||||
continue;
|
|
||||||
hstrcpy(namestr, name);
|
|
||||||
HENT_SCOPY(aliases[naliases], namestr, info->buf, info->buflen);
|
|
||||||
++naliases;
|
|
||||||
if (naliases >= MAXALIASES)
|
|
||||||
goto nospc;
|
|
||||||
}
|
|
||||||
/* aligned = (char *)ALIGN(info->buf);
|
|
||||||
if (info->buf != aligned) {
|
|
||||||
if ((ptrdiff_t)info->buflen < (aligned - info->buf))
|
|
||||||
goto nospc;
|
|
||||||
info->buflen -= (aligned - info->buf);
|
|
||||||
info->buf = aligned;
|
|
||||||
} */
|
|
||||||
HENT_COPY(addr_ptrs[naddrs], addr, addrlen, info->buf, info->buflen);
|
|
||||||
++naddrs;
|
|
||||||
if (naddrs >= MAXADDRS)
|
|
||||||
goto nospc;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cur + 1 >= hcfile.c_data + hcfile.c_len)
|
|
||||||
break;
|
|
||||||
cmp = cmp_hcent_name(cur, cur + 1);
|
|
||||||
cur = cur + 1;
|
|
||||||
}
|
|
||||||
while (!cmp);
|
|
||||||
|
|
||||||
if (naddrs == 0) {
|
|
||||||
ret = HOST_NOT_FOUND;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
addr_ptrs[naddrs++] = NULL;
|
|
||||||
aliases[naliases++] = NULL;
|
|
||||||
|
|
||||||
/* hp->h_name already populated */
|
|
||||||
HENT_ARRAY(info->hp->h_aliases, naliases, info->buf, info->buflen);
|
|
||||||
for (n = 0; n < naliases; ++n) {
|
|
||||||
info->hp->h_aliases[n] = aliases[n];
|
|
||||||
}
|
|
||||||
info->hp->h_addrtype = af;
|
|
||||||
info->hp->h_length = addrlen;
|
|
||||||
HENT_ARRAY(info->hp->h_addr_list, naddrs, info->buf, info->buflen);
|
|
||||||
for (n = 0; n < naddrs; ++n) {
|
|
||||||
info->hp->h_addr_list[n] = addr_ptrs[n];
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
pthread_mutex_unlock(&hclock);
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
nospc:
|
|
||||||
ret = NETDB_INTERNAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
|
@ -1,27 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2020 The LineageOS 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 NETD_RESOLV_HOSTS_CACHE_H
|
|
||||||
#define NETD_RESOLV_HOSTS_CACHE_H
|
|
||||||
|
|
||||||
struct getnamaddr;
|
|
||||||
|
|
||||||
int hc_getaddrinfo(const char* name, const struct addrinfo* hints,
|
|
||||||
struct addrinfo** result);
|
|
||||||
|
|
||||||
int hc_gethtbyname(const char *host, int af, struct getnamaddr *info);
|
|
||||||
|
|
||||||
#endif
|
|
|
@ -1,105 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2022 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
|
|
||||||
*/
|
|
||||||
|
|
||||||
package com.android.settings.security;
|
|
||||||
|
|
||||||
import android.content.Context;
|
|
||||||
|
|
||||||
import android.os.UserHandle;
|
|
||||||
import android.os.UserManager;
|
|
||||||
import android.os.SystemProperties;
|
|
||||||
|
|
||||||
import android.provider.Settings;
|
|
||||||
|
|
||||||
import androidx.preference.Preference;
|
|
||||||
import androidx.preference.PreferenceCategory;
|
|
||||||
import androidx.preference.PreferenceGroup;
|
|
||||||
import androidx.preference.PreferenceScreen;
|
|
||||||
import androidx.preference.TwoStatePreference;
|
|
||||||
import androidx.preference.SwitchPreference;
|
|
||||||
|
|
||||||
import com.android.internal.widget.LockPatternUtils;
|
|
||||||
import com.android.settings.core.PreferenceControllerMixin;
|
|
||||||
import com.android.settingslib.core.AbstractPreferenceController;
|
|
||||||
import com.android.settingslib.core.lifecycle.events.OnResume;
|
|
||||||
|
|
||||||
public class HostsPreferenceController extends AbstractPreferenceController
|
|
||||||
implements PreferenceControllerMixin, OnResume, Preference.OnPreferenceChangeListener {
|
|
||||||
|
|
||||||
private static final String SYS_KEY_HOSTS_DISABLE = "persist.security.hosts_disable";
|
|
||||||
private static final String PREF_KEY_HOSTS_DISABLE = "hosts_disable";
|
|
||||||
private static final String PREF_KEY_SECURITY_CATEGORY = "security_category";
|
|
||||||
|
|
||||||
private PreferenceCategory mSecurityCategory;
|
|
||||||
private SwitchPreference mHostsDisable;
|
|
||||||
private boolean mIsAdmin;
|
|
||||||
private UserManager mUm;
|
|
||||||
|
|
||||||
public HostsPreferenceController(Context context) {
|
|
||||||
super(context);
|
|
||||||
mUm = UserManager.get(context);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void displayPreference(PreferenceScreen screen) {
|
|
||||||
super.displayPreference(screen);
|
|
||||||
mSecurityCategory = screen.findPreference(PREF_KEY_SECURITY_CATEGORY);
|
|
||||||
updatePreferenceState();
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean isAvailable() {
|
|
||||||
mIsAdmin = mUm.isAdminUser();
|
|
||||||
return mIsAdmin;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getPreferenceKey() {
|
|
||||||
return PREF_KEY_HOSTS_DISABLE;
|
|
||||||
}
|
|
||||||
|
|
||||||
// TODO: should we use onCreatePreferences() instead?
|
|
||||||
private void updatePreferenceState() {
|
|
||||||
if (mSecurityCategory == null) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (mIsAdmin) {
|
|
||||||
mHostsDisable = (SwitchPreference) mSecurityCategory.findPreference(PREF_KEY_HOSTS_DISABLE);
|
|
||||||
mHostsDisable.setChecked(SystemProperties.getInt(SYS_KEY_HOSTS_DISABLE, 0) == 1);
|
|
||||||
} else {
|
|
||||||
mSecurityCategory.removePreference(mSecurityCategory.findPreference(PREF_KEY_HOSTS_DISABLE));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onResume() {
|
|
||||||
updatePreferenceState();
|
|
||||||
if (mHostsDisable != null) {
|
|
||||||
boolean mode = mHostsDisable.isChecked();
|
|
||||||
SystemProperties.set(SYS_KEY_HOSTS_DISABLE, mode ? "1" : "0");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@Override
|
|
||||||
public boolean onPreferenceChange(Preference preference, Object value) {
|
|
||||||
final String key = preference.getKey();
|
|
||||||
if (PREF_KEY_HOSTS_DISABLE.equals(key)) {
|
|
||||||
final boolean mode = !mHostsDisable.isChecked();
|
|
||||||
SystemProperties.set(SYS_KEY_HOSTS_DISABLE, mode ? "1" : "0");
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
24
LeOS/a64N.sh
24
LeOS/a64N.sh
|
@ -1,24 +0,0 @@
|
||||||
START=`date +%s`
|
|
||||||
export RELAX_USES_LIBRARY_CHECK=true
|
|
||||||
export USE_CCACHE=1
|
|
||||||
export CCACHE_SIZE=100G
|
|
||||||
echo "ready to build"
|
|
||||||
|
|
||||||
cp update.sh prebuilts/prebuiltapks/foss_nano
|
|
||||||
cd prebuilts/prebuiltapks/foss_nano
|
|
||||||
bash update.sh
|
|
||||||
cd ../../..
|
|
||||||
|
|
||||||
source build/envsetup.sh
|
|
||||||
export WITHOUT_CHECK_API=true
|
|
||||||
|
|
||||||
lunch lineage_a64_bvN-userdebug
|
|
||||||
|
|
||||||
make installclean
|
|
||||||
make -j4 systemimage
|
|
||||||
make vndk-test-sepolicy
|
|
||||||
cp $OUT/system.img images/LeOS-19.1-VNDK-a64-bvN.img
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
27
LeOS/a64S.sh
27
LeOS/a64S.sh
|
@ -1,27 +0,0 @@
|
||||||
START=`date +%s`
|
|
||||||
export RELAX_USES_LIBRARY_CHECK=true
|
|
||||||
export USE_CCACHE=1
|
|
||||||
export CCACHE_SIZE=100G
|
|
||||||
echo "ready to build"
|
|
||||||
|
|
||||||
cp updateS.sh prebuilts/prebuiltapks/foss_nano
|
|
||||||
cd prebuilts/prebuiltapks/foss_nano
|
|
||||||
bash updateS.sh
|
|
||||||
cd ../../..
|
|
||||||
|
|
||||||
source build/envsetup.sh
|
|
||||||
export WITHOUT_CHECK_API=true
|
|
||||||
export WITH_SU=true
|
|
||||||
|
|
||||||
lunch lineage_a64_bvS-userdebug
|
|
||||||
|
|
||||||
make installclean
|
|
||||||
make -j4 systemimage
|
|
||||||
make vndk-test-sepolicy
|
|
||||||
|
|
||||||
############# sas-creator call ##############
|
|
||||||
cd sas-creator/
|
|
||||||
sudo bash lite-adapterSa64.sh 32 system.img
|
|
||||||
######################################
|
|
||||||
|
|
||||||
|
|
|
@ -1,6 +0,0 @@
|
||||||
|
|
||||||
echo 'Start building'
|
|
||||||
bash arm64S.sh
|
|
||||||
bash a64S.sh
|
|
||||||
bash arm64N.sh
|
|
||||||
bash a64.sh
|
|
|
@ -1,24 +0,0 @@
|
||||||
START=`date +%s`
|
|
||||||
export RELAX_USES_LIBRARY_CHECK=true
|
|
||||||
export USE_CCACHE=1
|
|
||||||
export CCACHE_SIZE=50G
|
|
||||||
echo "ready to build"
|
|
||||||
|
|
||||||
cp update.sh prebuilts/prebuiltapks/foss_nano
|
|
||||||
cd prebuilts/prebuiltapks/foss_nano
|
|
||||||
bash update.sh
|
|
||||||
cd ../../..
|
|
||||||
|
|
||||||
|
|
||||||
source build/envsetup.sh
|
|
||||||
export WITHOUT_CHECK_API=true
|
|
||||||
|
|
||||||
lunch lineage_arm64_bvN-userdebug
|
|
||||||
|
|
||||||
make installclean
|
|
||||||
make -j4 systemimage
|
|
||||||
make vndk-test-sepolicy
|
|
||||||
cp $OUT/system.img images/LeOS-19.1-VNDK-arm64-bvN.img
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,27 +0,0 @@
|
||||||
START=`date +%s`
|
|
||||||
export RELAX_USES_LIBRARY_CHECK=true
|
|
||||||
export USE_CCACHE=1
|
|
||||||
export CCACHE_SIZE=100G
|
|
||||||
echo "ready to build"
|
|
||||||
|
|
||||||
cp updateS.sh prebuilts/prebuiltapks/foss_nano
|
|
||||||
cd prebuilts/prebuiltapks/foss_nano
|
|
||||||
bash updateS.sh
|
|
||||||
cd ../../..
|
|
||||||
|
|
||||||
source build/envsetup.sh
|
|
||||||
export WITHOUT_CHECK_API=true
|
|
||||||
export WITH_SU=true
|
|
||||||
|
|
||||||
lunch lineage_arm64_bvS-userdebug
|
|
||||||
|
|
||||||
make installclean
|
|
||||||
make -j4 systemimage
|
|
||||||
make vndk-test-sepolicy
|
|
||||||
|
|
||||||
############# sas-creator call ##############
|
|
||||||
cd sas-creator
|
|
||||||
sudo bash lite-adapterS.sh 64 system.img
|
|
||||||
######################################
|
|
||||||
|
|
||||||
|
|
150
LeOS/build-u.sh
150
LeOS/build-u.sh
|
@ -1,5 +1,7 @@
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
|
MONTH="date +%B"
|
||||||
|
|
||||||
echo
|
echo
|
||||||
echo "--------------------------------------"
|
echo "--------------------------------------"
|
||||||
echo " LeOS-U Buildbot "
|
echo " LeOS-U Buildbot "
|
||||||
|
@ -8,10 +10,10 @@ echo " harvey186 "
|
||||||
echo "--------------------------------------"
|
echo "--------------------------------------"
|
||||||
echo
|
echo
|
||||||
|
|
||||||
git clone http://62.178.96.192:3000/JoJo/LeOS-GSI.git -b LeOS-U
|
|
||||||
cd LeOS-GSI
|
|
||||||
git clone https://github.com/ponces/treble_aosp -b android-14.0
|
git clone https://github.com/ponces/treble_aosp -b android-14.0
|
||||||
|
|
||||||
|
git clone https://github.com/ponces/vendor_ponces.git -b android-14.0 vendor/ponces
|
||||||
|
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
initRepos() {
|
initRepos() {
|
||||||
|
@ -21,6 +23,7 @@ initRepos() {
|
||||||
echo
|
echo
|
||||||
echo "--> Preparing local manifest"
|
echo "--> Preparing local manifest"
|
||||||
mkdir -p .repo/local_manifests
|
mkdir -p .repo/local_manifests
|
||||||
|
cp treble_aosp/build/manifest.xml .repo/local_manifests/aosp.xml
|
||||||
cp LeOS/leos.xml .repo/local_manifests/leos.xml
|
cp LeOS/leos.xml .repo/local_manifests/leos.xml
|
||||||
cp LeOS/removeAOSP.xml .repo/local_manifests/remove.xml
|
cp LeOS/removeAOSP.xml .repo/local_manifests/remove.xml
|
||||||
echo
|
echo
|
||||||
|
@ -33,5 +36,148 @@ syncRepos() {
|
||||||
echo
|
echo
|
||||||
}
|
}
|
||||||
|
|
||||||
|
applyPatches() {
|
||||||
|
echo "--> Applying TrebleDroid patches"
|
||||||
|
bash treble_aosp/patch.sh treble_aosp trebledroid
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "--> Applying ponces personal patches"
|
||||||
|
rm treble_aosp/patches/personal/platform_frameworks_base/0001-gmscompat-Change-attestation-and-instrumentation-to-.patch
|
||||||
|
rm treble_aosp/patches/personal/platform_frameworks_base/0002-gmscompat-Spoof-Pixel-XL-for-Google-Photos.patch
|
||||||
|
rm treble_aosp/patches/personal/platform_frameworks_base/0007-permissions-Pre-grant-google-restore-permissions.patch
|
||||||
|
rm -R treble_aosp/patches/personal/platform_frameworks_base/0008-feat-Add-Lockscreen-Weather-with-OmniJaws-1-2.patch
|
||||||
|
rm -R treble_aosp/patches/personal/platform_packages_apps_Settings/0001-feat-Add-Lockscreen-Weather-with-OmniJaws-2-2.patch
|
||||||
|
rm treble_aosp/patches/personal/platform_build/0001-Remove-su-from-vanilla-builds.patch
|
||||||
|
bash treble_aosp/patch.sh treble_aosp personal
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "--> Applying LeOS patches"
|
||||||
|
mv patches/leos treble_aosp/patches/leos
|
||||||
|
bash treble_aosp/patch.sh treble_aosp leos
|
||||||
|
cp LeOS/instrumentation_test_list.mk plattform_testing/build/tasks/tests/
|
||||||
|
cp LeOS/platform_test_list.mk plattform_testing/build/tasks/tests/
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "--> Generating makefiles"
|
||||||
|
cd device/phh/treble
|
||||||
|
cp treble_aosp/build/aosp.mk device/phh/treble/
|
||||||
|
bash generate.sh aosp
|
||||||
|
cd ../../..
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
setupEnv() {
|
||||||
|
echo "--> Setting up build environment"
|
||||||
|
source build/envsetup.sh &>/dev/null
|
||||||
|
mkdir -p $BD
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
buildTrebleApp() {
|
||||||
|
echo "--> Building treble_app"
|
||||||
|
cd treble_app
|
||||||
|
bash build.sh release
|
||||||
|
cp TrebleApp.apk ../vendor/hardware_overlay/TrebleApp/app.apk
|
||||||
|
cd ..
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
buildVanillaVariant() {
|
||||||
|
echo "--> Building treble_arm64_bvS"
|
||||||
|
export WITHOUT_CHECK_API=true
|
||||||
|
export USE_CCACHE=1
|
||||||
|
export CCACHE_SIZE=50G
|
||||||
|
export WITH_SU=true
|
||||||
|
lunch leos_arm64_bvS-userdebug
|
||||||
|
#make installclean
|
||||||
|
make -j12 RELAX_USES_LIBRARY_CHECK=true systemimage
|
||||||
|
echo
|
||||||
|
echo "--> Building treble_a64_bvS"
|
||||||
|
export WITHOUT_CHECK_API=true
|
||||||
|
export USE_CCACHE=1
|
||||||
|
export CCACHE_SIZE=50G
|
||||||
|
export WITH_SU=true
|
||||||
|
lunch leos_a64_bvS-userdebug
|
||||||
|
#make installclean
|
||||||
|
make -j12 RELAX_USES_LIBRARY_CHECK=true systemimage
|
||||||
|
|
||||||
|
echo "--> Building LeOS-U-VNDKLITE-arm64-bvS.img"
|
||||||
|
cd treble_adapter
|
||||||
|
sudo bash lite-adapter.sh 64 ../out/target/product/leos_arm64_ab/system.img
|
||||||
|
mv s.img LeOS-U-VNDKLITE-arm64-bvS.img
|
||||||
|
sudo rm -rf d tmp
|
||||||
|
|
||||||
|
echo "--> Building LeOS-U-VNDKLITE-arm64-bvN"
|
||||||
|
sudo bash lite-adapterN.sh 64 ../out/target/product/leos_arm64_ab/system.img
|
||||||
|
mv s.img LeOS-U-VNDKLITE-arm64-bvN.img
|
||||||
|
sudo rm -rf d tmp
|
||||||
|
cd ..
|
||||||
|
echo
|
||||||
|
|
||||||
|
echo "--> Building LeOS-U-VNDKLITE-a64-bvS.img"
|
||||||
|
cd treble_adapter
|
||||||
|
sudo bash lite-adapterSa64.sh 32 ../out/target/product/leos_a64_ab/system.img
|
||||||
|
mv s.img LeOS-U-VNDKLITE-a64-bvS.img
|
||||||
|
sudo rm -rf d tmp
|
||||||
|
|
||||||
|
echo "--> Building LeOS-U-VNDKLITE-a64-bvN"
|
||||||
|
sudo bash lite-adapterNa64.sh 32 ../out/target/product/leos_a64_ab/system.img
|
||||||
|
mv s.img LeOS-U-VNDKLITE-a64-bvN.img
|
||||||
|
sudo rm -rf d tmp
|
||||||
|
cd ..
|
||||||
|
echo
|
||||||
|
|
||||||
|
|
||||||
|
cd prebuilts/prebuiltapks/foss_nano/
|
||||||
|
bash update.sh
|
||||||
|
cd ../../..
|
||||||
|
|
||||||
|
echo "--> Building treble_arm64_bvN"
|
||||||
|
export WITHOUT_CHECK_API=true
|
||||||
|
export USE_CCACHE=1
|
||||||
|
export CCACHE_SIZE=50G
|
||||||
|
export WITH_SU=true
|
||||||
|
lunch leos_arm64_bvN-userdebug
|
||||||
|
#make installclean
|
||||||
|
make -j12 RELAX_USES_LIBRARY_CHECK=true systemimage
|
||||||
|
echo
|
||||||
|
echo "--> Building treble_a64_bvN"
|
||||||
|
export WITHOUT_CHECK_API=true
|
||||||
|
export USE_CCACHE=1
|
||||||
|
export CCACHE_SIZE=50G
|
||||||
|
export WITH_SU=true
|
||||||
|
lunch leos_a64_bvN-userdebug
|
||||||
|
#make installclean
|
||||||
|
make -j12 RELAX_USES_LIBRARY_CHECK=true systemimage
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
generatePackages() {
|
||||||
|
echo "--> Generating packages"
|
||||||
|
cp out/target/product/leos_arm64_ab/system.img treble_adapter/LeOS-U-VNDK-arm64_bvN.img
|
||||||
|
cp out/target/product/leos_a64_ab/system.img treble_adapter/LeOS-U-VNDK-a64-bvN.img
|
||||||
|
cd treble_adapter
|
||||||
|
xz -vT0 *.img
|
||||||
|
cp *.img.xz /media/ich/exSSD2/leos-cloud/LeOS-Files/LeOS-U/$MONTH/
|
||||||
|
echo
|
||||||
|
}
|
||||||
|
|
||||||
|
echo "READY"
|
||||||
|
|
||||||
|
|
||||||
|
START=$(date +%s)
|
||||||
|
|
||||||
|
initRepos
|
||||||
|
syncRepos
|
||||||
|
applyPatches
|
||||||
|
setupEnv
|
||||||
|
buildTrebleApp
|
||||||
|
buildVanillaVariant
|
||||||
|
generatePackages
|
||||||
|
|
||||||
|
END=$(date +%s)
|
||||||
|
ELAPSEDM=$(($(($END-$START))/60))
|
||||||
|
ELAPSEDS=$(($(($END-$START))-$ELAPSEDM*60))
|
||||||
|
|
||||||
|
echo "--> Buildbot completed in $ELAPSEDM minutes and $ELAPSEDS seconds"
|
||||||
|
echo
|
||||||
|
|
141
LeOS/build.sh
141
LeOS/build.sh
|
@ -1,141 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
git clone https://github.com/AndyCGYan/lineage_build_unified lineage_build_unified -b lineage-19.1
|
|
||||||
git clone https://github.com/AndyCGYan/lineage_patches_unified lineage_patches_unified -b lineage-19.1
|
|
||||||
|
|
||||||
echo 'patch build bot and run it'
|
|
||||||
cp LeOS/bot.patch lineage_build_unified/
|
|
||||||
cd lineage_build_unified
|
|
||||||
git apply bot.patch
|
|
||||||
cd ..
|
|
||||||
bash lineage_build_unified/buildbot_unified.sh treble 64B
|
|
||||||
|
|
||||||
mkdir images
|
|
||||||
|
|
||||||
echo 'Bootanimation'
|
|
||||||
cp LeOS/android-logo-mask1a.png frameworks/base/core/res/assets/images/android-logo-mask.png
|
|
||||||
cp LeOS/android-logo-shine.png frameworks/base/core/res/assets/images/android-logo-shine.png
|
|
||||||
rm device/phh/treble/bootanimation.zip
|
|
||||||
rm -R vendor/lineage/bootanimation/
|
|
||||||
rm device/phh/treble/phh.mk
|
|
||||||
|
|
||||||
|
|
||||||
echo 'background'
|
|
||||||
cp LeOS/default_wallpaper.png frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.png
|
|
||||||
cp LeOS/default_wallpaper.png frameworks/base/core/res/res/drawable-sw600dp-nodpi/default_wallpaper.png
|
|
||||||
cp LeOS/default_wallpaper.png frameworks/base/core/res/res/drawable-sw720dp-nodpi/default_wallpaper.png
|
|
||||||
cp LeOS/default_wallpaper.png frameworks/base/tests/HwAccelerationTest/res/drawable/default_wallpaper.png
|
|
||||||
rm -R vendor/lineage/overlay/common/frameworks/base/core/res/res/drawable*
|
|
||||||
|
|
||||||
echo 'Fonts'
|
|
||||||
cp LeOS/Roboto-Regular.ttf external/roboto-fonts/
|
|
||||||
cp LeOS/RobotoStatic-Regular.ttf external/roboto-fonts/
|
|
||||||
|
|
||||||
echo 'EasterEgg'
|
|
||||||
rm -R frameworks/base/packages/EasterEgg
|
|
||||||
|
|
||||||
echo 'remove apps'
|
|
||||||
rm -R packages/apps/AudioFX
|
|
||||||
rm -R packages/apps/Eleven
|
|
||||||
rm -R packages/apps/Camera2
|
|
||||||
rm -R packages/apps/Contacts
|
|
||||||
rm -R packages/apps/DeskClock
|
|
||||||
rm -R packages/apps/Etar
|
|
||||||
rm -R packages/apps/Dialer
|
|
||||||
rm -R packages/apps/ExactCalculator
|
|
||||||
rm -R packages/apps/Gallery2
|
|
||||||
rm -R packages/apps/FlipFlap
|
|
||||||
rm -R packages/apps/Messaging
|
|
||||||
rm -R packages/apps/Jelly
|
|
||||||
rm -R vendor/partner_gms/
|
|
||||||
rm -R packages/apps/UniversalMediaPlayer
|
|
||||||
rm -R packages/apps/HTMLViewer
|
|
||||||
rm -R packages/apps/Recorder
|
|
||||||
rm -R packages/apps/ImsServiceEntitlement/src/com/android/imsserviceentitlement/fcm
|
|
||||||
|
|
||||||
echo 'LeOS apps'
|
|
||||||
tar -xf LeOS/prebuiltapks.tar.xz -C prebuilts/
|
|
||||||
|
|
||||||
echo 'webview'
|
|
||||||
tar -xf LeOS/bromite-webview.tar.xz -C external
|
|
||||||
cd external/bromite-webview
|
|
||||||
bash update.sh
|
|
||||||
cd ../..
|
|
||||||
|
|
||||||
echo 'a-gps'
|
|
||||||
cd vendor/hardware_overlay
|
|
||||||
grep -RiIl 'supl.three.com' | xargs sed -i 's/supl.three.com/supl.three.com/g'
|
|
||||||
cd ../..
|
|
||||||
|
|
||||||
echo 'hosts'
|
|
||||||
cp LeOS/hosts system/core/rootdir/etc/
|
|
||||||
|
|
||||||
echo 'firebase mods'
|
|
||||||
cp LeOS/firebase-messaging-21.0.1.aar external/firebase-messaging/libs/
|
|
||||||
cp LeOS/play-services-cloud-messaging-16.0.0.aar external/firebase-messaging/libs/
|
|
||||||
|
|
||||||
echo 'overlays'
|
|
||||||
tar -xf LeOS/overlay.tar.xz -C vendor
|
|
||||||
cp LeOS/vendor_hardware-overlay.patch vendor/hardware_overlay
|
|
||||||
cd vendor/hardware_overlay
|
|
||||||
git apply *.patch
|
|
||||||
cd ../..
|
|
||||||
|
|
||||||
echo 'encoder'
|
|
||||||
mkdir vendor/LeOS
|
|
||||||
tar -xf LeOS/encoder.tar.xz -C vendor/LeOS
|
|
||||||
|
|
||||||
echo 'sas-creator'
|
|
||||||
tar -xf LeOS/sas-creator.tar.xz -C .
|
|
||||||
|
|
||||||
echo 'scripts'
|
|
||||||
tar -xf LeOS/scripts.tar.xz -C .
|
|
||||||
cp LeOS/leos.mk device/phh/treble
|
|
||||||
|
|
||||||
cp LeOS/leos.mk device/phh/treble
|
|
||||||
|
|
||||||
echo 'Patches'
|
|
||||||
tar -xf LeOS/patches.tar.xz
|
|
||||||
bash patches/apply.sh leos
|
|
||||||
|
|
||||||
cp LeOS/platform_testing.patch platform_testing/
|
|
||||||
cd platform_testing/
|
|
||||||
git apply *.patch
|
|
||||||
cd ..
|
|
||||||
|
|
||||||
echo 'generate Scripts'
|
|
||||||
cd device/phh/treble
|
|
||||||
bash generate.sh lineage
|
|
||||||
cd ../../../
|
|
||||||
|
|
||||||
echo 'Texte'
|
|
||||||
cp LeOS/texte.sh .
|
|
||||||
bash texte.sh
|
|
||||||
rm texte.sh
|
|
||||||
|
|
||||||
export RELAX_USES_LIBRARY_CHECK=true
|
|
||||||
|
|
||||||
bash arm64S.sh
|
|
||||||
|
|
||||||
mv sas-creator/*.img images
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -1,547 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2016 The CyanogenMod 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 <fcntl.h>
|
|
||||||
#include <netdb.h>
|
|
||||||
#include <stdio.h>
|
|
||||||
#include <stdlib.h>
|
|
||||||
#include <string.h>
|
|
||||||
#include <ctype.h>
|
|
||||||
#include <strings.h>
|
|
||||||
#include <sys/file.h>
|
|
||||||
#include <sys/mman.h>
|
|
||||||
#include <sys/socket.h>
|
|
||||||
#include <sys/stat.h>
|
|
||||||
#include <sys/types.h>
|
|
||||||
#include <unistd.h>
|
|
||||||
#include <utime.h>
|
|
||||||
#include <pthread.h>
|
|
||||||
|
|
||||||
#include <netinet/in6.h>
|
|
||||||
#include <arpa/inet.h>
|
|
||||||
|
|
||||||
#include "hostent.h"
|
|
||||||
#include "resolv_private.h"
|
|
||||||
|
|
||||||
#define MAX_ADDRLEN (INET6_ADDRSTRLEN - (1 + 5))
|
|
||||||
#define MAX_HOSTLEN MAXHOSTNAMELEN
|
|
||||||
|
|
||||||
#define ESTIMATED_LINELEN 32
|
|
||||||
#define HCFILE_ALLOC_SIZE 256
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Host cache entry for hcfile.c_data.
|
|
||||||
* Offsets are into hcfile.h_data.
|
|
||||||
* Strings are *not* terminated by NULL, but by whitespace (isspace) or '#'.
|
|
||||||
* Use hstr* functions with these.
|
|
||||||
*/
|
|
||||||
struct hcent
|
|
||||||
{
|
|
||||||
uint32_t addr;
|
|
||||||
uint32_t name;
|
|
||||||
};
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Overall host cache file state.
|
|
||||||
*/
|
|
||||||
struct hcfile
|
|
||||||
{
|
|
||||||
int h_fd;
|
|
||||||
struct stat h_st;
|
|
||||||
char *h_data;
|
|
||||||
|
|
||||||
uint32_t c_alloc;
|
|
||||||
uint32_t c_len;
|
|
||||||
struct hcent *c_data;
|
|
||||||
};
|
|
||||||
static struct hcfile hcfile;
|
|
||||||
static pthread_mutex_t hclock = PTHREAD_MUTEX_INITIALIZER;
|
|
||||||
|
|
||||||
static size_t hstrlen(const char *s)
|
|
||||||
{
|
|
||||||
const char *p = s;
|
|
||||||
while (*p && *p != '#' && !isspace(*p))
|
|
||||||
++p;
|
|
||||||
return p - s;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int hstrcmp(const char *a, const char *b)
|
|
||||||
{
|
|
||||||
size_t alen = hstrlen(a);
|
|
||||||
size_t blen = hstrlen(b);
|
|
||||||
int res = strncmp(a, b, MIN(alen, blen));
|
|
||||||
if (res == 0)
|
|
||||||
res = alen - blen;
|
|
||||||
return res;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *hstrcpy(char *dest, const char *src)
|
|
||||||
{
|
|
||||||
size_t len = hstrlen(src);
|
|
||||||
memcpy(dest, src, len);
|
|
||||||
dest[len] = '\0';
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
static char *hstrdup(const char *s)
|
|
||||||
{
|
|
||||||
size_t len = hstrlen(s);
|
|
||||||
char *dest = (char *)malloc(len + 1);
|
|
||||||
if (!dest)
|
|
||||||
return NULL;
|
|
||||||
memcpy(dest, s, len);
|
|
||||||
dest[len] = '\0';
|
|
||||||
return dest;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int cmp_hcent_name(const void *a, const void *b)
|
|
||||||
{
|
|
||||||
struct hcent *ea = (struct hcent *)a;
|
|
||||||
const char *na = hcfile.h_data + ea->name;
|
|
||||||
struct hcent *eb = (struct hcent *)b;
|
|
||||||
const char *nb = hcfile.h_data + eb->name;
|
|
||||||
|
|
||||||
return hstrcmp(na, nb);
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct hcent *_hcfindname_exact(const char *name)
|
|
||||||
{
|
|
||||||
size_t first, last, mid;
|
|
||||||
struct hcent *cur = NULL;
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
if (hcfile.c_len == 0)
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
first = 0;
|
|
||||||
last = hcfile.c_len - 1;
|
|
||||||
mid = (first + last) / 2;
|
|
||||||
while (first <= last) {
|
|
||||||
cur = hcfile.c_data + mid;
|
|
||||||
cmp = hstrcmp(hcfile.h_data + cur->name, name);
|
|
||||||
if (cmp == 0)
|
|
||||||
goto found;
|
|
||||||
if (cmp < 0)
|
|
||||||
first = mid + 1;
|
|
||||||
else {
|
|
||||||
if (mid > 0)
|
|
||||||
last = mid - 1;
|
|
||||||
else
|
|
||||||
return NULL;
|
|
||||||
}
|
|
||||||
mid = (first + last) / 2;
|
|
||||||
}
|
|
||||||
return NULL;
|
|
||||||
|
|
||||||
found:
|
|
||||||
while (cur > hcfile.c_data) {
|
|
||||||
struct hcent *prev = cur - 1;
|
|
||||||
cmp = cmp_hcent_name(cur, prev);
|
|
||||||
if (cmp)
|
|
||||||
break;
|
|
||||||
cur = prev;
|
|
||||||
}
|
|
||||||
|
|
||||||
return cur;
|
|
||||||
}
|
|
||||||
|
|
||||||
static struct hcent *_hcfindname(const char *name)
|
|
||||||
{
|
|
||||||
struct hcent *ent;
|
|
||||||
char namebuf[MAX_HOSTLEN];
|
|
||||||
char *p;
|
|
||||||
char *dot;
|
|
||||||
|
|
||||||
ent = _hcfindname_exact(name);
|
|
||||||
if (!ent && strlen(name) < sizeof(namebuf)) {
|
|
||||||
strcpy(namebuf, name);
|
|
||||||
p = namebuf;
|
|
||||||
do {
|
|
||||||
dot = strchr(p, '.');
|
|
||||||
if (!dot)
|
|
||||||
break;
|
|
||||||
if (dot > p) {
|
|
||||||
*(dot - 1) = '*';
|
|
||||||
ent = _hcfindname_exact(dot - 1);
|
|
||||||
}
|
|
||||||
p = dot + 1;
|
|
||||||
}
|
|
||||||
while (!ent);
|
|
||||||
}
|
|
||||||
|
|
||||||
return ent;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Find next name on line, if any.
|
|
||||||
*
|
|
||||||
* Assumes that line is terminated by LF.
|
|
||||||
*/
|
|
||||||
static const char *_hcnextname(const char *name)
|
|
||||||
{
|
|
||||||
while (!isspace(*name)) {
|
|
||||||
if (*name == '#')
|
|
||||||
return NULL;
|
|
||||||
++name;
|
|
||||||
}
|
|
||||||
while (isspace(*name)) {
|
|
||||||
if (*name == '\n')
|
|
||||||
return NULL;
|
|
||||||
++name;
|
|
||||||
}
|
|
||||||
if (*name == '#')
|
|
||||||
return NULL;
|
|
||||||
return name;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int _hcfilemmap(void)
|
|
||||||
{
|
|
||||||
struct stat st;
|
|
||||||
int h_fd;
|
|
||||||
char *h_addr;
|
|
||||||
const char *p, *pend;
|
|
||||||
uint32_t c_alloc;
|
|
||||||
|
|
||||||
h_fd = open(_PATH_HOSTS, O_RDONLY);
|
|
||||||
if (h_fd < 0)
|
|
||||||
return -1;
|
|
||||||
if (flock(h_fd, LOCK_EX) != 0) {
|
|
||||||
close(h_fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hcfile.h_data) {
|
|
||||||
memset(&st, 0, sizeof(st));
|
|
||||||
if (fstat(h_fd, &st) == 0) {
|
|
||||||
if (st.st_size == hcfile.h_st.st_size &&
|
|
||||||
st.st_mtime == hcfile.h_st.st_mtime) {
|
|
||||||
flock(h_fd, LOCK_UN);
|
|
||||||
close(h_fd);
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
free(hcfile.c_data);
|
|
||||||
munmap(hcfile.h_data, hcfile.h_st.st_size);
|
|
||||||
close(hcfile.h_fd);
|
|
||||||
memset(&hcfile, 0, sizeof(struct hcfile));
|
|
||||||
}
|
|
||||||
|
|
||||||
if (fstat(h_fd, &st) != 0) {
|
|
||||||
flock(h_fd, LOCK_UN);
|
|
||||||
close(h_fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
h_addr = mmap(NULL, st.st_size, PROT_READ, MAP_SHARED, h_fd, 0);
|
|
||||||
if (h_addr == MAP_FAILED) {
|
|
||||||
flock(h_fd, LOCK_UN);
|
|
||||||
close(h_fd);
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
hcfile.h_fd = h_fd;
|
|
||||||
hcfile.h_st = st;
|
|
||||||
hcfile.h_data = h_addr;
|
|
||||||
|
|
||||||
c_alloc = 0;
|
|
||||||
/*
|
|
||||||
* Do an initial allocation if the file is "large". Estimate
|
|
||||||
* 32 bytes per line and define "large" as more than half of
|
|
||||||
* the alloc growth size (256 entries).
|
|
||||||
*/
|
|
||||||
if (st.st_size >= ESTIMATED_LINELEN * HCFILE_ALLOC_SIZE / 2) {
|
|
||||||
c_alloc = st.st_size / ESTIMATED_LINELEN;
|
|
||||||
hcfile.c_data = malloc(c_alloc * sizeof(struct hcent));
|
|
||||||
if (!hcfile.c_data) {
|
|
||||||
goto oom;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
p = (const char *)h_addr;
|
|
||||||
pend = p + st.st_size;
|
|
||||||
while (p < pend) {
|
|
||||||
const char *eol, *addr, *name;
|
|
||||||
size_t len;
|
|
||||||
addr = p;
|
|
||||||
eol = memchr(p, '\n', pend - p);
|
|
||||||
if (!eol)
|
|
||||||
break;
|
|
||||||
p = eol + 1;
|
|
||||||
if (*addr == '#' || *addr == '\n')
|
|
||||||
continue;
|
|
||||||
len = hstrlen(addr);
|
|
||||||
if (len > MAX_ADDRLEN)
|
|
||||||
continue;
|
|
||||||
name = addr + len;
|
|
||||||
while (name < eol && isspace(*name))
|
|
||||||
++name;
|
|
||||||
while (name < eol) {
|
|
||||||
len = hstrlen(name);
|
|
||||||
if (len == 0)
|
|
||||||
break;
|
|
||||||
if (len < MAX_HOSTLEN) {
|
|
||||||
struct hcent *ent;
|
|
||||||
if (c_alloc <= hcfile.c_len) {
|
|
||||||
struct hcent *c_data;
|
|
||||||
c_alloc += HCFILE_ALLOC_SIZE;
|
|
||||||
c_data = realloc(hcfile.c_data, c_alloc * sizeof(struct hcent));
|
|
||||||
if (!c_data) {
|
|
||||||
goto oom;
|
|
||||||
}
|
|
||||||
hcfile.c_data = c_data;
|
|
||||||
}
|
|
||||||
ent = hcfile.c_data + hcfile.c_len;
|
|
||||||
ent->addr = addr - h_addr;
|
|
||||||
ent->name = name - h_addr;
|
|
||||||
++hcfile.c_len;
|
|
||||||
}
|
|
||||||
name += len;
|
|
||||||
while (name < eol && isspace(*name))
|
|
||||||
++name;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
qsort(hcfile.c_data, hcfile.c_len,
|
|
||||||
sizeof(struct hcent), cmp_hcent_name);
|
|
||||||
|
|
||||||
flock(h_fd, LOCK_UN);
|
|
||||||
|
|
||||||
return 0;
|
|
||||||
|
|
||||||
oom:
|
|
||||||
free(hcfile.c_data);
|
|
||||||
munmap(hcfile.h_data, hcfile.h_st.st_size);
|
|
||||||
flock(hcfile.h_fd, LOCK_UN);
|
|
||||||
close(hcfile.h_fd);
|
|
||||||
memset(&hcfile, 0, sizeof(struct hcfile));
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Caching version of getaddrinfo.
|
|
||||||
*
|
|
||||||
* If we find the requested host name in the cache, use getaddrinfo to
|
|
||||||
* populate the result for each address we find.
|
|
||||||
*
|
|
||||||
* Note glibc and bionic differ in the handling of ai_canonname. POSIX
|
|
||||||
* says that ai_canonname is only populated in the first result entry.
|
|
||||||
* glibc does this. bionic populates ai_canonname in all result entries.
|
|
||||||
* We choose the POSIX/glibc way here.
|
|
||||||
*/
|
|
||||||
int hc_getaddrinfo(const char *host, const char *service,
|
|
||||||
const struct addrinfo *hints,
|
|
||||||
struct addrinfo **result)
|
|
||||||
{
|
|
||||||
int ret = 0;
|
|
||||||
struct hcent *ent, *cur;
|
|
||||||
struct addrinfo *ai;
|
|
||||||
struct addrinfo rhints;
|
|
||||||
struct addrinfo *last;
|
|
||||||
int canonname = 0;
|
|
||||||
int cmp;
|
|
||||||
|
|
||||||
if (getenv("ANDROID_HOSTS_CACHE_DISABLE") != NULL)
|
|
||||||
return EAI_SYSTEM;
|
|
||||||
|
|
||||||
/* Avoid needless work and recursion */
|
|
||||||
if (hints && (hints->ai_flags & AI_NUMERICHOST))
|
|
||||||
return EAI_SYSTEM;
|
|
||||||
if (!host)
|
|
||||||
return EAI_SYSTEM;
|
|
||||||
|
|
||||||
pthread_mutex_lock(&hclock);
|
|
||||||
|
|
||||||
if (_hcfilemmap() != 0) {
|
|
||||||
ret = EAI_SYSTEM;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
ent = _hcfindname(host);
|
|
||||||
if (!ent) {
|
|
||||||
ret = EAI_NONAME;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (hints) {
|
|
||||||
canonname = (hints->ai_flags & AI_CANONNAME);
|
|
||||||
memcpy(&rhints, hints, sizeof(rhints));
|
|
||||||
rhints.ai_flags &= ~AI_CANONNAME;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
memset(&rhints, 0, sizeof(rhints));
|
|
||||||
}
|
|
||||||
rhints.ai_flags |= AI_NUMERICHOST;
|
|
||||||
|
|
||||||
last = NULL;
|
|
||||||
cur = ent;
|
|
||||||
do {
|
|
||||||
char addrstr[MAX_ADDRLEN];
|
|
||||||
struct addrinfo *res;
|
|
||||||
|
|
||||||
hstrcpy(addrstr, hcfile.h_data + cur->addr);
|
|
||||||
|
|
||||||
if (getaddrinfo(addrstr, service, &rhints, &res) == 0) {
|
|
||||||
if (!last)
|
|
||||||
(*result)->ai_next = res;
|
|
||||||
else
|
|
||||||
last->ai_next = res;
|
|
||||||
last = res;
|
|
||||||
while (last->ai_next)
|
|
||||||
last = last->ai_next;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cur + 1 >= hcfile.c_data + hcfile.c_len)
|
|
||||||
break;
|
|
||||||
cmp = cmp_hcent_name(cur, cur + 1);
|
|
||||||
cur = cur + 1;
|
|
||||||
}
|
|
||||||
while (!cmp);
|
|
||||||
|
|
||||||
if (last == NULL) {
|
|
||||||
/* This check is equivalent to (*result)->ai_next == NULL */
|
|
||||||
ret = EAI_NODATA;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (canonname) {
|
|
||||||
ai = (*result)->ai_next;
|
|
||||||
free(ai->ai_canonname);
|
|
||||||
ai->ai_canonname = hstrdup(hcfile.h_data + ent->name);
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
pthread_mutex_unlock(&hclock);
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Caching version of gethtbyname.
|
|
||||||
*
|
|
||||||
* Note glibc and bionic differ in the handling of aliases. glibc returns
|
|
||||||
* all aliases for all entries, regardless of whether they match h_addrtype.
|
|
||||||
* bionic returns only the aliases for the first hosts entry. We return all
|
|
||||||
* aliases for all IPv4 entries.
|
|
||||||
*
|
|
||||||
* Additionally, if an alias is IPv6 and the primary name for an alias also
|
|
||||||
* has an IPv4 entry, glibc will return the IPv4 address(es), but bionic
|
|
||||||
* will not. Neither do we.
|
|
||||||
*/
|
|
||||||
int hc_gethtbyname(const char *host, int af, struct getnamaddr *info)
|
|
||||||
{
|
|
||||||
int ret = NETDB_SUCCESS;
|
|
||||||
struct hcent *ent, *cur;
|
|
||||||
int cmp;
|
|
||||||
size_t addrlen;
|
|
||||||
unsigned int naliases = 0;
|
|
||||||
char *aliases[MAXALIASES];
|
|
||||||
unsigned int naddrs = 0;
|
|
||||||
char *addr_ptrs[MAXADDRS];
|
|
||||||
unsigned int n;
|
|
||||||
|
|
||||||
if (getenv("ANDROID_HOSTS_CACHE_DISABLE") != NULL)
|
|
||||||
return NETDB_INTERNAL;
|
|
||||||
|
|
||||||
switch (af) {
|
|
||||||
case AF_INET: addrlen = NS_INADDRSZ; break;
|
|
||||||
case AF_INET6: addrlen = NS_IN6ADDRSZ; break;
|
|
||||||
default:
|
|
||||||
return NETDB_INTERNAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
pthread_mutex_lock(&hclock);
|
|
||||||
|
|
||||||
if (_hcfilemmap() != 0) {
|
|
||||||
ret = NETDB_INTERNAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
ent = _hcfindname(host);
|
|
||||||
if (!ent) {
|
|
||||||
ret = HOST_NOT_FOUND;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
cur = ent;
|
|
||||||
do {
|
|
||||||
char addr[16];
|
|
||||||
char addrstr[MAX_ADDRLEN];
|
|
||||||
char namestr[MAX_HOSTLEN];
|
|
||||||
const char *name;
|
|
||||||
|
|
||||||
hstrcpy(addrstr, hcfile.h_data + cur->addr);
|
|
||||||
if (inet_pton(af, addrstr, &addr) == 1) {
|
|
||||||
char *aligned;
|
|
||||||
/* First match is considered the official hostname */
|
|
||||||
if (naddrs == 0) {
|
|
||||||
hstrcpy(namestr, hcfile.h_data + cur->name);
|
|
||||||
HENT_SCOPY(info->hp->h_name, namestr, info->buf, info->buflen);
|
|
||||||
}
|
|
||||||
for (name = hcfile.h_data + cur->name; name; name = _hcnextname(name)) {
|
|
||||||
if (!hstrcmp(name, host))
|
|
||||||
continue;
|
|
||||||
hstrcpy(namestr, name);
|
|
||||||
HENT_SCOPY(aliases[naliases], namestr, info->buf, info->buflen);
|
|
||||||
++naliases;
|
|
||||||
if (naliases >= MAXALIASES)
|
|
||||||
goto nospc;
|
|
||||||
}
|
|
||||||
aligned = (char *)ALIGN(info->buf);
|
|
||||||
if (info->buf != aligned) {
|
|
||||||
if ((ptrdiff_t)info->buflen < (aligned - info->buf))
|
|
||||||
goto nospc;
|
|
||||||
info->buflen -= (aligned - info->buf);
|
|
||||||
info->buf = aligned;
|
|
||||||
}
|
|
||||||
HENT_COPY(addr_ptrs[naddrs], addr, addrlen, info->buf, info->buflen);
|
|
||||||
++naddrs;
|
|
||||||
if (naddrs >= MAXADDRS)
|
|
||||||
goto nospc;
|
|
||||||
}
|
|
||||||
|
|
||||||
if(cur + 1 >= hcfile.c_data + hcfile.c_len)
|
|
||||||
break;
|
|
||||||
cmp = cmp_hcent_name(cur, cur + 1);
|
|
||||||
cur = cur + 1;
|
|
||||||
}
|
|
||||||
while (!cmp);
|
|
||||||
|
|
||||||
if (naddrs == 0) {
|
|
||||||
ret = HOST_NOT_FOUND;
|
|
||||||
goto out;
|
|
||||||
}
|
|
||||||
|
|
||||||
addr_ptrs[naddrs++] = NULL;
|
|
||||||
aliases[naliases++] = NULL;
|
|
||||||
|
|
||||||
/* hp->h_name already populated */
|
|
||||||
HENT_ARRAY(info->hp->h_aliases, naliases, info->buf, info->buflen);
|
|
||||||
for (n = 0; n < naliases; ++n) {
|
|
||||||
info->hp->h_aliases[n] = aliases[n];
|
|
||||||
}
|
|
||||||
info->hp->h_addrtype = af;
|
|
||||||
info->hp->h_length = addrlen;
|
|
||||||
HENT_ARRAY(info->hp->h_addr_list, naddrs, info->buf, info->buflen);
|
|
||||||
for (n = 0; n < naddrs; ++n) {
|
|
||||||
info->hp->h_addr_list[n] = addr_ptrs[n];
|
|
||||||
}
|
|
||||||
|
|
||||||
out:
|
|
||||||
pthread_mutex_unlock(&hclock);
|
|
||||||
*info->he = ret;
|
|
||||||
return ret;
|
|
||||||
|
|
||||||
nospc:
|
|
||||||
ret = NETDB_INTERNAL;
|
|
||||||
goto out;
|
|
||||||
}
|
|
|
@ -1,23 +0,0 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2016 The CyanogenMod 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.
|
|
||||||
*/
|
|
||||||
|
|
||||||
struct getnamaddr;
|
|
||||||
|
|
||||||
int hc_getaddrinfo(const char *host, const char *service,
|
|
||||||
const struct addrinfo *hints,
|
|
||||||
struct addrinfo **result);
|
|
||||||
|
|
||||||
int hc_gethtbyname(const char *host, int af, struct getnamaddr *info);
|
|
|
@ -1,28 +0,0 @@
|
||||||
diff --git a/overlay.mk b/overlay.mk
|
|
||||||
index df2d488..f3f3589 100755
|
|
||||||
--- a/overlay.mk
|
|
||||||
+++ b/overlay.mk
|
|
||||||
@@ -21,6 +21,7 @@ PRODUCT_PACKAGES += \
|
|
||||||
treble-overlay-duoqin-qin2pro \
|
|
||||||
treble-overlay-essential-ph_1 \
|
|
||||||
treble-overlay-fairphone-fp3 \
|
|
||||||
+ treble-overlay-fairphone-fp4 \
|
|
||||||
treble-overlay-highpriomisc \
|
|
||||||
treble-overlay-htc-exodus1 \
|
|
||||||
treble-overlay-htc-u12plus \
|
|
||||||
@@ -237,6 +238,7 @@ PRODUCT_PACKAGES += \
|
|
||||||
treble-overlay-tethering-nobpf \
|
|
||||||
treble-overlay-umidigi-A3S \
|
|
||||||
treble-overlay-umidigi-power \
|
|
||||||
+ treble-overlay-umidigi-A5pro \
|
|
||||||
treble-overlay-unihertz-jelly2 \
|
|
||||||
treble-overlay-vivo-y20 \
|
|
||||||
treble-overlay-vivo-y20-systemui \
|
|
||||||
@@ -264,6 +266,7 @@ PRODUCT_PACKAGES += \
|
|
||||||
treble-overlay-xiaomi-mimix3-systemui \
|
|
||||||
treble-overlay-xiaomi-mipad4 \
|
|
||||||
treble-overlay-xiaomi-mipad5pro5g \
|
|
||||||
+ treble-overlay-xiaomi-mipad5 \
|
|
||||||
treble-overlay-xiaomi-miplay \
|
|
||||||
treble-overlay-xiaomi-pocof1 \
|
|
||||||
treble-overlay-xiaomi-pocom3pro5g \
|
|
|
@ -1,15 +0,0 @@
|
||||||
diff --git a/HighPriorityMisc/res/xml/config_webview_packages.xml b/HighPriorityMisc/res/xml/config_webview_packages.xml
|
|
||||||
index 6abcfe2..74ae2ee 100644
|
|
||||||
--- a/HighPriorityMisc/res/xml/config_webview_packages.xml
|
|
||||||
+++ b/HighPriorityMisc/res/xml/config_webview_packages.xml
|
|
||||||
@@ -39,7 +39,6 @@
|
|
||||||
<webviewprovider description="AOSP WebView" packageName="com.android.webview" availableByDefault="true">
|
|
||||||
<!-- Ignore this package on user/release builds unless preinstalled. -->
|
|
||||||
</webviewprovider>
|
|
||||||
- <webviewprovider description="Bromite WebView" packageName="org.bromite.webview" availableByDefault="true">
|
|
||||||
- <signature>MIIDbTCCAlWgAwIBAgIEHcsmjjANBgkqhkiG9w0BAQsFADBmMQswCQYDVQQGEwJERTEQMA4GA1UECBMHVW5rbm93bjEPMA0GA1UEBxMGQmVybGluMRAwDgYDVQQKEwdCcm9taXRlMRAwDgYDVQQLEwdCcm9taXRlMRAwDgYDVQQDEwdjc2FnYW41MCAXDTE4MDExOTA3MjE1N1oYDzIwNjgwMTA3MDcyMTU3WjBmMQswCQYDVQQGEwJERTEQMA4GA1UECBMHVW5rbm93bjEPMA0GA1UEBxMGQmVybGluMRAwDgYDVQQKEwdCcm9taXRlMRAwDgYDVQQLEwdCcm9taXRlMRAwDgYDVQQDEwdjc2FnYW41MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAtakjGj0eTavbBB2vWXj8KBixWn4zgXAKc+yGFu3SLEGF1VB5aJWwcMHxVI55yH/8M2eNnJP0BkSidfKgPVcm1sk/GrNEs9uk5sWod9byO5M5QWQmGP2REeTd6J0BVVVaMp2MZnqeR3Su3pwFzrSwTqIGyf8dkPSEz7ifj792+EeRNrov4oRQK7lIfqInzwc4d34wU069Lrw6m7J7HM0KbRYISsWMiYj025Qg+dTrtdWt7jbdcj7htW0eYyJoLd90+s43RWnOpENmWpcWv1EVPxUD4mCdV9idYwoHRIESpSu9IWvqDZp1VoRc43nLgsNfNBwmYdTkIaPiz1m7TBcr7QIDAQABoyEwHzAdBgNVHQ4EFgQUuWoGd7W7wMyQ1pOdjiMv10YHTR0wDQYJKoZIhvcNAQELBQADggEBAA7iw6eKz+T8HIpKDoDcX1Ywjn9JUzuCFu20LnsLzreO/Pog1xErYjdLAS7LTZokfbAnitBskO9QhV9BYkDiM0Qr5v2/HsJTtxa1mz9ywCcI36jblMyuXFj8tuwQI9/t9i+Fc3+bOFBV3t7djPo9qX1dIK0lZ6s8HcIhaCNdqm65fH+nWhC/H9djqC6qOtrkTiACKEcHQ4a/5dfROU0q0M4bS4YuiaAQWgjiGbik4LrZ8wZX1aqJCLt0Hs7MzXyyf0cRSO11FIOViHwzh6WTZGufq2J3YBFXPond8kLxkKL3LNezbi5yTcecxsbKQ6OS46CnIKcy/M8asSreLpoCDvw=</signature>
|
|
||||||
- </webviewprovider>
|
|
||||||
+ <webviewprovider description="Mulch WebView" packageName="us.spotco.mulch_wv" availableByDefault="true">
|
|
||||||
+</webviewprovider>
|
|
||||||
</webviewproviders>
|
|
||||||
|
|
183
build-u.sh
183
build-u.sh
|
@ -1,183 +0,0 @@
|
||||||
#!/bin/bash
|
|
||||||
|
|
||||||
MONTH="date +%B"
|
|
||||||
|
|
||||||
echo
|
|
||||||
echo "--------------------------------------"
|
|
||||||
echo " LeOS-U Buildbot "
|
|
||||||
echo " by "
|
|
||||||
echo " harvey186 "
|
|
||||||
echo "--------------------------------------"
|
|
||||||
echo
|
|
||||||
|
|
||||||
git clone https://github.com/ponces/treble_aosp -b android-14.0
|
|
||||||
|
|
||||||
git clone https://github.com/ponces/vendor_ponces.git -b android-14.0 vendor/ponces
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
initRepos() {
|
|
||||||
if [ ! -d .repo ]; then
|
|
||||||
echo "--> Initializing workspace"
|
|
||||||
repo init -u https://android.googlesource.com/platform/manifest -b android-14.0.0_r17 --git-lfs
|
|
||||||
echo
|
|
||||||
echo "--> Preparing local manifest"
|
|
||||||
mkdir -p .repo/local_manifests
|
|
||||||
cp treble_aosp/build/manifest.xml .repo/local_manifests/aosp.xml
|
|
||||||
cp LeOS/leos.xml .repo/local_manifests/leos.xml
|
|
||||||
cp LeOS/removeAOSP.xml .repo/local_manifests/remove.xml
|
|
||||||
echo
|
|
||||||
fi
|
|
||||||
}
|
|
||||||
|
|
||||||
syncRepos() {
|
|
||||||
echo "--> Syncing repos"
|
|
||||||
repo sync -c --force-sync --no-clone-bundle --no-tags -j$(nproc --all)
|
|
||||||
echo
|
|
||||||
}
|
|
||||||
|
|
||||||
applyPatches() {
|
|
||||||
echo "--> Applying TrebleDroid patches"
|
|
||||||
bash treble_aosp/patch.sh treble_aosp trebledroid
|
|
||||||
echo
|
|
||||||
|
|
||||||
echo "--> Applying ponces personal patches"
|
|
||||||
rm treble_aosp/patches/personal/platform_frameworks_base/0001-gmscompat-Change-attestation-and-instrumentation-to-.patch
|
|
||||||
rm treble_aosp/patches/personal/platform_frameworks_base/0002-gmscompat-Spoof-Pixel-XL-for-Google-Photos.patch
|
|
||||||
rm treble_aosp/patches/personal/platform_frameworks_base/0007-permissions-Pre-grant-google-restore-permissions.patch
|
|
||||||
rm -R treble_aosp/patches/personal/platform_frameworks_base/0008-feat-Add-Lockscreen-Weather-with-OmniJaws-1-2.patch
|
|
||||||
rm -R treble_aosp/patches/personal/platform_packages_apps_Settings/0001-feat-Add-Lockscreen-Weather-with-OmniJaws-2-2.patch
|
|
||||||
rm treble_aosp/patches/personal/platform_build/0001-Remove-su-from-vanilla-builds.patch
|
|
||||||
bash treble_aosp/patch.sh treble_aosp personal
|
|
||||||
echo
|
|
||||||
|
|
||||||
echo "--> Applying LeOS patches"
|
|
||||||
mv patches/leos treble_aosp/patches/leos
|
|
||||||
bash treble_aosp/patch.sh treble_aosp leos
|
|
||||||
cp LeOS/instrumentation_test_list.mk plattform_testing/build/tasks/tests/
|
|
||||||
cp LeOS/platform_test_list.mk plattform_testing/build/tasks/tests/
|
|
||||||
echo
|
|
||||||
|
|
||||||
echo "--> Generating makefiles"
|
|
||||||
cd device/phh/treble
|
|
||||||
cp treble_aosp/build/aosp.mk device/phh/treble/
|
|
||||||
bash generate.sh aosp
|
|
||||||
cd ../../..
|
|
||||||
echo
|
|
||||||
}
|
|
||||||
|
|
||||||
setupEnv() {
|
|
||||||
echo "--> Setting up build environment"
|
|
||||||
source build/envsetup.sh &>/dev/null
|
|
||||||
mkdir -p $BD
|
|
||||||
echo
|
|
||||||
}
|
|
||||||
|
|
||||||
buildTrebleApp() {
|
|
||||||
echo "--> Building treble_app"
|
|
||||||
cd treble_app
|
|
||||||
bash build.sh release
|
|
||||||
cp TrebleApp.apk ../vendor/hardware_overlay/TrebleApp/app.apk
|
|
||||||
cd ..
|
|
||||||
echo
|
|
||||||
}
|
|
||||||
|
|
||||||
buildVanillaVariant() {
|
|
||||||
echo "--> Building treble_arm64_bvS"
|
|
||||||
export WITHOUT_CHECK_API=true
|
|
||||||
export USE_CCACHE=1
|
|
||||||
export CCACHE_SIZE=50G
|
|
||||||
export WITH_SU=true
|
|
||||||
lunch leos_arm64_bvS-userdebug
|
|
||||||
#make installclean
|
|
||||||
make -j12 RELAX_USES_LIBRARY_CHECK=true systemimage
|
|
||||||
echo
|
|
||||||
echo "--> Building treble_a64_bvS"
|
|
||||||
export WITHOUT_CHECK_API=true
|
|
||||||
export USE_CCACHE=1
|
|
||||||
export CCACHE_SIZE=50G
|
|
||||||
export WITH_SU=true
|
|
||||||
lunch leos_a64_bvS-userdebug
|
|
||||||
#make installclean
|
|
||||||
make -j12 RELAX_USES_LIBRARY_CHECK=true systemimage
|
|
||||||
|
|
||||||
echo "--> Building LeOS-U-VNDKLITE-arm64-bvS.img"
|
|
||||||
cd treble_adapter
|
|
||||||
sudo bash lite-adapter.sh 64 ../out/target/product/leos_arm64_ab/system.img
|
|
||||||
mv s.img LeOS-U-VNDKLITE-arm64-bvS.img
|
|
||||||
sudo rm -rf d tmp
|
|
||||||
|
|
||||||
echo "--> Building LeOS-U-VNDKLITE-arm64-bvN"
|
|
||||||
sudo bash lite-adapterN.sh 64 ../out/target/product/leos_arm64_ab/system.img
|
|
||||||
mv s.img LeOS-U-VNDKLITE-arm64-bvN.img
|
|
||||||
sudo rm -rf d tmp
|
|
||||||
cd ..
|
|
||||||
echo
|
|
||||||
|
|
||||||
echo "--> Building LeOS-U-VNDKLITE-a64-bvS.img"
|
|
||||||
cd treble_adapter
|
|
||||||
sudo bash lite-adapterSa64.sh 32 ../out/target/product/leos_a64_ab/system.img
|
|
||||||
mv s.img LeOS-U-VNDKLITE-a64-bvS.img
|
|
||||||
sudo rm -rf d tmp
|
|
||||||
|
|
||||||
echo "--> Building LeOS-U-VNDKLITE-a64-bvN"
|
|
||||||
sudo bash lite-adapterNa64.sh 32 ../out/target/product/leos_a64_ab/system.img
|
|
||||||
mv s.img LeOS-U-VNDKLITE-a64-bvN.img
|
|
||||||
sudo rm -rf d tmp
|
|
||||||
cd ..
|
|
||||||
echo
|
|
||||||
|
|
||||||
|
|
||||||
cd prebuilts/prebuiltapks/foss_nano/
|
|
||||||
bash update.sh
|
|
||||||
cd ../../..
|
|
||||||
|
|
||||||
echo "--> Building treble_arm64_bvN"
|
|
||||||
export WITHOUT_CHECK_API=true
|
|
||||||
export USE_CCACHE=1
|
|
||||||
export CCACHE_SIZE=50G
|
|
||||||
export WITH_SU=true
|
|
||||||
lunch leos_arm64_bvN-userdebug
|
|
||||||
#make installclean
|
|
||||||
make -j12 RELAX_USES_LIBRARY_CHECK=true systemimage
|
|
||||||
echo
|
|
||||||
echo "--> Building treble_a64_bvN"
|
|
||||||
export WITHOUT_CHECK_API=true
|
|
||||||
export USE_CCACHE=1
|
|
||||||
export CCACHE_SIZE=50G
|
|
||||||
export WITH_SU=true
|
|
||||||
lunch leos_a64_bvN-userdebug
|
|
||||||
#make installclean
|
|
||||||
make -j12 RELAX_USES_LIBRARY_CHECK=true systemimage
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
generatePackages() {
|
|
||||||
echo "--> Generating packages"
|
|
||||||
cp out/target/product/leos_arm64_ab/system.img treble_adapter/LeOS-U-VNDK-arm64_bvN.img
|
|
||||||
cp out/target/product/leos_a64_ab/system.img treble_adapter/LeOS-U-VNDK-a64-bvN.img
|
|
||||||
cd treble_adapter
|
|
||||||
xz -vT0 *.img
|
|
||||||
cp *.img.xz /media/ich/exSSD2/leos-cloud/LeOS-Files/LeOS-U/$MONTH/
|
|
||||||
echo
|
|
||||||
}
|
|
||||||
|
|
||||||
echo "READY"
|
|
||||||
|
|
||||||
|
|
||||||
START=$(date +%s)
|
|
||||||
|
|
||||||
initRepos
|
|
||||||
syncRepos
|
|
||||||
applyPatches
|
|
||||||
setupEnv
|
|
||||||
buildTrebleApp
|
|
||||||
buildVanillaVariant
|
|
||||||
generatePackages
|
|
||||||
|
|
||||||
END=$(date +%s)
|
|
||||||
ELAPSEDM=$(($(($END-$START))/60))
|
|
||||||
ELAPSEDS=$(($(($END-$START))-$ELAPSEDM*60))
|
|
||||||
|
|
||||||
echo "--> Buildbot completed in $ELAPSEDM minutes and $ELAPSEDS seconds"
|
|
||||||
echo
|
|
Loading…
Reference in New Issue