зеркало из https://github.com/mozilla/gecko-dev.git
Merge mozilla-central to m-i
This commit is contained in:
Коммит
038b38598a
|
@ -88,7 +88,7 @@ function wait_for_notification_close(aCallback) {
|
|||
info("Waiting for notification to close");
|
||||
PopupNotifications.panel.addEventListener("popuphidden", function() {
|
||||
PopupNotifications.panel.removeEventListener("popuphidden", arguments.callee, false);
|
||||
aCallback();
|
||||
executeSoon(aCallback);
|
||||
}, false);
|
||||
}
|
||||
|
||||
|
@ -129,6 +129,17 @@ function wait_for_install_dialog(aCallback) {
|
|||
});
|
||||
}
|
||||
|
||||
function remove_tab_and_run_next_test() {
|
||||
let eventCount = 0;
|
||||
let nextTest = () => {
|
||||
if (++eventCount == 2) {
|
||||
runNextTest();
|
||||
}
|
||||
}
|
||||
wait_for_notification_close(nextTest);
|
||||
BrowserTestUtils.removeTab(gBrowser.selectedTab).then(nextTest);
|
||||
}
|
||||
|
||||
function accept_install_dialog() {
|
||||
if (Preferences.get("xpinstall.customConfirmationUI", false)) {
|
||||
document.getElementById("addon-install-confirmation-accept").click();
|
||||
|
@ -193,12 +204,12 @@ function test_disabled_install() {
|
|||
ok(false, "xpinstall.enabled should be set");
|
||||
}
|
||||
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
BrowserTestUtils.removeTab(gBrowser.selectedTab).then(() => {
|
||||
AddonManager.getAllInstalls(function(aInstalls) {
|
||||
is(aInstalls.length, 0, "Shouldn't be any pending installs");
|
||||
|
||||
AddonManager.getAllInstalls(function(aInstalls) {
|
||||
is(aInstalls.length, 0, "Shouldn't be any pending installs");
|
||||
|
||||
runNextTest();
|
||||
runNextTest();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -209,8 +220,7 @@ function test_disabled_install() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"XPI": "amosigned.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_blocked_install() {
|
||||
|
@ -238,8 +248,7 @@ function test_blocked_install() {
|
|||
is(aInstalls.length, 1, "Should be one pending install");
|
||||
aInstalls[0].cancel();
|
||||
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -258,39 +267,43 @@ function test_blocked_install() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"XPI": "amosigned.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_whitelisted_install() {
|
||||
var originalTab = gBrowser.selectedTab;
|
||||
var tab;
|
||||
|
||||
// Wait for the progress notification
|
||||
wait_for_progress_notification(function(aPanel) {
|
||||
gBrowser.selectedTab = originalTab;
|
||||
|
||||
// Wait for the install confirmation dialog
|
||||
wait_for_install_dialog(function() {
|
||||
is(gBrowser.selectedTab, tab,
|
||||
"tab selected in response to the addon-install-confirmation notification");
|
||||
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
let notification = aPanel.childNodes[0];
|
||||
is(notification.button.label, "Restart Now", "Should have seen the right button");
|
||||
is(notification.getAttribute("label"),
|
||||
"XPI Test will be installed after you restart " + gApp + ".",
|
||||
"Should have seen the right message");
|
||||
BrowserTestUtils.waitForCondition(() => !!tab, "tab should be present").then(() => {
|
||||
is(gBrowser.selectedTab, tab,
|
||||
"tab selected in response to the addon-install-confirmation notification");
|
||||
|
||||
AddonManager.getAllInstalls(function(aInstalls) {
|
||||
is(aInstalls.length, 1, "Should be one pending install");
|
||||
aInstalls[0].cancel();
|
||||
// Wait for the complete notification
|
||||
wait_for_notification("addon-install-restart", function(aPanel) {
|
||||
let notification = aPanel.childNodes[0];
|
||||
is(notification.button.label, "Restart Now", "Should have seen the right button");
|
||||
is(notification.getAttribute("label"),
|
||||
"XPI Test will be installed after you restart " + gApp + ".",
|
||||
"Should have seen the right message");
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
AddonManager.getAllInstalls(function(aInstalls) {
|
||||
is(aInstalls.length, 1, "Should be one pending install");
|
||||
aInstalls[0].cancel();
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
accept_install_dialog();
|
||||
accept_install_dialog();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -300,10 +313,9 @@ function test_whitelisted_install() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"XPI": "amosigned.xpi"
|
||||
}));
|
||||
let originalTab = gBrowser.selectedTab;
|
||||
let tab = gBrowser.addTab();
|
||||
gBrowser.selectedTab = tab;
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?"
|
||||
+ triggers).then(newTab => tab = newTab);
|
||||
},
|
||||
|
||||
function test_failed_download() {
|
||||
|
@ -317,8 +329,7 @@ function test_failed_download() {
|
|||
"Should have seen the right message");
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -328,8 +339,7 @@ function test_failed_download() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"XPI": "missing.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_corrupt_file() {
|
||||
|
@ -344,8 +354,7 @@ function test_corrupt_file() {
|
|||
"Should have seen the right message");
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -355,8 +364,7 @@ function test_corrupt_file() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"XPI": "corrupt.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_incompatible() {
|
||||
|
@ -371,8 +379,7 @@ function test_incompatible() {
|
|||
"Should have seen the right message");
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -382,8 +389,7 @@ function test_incompatible() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"XPI": "incompatible.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_restartless() {
|
||||
|
@ -446,8 +452,7 @@ function test_multiple() {
|
|||
aAddon.uninstall();
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -463,8 +468,7 @@ function test_multiple() {
|
|||
"Unsigned XPI": "amosigned.xpi",
|
||||
"Restartless XPI": "restartless.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_sequential() {
|
||||
|
@ -519,8 +523,7 @@ function test_sequential() {
|
|||
|
||||
Services.perms.remove(makeURI("http://example.com"), "install");
|
||||
wait_for_notification_close(() => {
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
runNextTest();
|
||||
BrowserTestUtils.removeTab(gBrowser.selectedTab).then(runNextTest);
|
||||
});
|
||||
|
||||
cancel_install_dialog();
|
||||
|
@ -541,8 +544,7 @@ function test_sequential() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"Restartless XPI": "restartless.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_someunverified() {
|
||||
|
@ -561,7 +563,8 @@ function test_someunverified() {
|
|||
wait_for_install_dialog(function() {
|
||||
let notification = document.getElementById("addon-install-confirmation-notification");
|
||||
let message = notification.getAttribute("label");
|
||||
is(message, "Caution: This site would like to install 2 add-ons in " + gApp + ", some of which are unverified. Proceed at your own risk.",
|
||||
is(message, "Caution: This site would like to install 2 add-ons in " + gApp +
|
||||
", some of which are unverified. Proceed at your own risk.",
|
||||
"Should see the right message");
|
||||
|
||||
let container = document.getElementById("addon-install-confirmation-content");
|
||||
|
@ -583,8 +586,7 @@ function test_someunverified() {
|
|||
t.uninstall();
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -599,8 +601,7 @@ function test_someunverified() {
|
|||
"Extension XPI": "restartless-unsigned.xpi",
|
||||
"Theme XPI": "theme.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_allunverified() {
|
||||
|
@ -632,8 +633,7 @@ function test_allunverified() {
|
|||
aAddon.uninstall();
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -647,8 +647,7 @@ function test_allunverified() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"Extension XPI": "restartless-unsigned.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_url() {
|
||||
|
@ -668,8 +667,7 @@ function test_url() {
|
|||
is(aInstalls.length, 1, "Should be one pending install");
|
||||
aInstalls[0].cancel();
|
||||
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -696,8 +694,7 @@ function test_localfile() {
|
|||
"This add-on could not be installed because it appears to be corrupt.",
|
||||
"Should have seen the right message");
|
||||
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
}, "addon-install-failed", false);
|
||||
|
||||
|
@ -727,14 +724,21 @@ function test_tabclose() {
|
|||
AddonManager.getAllInstalls(aInstalls => {
|
||||
is(aInstalls.length, 1, "Should be one pending install");
|
||||
|
||||
let eventCount = 0;
|
||||
let nextTest = () => {
|
||||
if (++eventCount == 2) {
|
||||
runNextTest();
|
||||
}
|
||||
}
|
||||
|
||||
wait_for_notification_close(() => {
|
||||
AddonManager.getAllInstalls(aInstalls => {
|
||||
is(aInstalls.length, 0, "Should be no pending install since the tab is closed");
|
||||
runNextTest();
|
||||
nextTest();
|
||||
});
|
||||
});
|
||||
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
BrowserTestUtils.removeTab(gBrowser.selectedTab).then(nextTest);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -763,8 +767,7 @@ function test_tabnavigate() {
|
|||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
loadPromise.then(() => {
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
runNextTest();
|
||||
BrowserTestUtils.removeTab(gBrowser.selectedTab).then(runNextTest);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -780,8 +783,7 @@ function test_tabnavigate() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"Extension XPI": "amosigned.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_urlbar() {
|
||||
|
@ -790,11 +792,7 @@ function test_urlbar() {
|
|||
|
||||
is(notification.button.label, "", "Button to allow install should be hidden.");
|
||||
|
||||
wait_for_notification_close(() => {
|
||||
runNextTest();
|
||||
});
|
||||
|
||||
gBrowser.removeCurrentTab();
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
|
||||
gBrowser.selectedTab = gBrowser.addTab("about:blank");
|
||||
|
@ -820,8 +818,7 @@ function test_wronghost() {
|
|||
"because it appears to be corrupt.",
|
||||
"Should have seen the right message");
|
||||
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -858,8 +855,7 @@ function test_reload() {
|
|||
aInstalls[0].cancel();
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
gBrowser.loadURI(TESTROOT2 + "enabled.html");
|
||||
|
@ -875,8 +871,7 @@ function test_reload() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"Unsigned XPI": "amosigned.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_theme() {
|
||||
|
@ -902,8 +897,7 @@ function test_theme() {
|
|||
aAddon.uninstall();
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
@ -918,8 +912,7 @@ function test_theme() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"Theme XPI": "theme.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_renotify_blocked() {
|
||||
|
@ -934,15 +927,22 @@ function test_renotify_blocked() {
|
|||
AddonManager.getAllInstalls(function(aInstalls) {
|
||||
is(aInstalls.length, 2, "Should be two pending installs");
|
||||
|
||||
let eventCount = 0;
|
||||
let nextTest = () => {
|
||||
if (++eventCount == 2) {
|
||||
runNextTest();
|
||||
}
|
||||
}
|
||||
|
||||
wait_for_notification_close(() => {
|
||||
AddonManager.getAllInstalls(function(aInstalls) {
|
||||
is(aInstalls.length, 0, "Should have cancelled the installs");
|
||||
runNextTest();
|
||||
nextTest();
|
||||
});
|
||||
});
|
||||
|
||||
info("Closing browser tab");
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
BrowserTestUtils.removeTab(gBrowser.selectedTab).then(nextTest);
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -957,8 +957,7 @@ function test_renotify_blocked() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"XPI": "amosigned.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_renotify_installed() {
|
||||
|
@ -985,8 +984,7 @@ function test_renotify_installed() {
|
|||
aInstalls[0].cancel();
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
});
|
||||
|
||||
|
@ -1012,8 +1010,7 @@ function test_renotify_installed() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"XPI": "amosigned.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_cancel() {
|
||||
|
@ -1053,8 +1050,7 @@ function test_cancel() {
|
|||
is(aInstalls.length, 0, "Should be no pending install");
|
||||
|
||||
Services.perms.remove(makeURI("http://example.com/"), "install");
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
runNextTest();
|
||||
BrowserTestUtils.removeTab(gBrowser.selectedTab).then(runNextTest);
|
||||
});
|
||||
});
|
||||
}
|
||||
|
@ -1070,8 +1066,7 @@ function test_cancel() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"XPI": "slowinstall.sjs?file=amosigned.xpi"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(TESTROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, TESTROOT + "installtrigger.html?" + triggers);
|
||||
},
|
||||
|
||||
function test_failed_security() {
|
||||
|
@ -1106,8 +1101,7 @@ function test_failed_security() {
|
|||
is(notification.id, "addon-install-failed-notification", "Should have seen the install fail");
|
||||
|
||||
Services.prefs.setBoolPref(PREF_INSTALL_REQUIREBUILTINCERTS, true);
|
||||
wait_for_notification_close(runNextTest);
|
||||
gBrowser.removeTab(gBrowser.selectedTab);
|
||||
remove_tab_and_run_next_test();
|
||||
});
|
||||
}, "addon-install-failed", false);
|
||||
});
|
||||
|
@ -1115,8 +1109,7 @@ function test_failed_security() {
|
|||
var triggers = encodeURIComponent(JSON.stringify({
|
||||
"XPI": "redirect.sjs?mode=redirect"
|
||||
}));
|
||||
gBrowser.selectedTab = gBrowser.addTab();
|
||||
gBrowser.loadURI(SECUREROOT + "installtrigger.html?" + triggers);
|
||||
BrowserTestUtils.openNewForegroundTab(gBrowser, SECUREROOT + "installtrigger.html?" + triggers);
|
||||
}
|
||||
];
|
||||
|
||||
|
|
|
@ -1,31 +1,35 @@
|
|||
"use strict";
|
||||
|
||||
SimpleTest.requestCompleteLog();
|
||||
|
||||
SpecialPowers.pushPrefEnv({"set": [["dom.require_user_interaction_for_beforeunload", false]]});
|
||||
|
||||
const FIRST_TAB = getRootDirectory(gTestPath) + "close_beforeunload_opens_second_tab.html";
|
||||
const SECOND_TAB = getRootDirectory(gTestPath) + "close_beforeunload.html";
|
||||
|
||||
add_task(function*() {
|
||||
info("Opening first tab");
|
||||
let firstTab = yield BrowserTestUtils.openNewForegroundTab(gBrowser, FIRST_TAB);
|
||||
let newTabPromise = waitForNewTabEvent(gBrowser);
|
||||
ContentTask.spawn(firstTab.linkedBrowser, "", function*() {
|
||||
let secondTabLoadedPromise;
|
||||
let secondTab;
|
||||
let tabOpened = new Promise(resolve => {
|
||||
info("Adding tabopen listener");
|
||||
gBrowser.tabContainer.addEventListener("TabOpen", function tabOpenListener(e) {
|
||||
info("Got tabopen, removing listener and waiting for load");
|
||||
gBrowser.tabContainer.removeEventListener("TabOpen", tabOpenListener, false, false);
|
||||
secondTab = e.target;
|
||||
secondTabLoadedPromise = BrowserTestUtils.browserLoaded(secondTab.linkedBrowser, false, SECOND_TAB);
|
||||
resolve();
|
||||
}, false, false);
|
||||
});
|
||||
info("Opening second tab using a click");
|
||||
yield ContentTask.spawn(firstTab.linkedBrowser, "", function*() {
|
||||
content.document.getElementsByTagName("a")[0].click();
|
||||
});
|
||||
let tabOpenEvent = yield newTabPromise;
|
||||
let secondTab = tabOpenEvent.target;
|
||||
yield ContentTask.spawn(secondTab.linkedBrowser, SECOND_TAB, function*(expectedURL) {
|
||||
if (content.window.location.href == expectedURL &&
|
||||
content.document.readyState === "complete") {
|
||||
return Promise.resolve();
|
||||
}
|
||||
return new Promise(function(resolve, reject) {
|
||||
content.window.addEventListener("load", function() {
|
||||
if (content.window.location.href == expectedURL) {
|
||||
resolve();
|
||||
}
|
||||
}, false);
|
||||
});
|
||||
});
|
||||
info("Waiting for the second tab to be opened");
|
||||
yield tabOpened;
|
||||
info("Waiting for the load in that tab to finish");
|
||||
yield secondTabLoadedPromise;
|
||||
|
||||
let closeBtn = document.getAnonymousElementByAttribute(secondTab, "anonid", "close-button");
|
||||
let closePromise = BrowserTestUtils.removeTab(secondTab, {dontRemove: true});
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
"properties": {
|
||||
"browser_action": {
|
||||
"type": "object",
|
||||
"additionalProperties": { "$ref": "UnrecognizedProperty" },
|
||||
"properties": {
|
||||
"default_title": {
|
||||
"type": "string",
|
||||
|
|
|
@ -27,6 +27,7 @@
|
|||
"optional": true,
|
||||
"additionalProperties": {
|
||||
"type": "object",
|
||||
"additionalProperties": { "$ref": "UnrecognizedProperty" },
|
||||
"properties": {
|
||||
"suggested_key": {
|
||||
"type": "object",
|
||||
|
@ -143,4 +144,4 @@
|
|||
}
|
||||
]
|
||||
}
|
||||
]
|
||||
]
|
||||
|
|
|
@ -11,6 +11,7 @@
|
|||
"properties": {
|
||||
"page_action": {
|
||||
"type": "object",
|
||||
"additionalProperties": { "$ref": "UnrecognizedProperty" },
|
||||
"properties": {
|
||||
"default_title": {
|
||||
"type": "string",
|
||||
|
|
|
@ -18,6 +18,7 @@ support-files =
|
|||
[browser_ext_browserAction_pageAction_icon.js]
|
||||
[browser_ext_browserAction_context.js]
|
||||
[browser_ext_browserAction_disabled.js]
|
||||
[browser_ext_pageAction_simple.js]
|
||||
[browser_ext_pageAction_context.js]
|
||||
[browser_ext_pageAction_popup.js]
|
||||
[browser_ext_browserAction_popup.js]
|
||||
|
|
|
@ -7,6 +7,7 @@ add_task(function* () {
|
|||
manifest: {
|
||||
"browser_action": {
|
||||
"default_popup": "popup.html",
|
||||
"unrecognized_property": "with-a-random-value",
|
||||
},
|
||||
},
|
||||
|
||||
|
@ -31,6 +32,13 @@ add_task(function* () {
|
|||
},
|
||||
});
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
let waitForConsole = new Promise(resolve => {
|
||||
SimpleTest.monitorConsole(resolve, [{
|
||||
message: /Reading manifest: Error processing browser_action.unrecognized_property: An unexpected property was found/,
|
||||
}]);
|
||||
});
|
||||
|
||||
yield extension.startup();
|
||||
|
||||
// Do this a few times to make sure the pop-up is reloaded each time.
|
||||
|
@ -43,4 +51,7 @@ add_task(function* () {
|
|||
}
|
||||
|
||||
yield extension.unload();
|
||||
|
||||
SimpleTest.endMonitorConsole();
|
||||
yield waitForConsole;
|
||||
});
|
||||
|
|
|
@ -21,6 +21,7 @@ add_task(function* () {
|
|||
"suggested_key": {
|
||||
"default": "Alt+Shift+Comma",
|
||||
},
|
||||
"unrecognized_property": "with-a-random-value",
|
||||
},
|
||||
},
|
||||
},
|
||||
|
@ -33,6 +34,14 @@ add_task(function* () {
|
|||
},
|
||||
});
|
||||
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
let waitForConsole = new Promise(resolve => {
|
||||
SimpleTest.monitorConsole(resolve, [{
|
||||
message: /Reading manifest: Error processing commands.*.unrecognized_property: An unexpected property was found/,
|
||||
}]);
|
||||
});
|
||||
|
||||
yield extension.startup();
|
||||
yield extension.awaitMessage("ready");
|
||||
|
||||
|
@ -71,4 +80,7 @@ add_task(function* () {
|
|||
|
||||
yield BrowserTestUtils.closeWindow(win1);
|
||||
yield BrowserTestUtils.closeWindow(win2);
|
||||
|
||||
SimpleTest.endMonitorConsole();
|
||||
yield waitForConsole;
|
||||
});
|
||||
|
|
|
@ -0,0 +1,59 @@
|
|||
/* -*- Mode: indent-tabs-mode: nil; js-indent-level: 2 -*- */
|
||||
/* vim: set sts=2 sw=2 et tw=80: */
|
||||
"use strict";
|
||||
|
||||
add_task(function* () {
|
||||
let extension = ExtensionTestUtils.loadExtension({
|
||||
manifest: {
|
||||
"page_action": {
|
||||
"default_popup": "popup.html",
|
||||
"unrecognized_property": "with-a-random-value",
|
||||
},
|
||||
},
|
||||
|
||||
files: {
|
||||
"popup.html": `
|
||||
<!DOCTYPE html>
|
||||
<html><body>
|
||||
<script src="popup.js"></script>
|
||||
</body></html>
|
||||
`,
|
||||
|
||||
"popup.js": function() {
|
||||
browser.runtime.sendMessage("from-popup");
|
||||
},
|
||||
},
|
||||
|
||||
background: function() {
|
||||
browser.runtime.onMessage.addListener(msg => {
|
||||
browser.test.assertEq(msg, "from-popup", "correct message received");
|
||||
browser.test.sendMessage("popup");
|
||||
});
|
||||
browser.tabs.query({active: true, currentWindow: true}, tabs => {
|
||||
let tabId = tabs[0].id;
|
||||
|
||||
browser.pageAction.show(tabId);
|
||||
browser.test.sendMessage("page-action-shown");
|
||||
});
|
||||
},
|
||||
});
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
let waitForConsole = new Promise(resolve => {
|
||||
SimpleTest.monitorConsole(resolve, [{
|
||||
message: /Reading manifest: Error processing page_action.unrecognized_property: An unexpected property was found/,
|
||||
}]);
|
||||
});
|
||||
|
||||
yield extension.startup();
|
||||
yield extension.awaitMessage("page-action-shown");
|
||||
|
||||
clickPageAction(extension);
|
||||
|
||||
yield extension.awaitMessage("popup");
|
||||
|
||||
yield extension.unload();
|
||||
|
||||
SimpleTest.endMonitorConsole();
|
||||
yield waitForConsole;
|
||||
});
|
|
@ -241,6 +241,18 @@ SourcesView.prototype = Heritage.extend(WidgetMethods, {
|
|||
contents.setAttribute("flex", "1");
|
||||
contents.setAttribute("tooltiptext", unicodeUrl);
|
||||
|
||||
if (aSource.introductionType === "wasm") {
|
||||
const wasm = document.createElement("box");
|
||||
wasm.className = "dbg-wasm-item";
|
||||
const icon = document.createElement("box");
|
||||
icon.setAttribute("tooltiptext", L10N.getStr("experimental"));
|
||||
icon.className = "icon";
|
||||
wasm.appendChild(icon);
|
||||
wasm.appendChild(contents);
|
||||
|
||||
contents = wasm;
|
||||
}
|
||||
|
||||
// If the source is blackboxed, apply the appropriate style.
|
||||
if (gThreadClient.source(aSource).isBlackBoxed) {
|
||||
contents.classList.add("black-boxed");
|
||||
|
|
|
@ -48,9 +48,7 @@ function attachThread(toolbox) {
|
|||
let { form: { chromeDebugger, actor } } = target;
|
||||
let threadOptions = {
|
||||
useSourceMaps: Services.prefs.getBoolPref("devtools.debugger.source-maps-enabled"),
|
||||
autoBlackBox: Services.prefs.getBoolPref("devtools.debugger.auto-black-box"),
|
||||
pauseOnExceptions: Services.prefs.getBoolPref("devtools.debugger.pause-on-exceptions"),
|
||||
ignoreCaughtExceptions: Services.prefs.getBoolPref("devtools.debugger.ignore-caught-exceptions")
|
||||
autoBlackBox: Services.prefs.getBoolPref("devtools.debugger.auto-black-box")
|
||||
};
|
||||
|
||||
let handleResponse = (res, threadClient) => {
|
||||
|
@ -67,6 +65,15 @@ function attachThread(toolbox) {
|
|||
);
|
||||
}
|
||||
|
||||
// These flags need to be set here because the client sends them
|
||||
// with the `resume` request. We make sure to do this before
|
||||
// resuming to avoid another interrupt. We can't pass it in with
|
||||
// `threadOptions` because the resume request will override them.
|
||||
threadClient.pauseOnExceptions(
|
||||
Services.prefs.getBoolPref("devtools.debugger.pause-on-exceptions"),
|
||||
Services.prefs.getBoolPref("devtools.debugger.ignore-caught-exceptions")
|
||||
);
|
||||
|
||||
threadClient.resume(res => {
|
||||
if (res.error === "wrongOrder") {
|
||||
const box = toolbox.getNotificationBox();
|
||||
|
|
|
@ -330,3 +330,5 @@ variablesViewUninitialized=(uninitialized)
|
|||
variablesViewMissingArgs=(unavailable)
|
||||
|
||||
anonymousSourcesLabel=Anonymous Sources
|
||||
|
||||
experimental=This is an experimental feature
|
|
@ -95,7 +95,7 @@
|
|||
<hbox id="netmonitor-toolbar" class="devtools-toolbar">
|
||||
<toolbarbutton id="requests-menu-clear-button"
|
||||
class="devtools-toolbarbutton devtools-clear-icon"
|
||||
tooltip="&netmonitorUI.footer.clear;"/>
|
||||
tooltiptext="&netmonitorUI.footer.clear;"/>
|
||||
<hbox id="requests-menu-filter-buttons">
|
||||
<button id="requests-menu-filter-all-button"
|
||||
class="requests-menu-filter-button"
|
||||
|
|
|
@ -72,5 +72,11 @@ const key = (id, win = window) => {
|
|||
DevToolsUtils.testing = false;
|
||||
PrefUtils.rollbackPrefsToDefault();
|
||||
stopObservingPrefs();
|
||||
|
||||
// Forces GC, CC and shrinking GC to get rid of disconnected docshells
|
||||
// and windows.
|
||||
Cu.forceGC();
|
||||
Cu.forceCC();
|
||||
Cu.forceShrinkingGC();
|
||||
});
|
||||
})();
|
||||
|
|
|
@ -35,7 +35,7 @@ module.exports = createClass({
|
|||
getStr("responsive.title")),
|
||||
dom.button({
|
||||
id: "global-exit-button",
|
||||
className: "toolbar-button",
|
||||
className: "toolbar-button devtools-button",
|
||||
title: getStr("responsive.exit"),
|
||||
onClick: onExit,
|
||||
})
|
||||
|
|
|
@ -27,7 +27,7 @@ module.exports = createClass({
|
|||
className: "viewport-toolbar",
|
||||
},
|
||||
dom.button({
|
||||
className: "viewport-rotate-button toolbar-button",
|
||||
className: "viewport-rotate-button toolbar-button devtools-button",
|
||||
onClick: onRotateViewport,
|
||||
})
|
||||
);
|
||||
|
|
|
@ -1,6 +1,6 @@
|
|||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 16 16" fill="#babec3">
|
||||
<path d="M8.9 8l5-5c.2-.2.2-.6 0-.9-.2-.2-.6-.2-.9 0l-5 5-5-5c-.2-.2-.6-.2-.9 0-.2.3-.2.7 0 .9l5 5-5 5c-.2.2-.2.6 0 .9.1.1.3.1.5.1.1 0 .3 0 .4-.2l5-5 5 5c.1.1.3.2.4.2.2 0 .3-.1.4-.2.2-.2.2-.6 0-.9L8.9 8z"/>
|
||||
</svg>
|
||||
</svg>
|
||||
|
|
До Ширина: | Высота: | Размер: 488 B После Ширина: | Высота: | Размер: 504 B |
|
@ -1,6 +1,6 @@
|
|||
<!-- This Source Code Form is subject to the terms of the Mozilla Public
|
||||
- License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
- file, You can obtain one at http://mozilla.org/MPL/2.0/. -->
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16">
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" viewBox="0 0 16 16" fill="#babec3">
|
||||
<path d="M12.3 11.5l-2.2-8.2-.3-.3c-.1-.1-.2-.1-.4-.1L4 4.4c-.2.1-.4.4-.3.6l2.2 8.2c0 .1.1.2.2.3.1 0 .2.1.3.1h.1l5.4-1.5c.3 0 .5-.3.4-.6zM9.2 4.1l1.5 5.5-4.4 1.2-1.5-5.5 4.4-1.2zm-2.4 8.4l-.3-1.1 4.4-1.2.3 1.1-4.4 1.2zM3.7 13.7c-1.2 0-3.4-.6-3.7-2.8-.3-2.2 1.3-3.3 2.1-3.5.2-.1.4.1.5.3.1.2-.1.4-.3.5-.1 0-1.8.6-1.6 2.7.2 1.5 1.6 1.9 2.4 2l-.7-2.4c0-.2.2-.5.4-.5.2-.1.4 0 .5.2l.9 3c0 .1 0 .3-.1.4-.1.1-.2.1-.4.1zM12.3 3.1c1.2 0 3.4.6 3.7 2.8.3 2.2-1.3 3.3-2.1 3.5-.2.1-.4-.1-.5-.3-.1-.2.1-.4.3-.5.1 0 1.8-.6 1.6-2.7-.2-1.5-1.6-1.9-2.4-2l.7 2.4c.1.2-.1.4-.3.5-.2.1-.4-.1-.5-.3l-.9-3c0-.1 0-.3.1-.4h.3z"/>
|
||||
</svg>
|
||||
|
|
До Ширина: | Высота: | Размер: 908 B После Ширина: | Высота: | Размер: 923 B |
|
@ -46,23 +46,17 @@ body {
|
|||
*/
|
||||
|
||||
.toolbar-button {
|
||||
border: none;
|
||||
display: block;
|
||||
margin: 1px 3px;
|
||||
padding: 0;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
opacity: 0.8;
|
||||
background-color: var(--theme-body-color);
|
||||
/* Reset styles from .devtools-button */
|
||||
min-width: initial;
|
||||
min-height: initial;
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
.toolbar-button:hover {
|
||||
opacity: 1;
|
||||
}
|
||||
|
||||
.toolbar-button:active {
|
||||
background-color: var(--theme-selection-background);
|
||||
opacity: 1;
|
||||
.toolbar-button:active::before {
|
||||
filter: url("chrome://devtools/skin/images/filters.svg#checked-icon-state");
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -76,7 +70,7 @@ body {
|
|||
color: var(--theme-body-color-alt);
|
||||
box-shadow: var(--box-shadow);
|
||||
margin: 30px 0;
|
||||
padding: 4px 8px;
|
||||
padding: 4px 5px;
|
||||
display: inline-flex;
|
||||
-moz-user-select: none;
|
||||
}
|
||||
|
@ -87,11 +81,18 @@ body {
|
|||
}
|
||||
|
||||
#global-toolbar .toolbar-button {
|
||||
margin: 0 0 0 4px;
|
||||
margin: 0 0 0 5px;
|
||||
}
|
||||
|
||||
#global-exit-button {
|
||||
mask: url("./images/close.svg");
|
||||
#global-exit-button,
|
||||
#global-exit-button::before {
|
||||
width: 12px;
|
||||
height: 12px;
|
||||
}
|
||||
|
||||
#global-exit-button::before {
|
||||
background-image: url("./images/close.svg");
|
||||
margin: -6px 0 0 -6px;
|
||||
}
|
||||
|
||||
#viewports {
|
||||
|
@ -138,8 +139,8 @@ body {
|
|||
height: 18px;
|
||||
}
|
||||
|
||||
.viewport-rotate-button {
|
||||
mask: url("./images/rotate-viewport.svg");
|
||||
.viewport-rotate-button::before {
|
||||
background-image: url("./images/rotate-viewport.svg");
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -29,6 +29,20 @@
|
|||
padding: 2px 0px;
|
||||
}
|
||||
|
||||
.dbg-wasm-item .icon {
|
||||
display: block;
|
||||
background-image: url(chrome://devtools/skin/images/webconsole.svg);
|
||||
background-repeat: no-repeat;
|
||||
background-size: 72px 60px;
|
||||
/* show warning icon */
|
||||
background-position: -24px -24px;
|
||||
width: 10px;
|
||||
height: 10px;
|
||||
position: absolute;
|
||||
margin-inline-start: -15px;
|
||||
margin-top: 3px;
|
||||
}
|
||||
|
||||
.dbg-breakpoint-line {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
|
|
@ -1864,23 +1864,20 @@ ThreadClient.prototype = {
|
|||
this._pauseOnExceptions = aPauseOnExceptions;
|
||||
this._ignoreCaughtExceptions = aIgnoreCaughtExceptions;
|
||||
|
||||
// If the debuggee is paused, we have to send the flag via a reconfigure
|
||||
// request.
|
||||
if (this.paused) {
|
||||
return this.reconfigure({
|
||||
pauseOnExceptions: aPauseOnExceptions,
|
||||
ignoreCaughtExceptions: aIgnoreCaughtExceptions
|
||||
}, aOnResponse);
|
||||
}
|
||||
// Otherwise send the flag using a standard resume request.
|
||||
return this.interrupt(aResponse => {
|
||||
if (aResponse.error) {
|
||||
// Can't continue if pausing failed.
|
||||
aOnResponse(aResponse);
|
||||
return aResponse;
|
||||
}
|
||||
return this.resume(aOnResponse);
|
||||
});
|
||||
if(!this.paused) {
|
||||
return this.interrupt(aResponse => {
|
||||
if (aResponse.error) {
|
||||
// Can't continue if pausing failed.
|
||||
aOnResponse(aResponse);
|
||||
return aResponse;
|
||||
}
|
||||
return this.resume(aOnResponse);
|
||||
});
|
||||
}
|
||||
|
||||
aOnResponse();
|
||||
return promise.resolve();
|
||||
},
|
||||
|
||||
/**
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#include "nsIInterfaceRequestor.h"
|
||||
#include "nsIInterfaceRequestorUtils.h"
|
||||
#include "nsILoadContext.h"
|
||||
#include "nsITextControlFrame.h"
|
||||
#include "nsUnicharUtils.h"
|
||||
#include "nsContentList.h"
|
||||
#include "nsCSSPseudoElements.h"
|
||||
|
@ -10845,10 +10846,8 @@ nsIDocument::CaretPositionFromPoint(float aX, float aY)
|
|||
nsIContent* nonanon = node->FindFirstNonChromeOnlyAccessContent();
|
||||
nsCOMPtr<nsIDOMHTMLInputElement> input = do_QueryInterface(nonanon);
|
||||
nsCOMPtr<nsIDOMHTMLTextAreaElement> textArea = do_QueryInterface(nonanon);
|
||||
bool isText;
|
||||
if (textArea || (input &&
|
||||
NS_SUCCEEDED(input->MozIsTextField(false, &isText)) &&
|
||||
isText)) {
|
||||
nsITextControlFrame* textFrame = do_QueryFrame(nonanon->GetPrimaryFrame());
|
||||
if (!!textFrame) {
|
||||
// If the anonymous content node has a child, then we need to make sure
|
||||
// that we get the appropriate child, as otherwise the offset may not be
|
||||
// correct when we construct a range for it.
|
||||
|
|
|
@ -5,7 +5,7 @@
|
|||
|
||||
#include "nsISupports.idl"
|
||||
|
||||
[uuid(57128a85-34de-42db-a252-84dd57724a59)]
|
||||
[builtinclass, uuid(57128a85-34de-42db-a252-84dd57724a59)]
|
||||
interface nsIDOMFileList : nsISupports
|
||||
{
|
||||
readonly attribute unsigned long length;
|
||||
|
|
|
@ -95,6 +95,16 @@
|
|||
todo(false, "test5Rect: (" + test5Rect.top + ", " + test5Rect.left + ", " + test5Rect.width + ", " + test5Rect.height + ")");
|
||||
checkOffsetsFromPoint(test5x, test5y, 0, 'test5');
|
||||
|
||||
// Check the first and last characters of the numeric input.
|
||||
var test6Element = document.getElementById("test6");
|
||||
var test6Rect = test6Element.getBoundingClientRect();
|
||||
checkOffsetsFromPoint(Math.round(test6Rect.left + 5),
|
||||
Math.round(test6Rect.top + (test6Rect.height / 2)),
|
||||
0, "test6");
|
||||
checkOffsetsFromPoint(Math.round(test6Rect.left + test6Rect.width - 30),
|
||||
Math.round(test6Rect.top + (test6Rect.height / 2)),
|
||||
5, "test6");
|
||||
|
||||
SimpleTest.finish();
|
||||
}
|
||||
|
||||
|
@ -108,5 +118,6 @@
|
|||
<marquee>marquee</marquee>
|
||||
</div>
|
||||
<input id="test5" value="The rabbit-hole went straight on like a tunnel for some way, and then dipped suddenly down, so suddenly that Alice had not a moment to think about stopping herself before she found herself falling down a very deep well. Either the well was very deep, or she fell very slowly, for she had plenty of time as she went down to look about her and to wonder what was going to happen next. First, she tried to look down and make out what she was coming to, but it was too dark to see anything; then she looked at the sides of the well, and noticed that they were filled with cupboards and book-shelves; here and there she saw maps and pictures hung upon pegs. She took down a jar from one of the shelves as she passed; it was labelled `ORANGE MARMALADE', but to her great disappointment it was empty: she did not like to drop the jar for fear of killing somebody, so managed to put it into one of the cupboards as she fell past it." type="text">
|
||||
<input id="test6" type="number" style="width:150px; height:57px;" value="31415"><br>
|
||||
</body>
|
||||
</html>
|
||||
|
|
|
@ -35,6 +35,7 @@
|
|||
#include "mozilla/dom/Element.h"
|
||||
#include "mozilla/dom/SVGTitleElement.h"
|
||||
#include "nsIDOMEvent.h"
|
||||
#include "nsIDOMFileList.h"
|
||||
#include "nsIDOMMouseEvent.h"
|
||||
#include "nsIFormControl.h"
|
||||
#include "nsIDOMHTMLInputElement.h"
|
||||
|
@ -48,6 +49,7 @@
|
|||
#include "nsIWebNavigation.h"
|
||||
#include "nsIDOMHTMLElement.h"
|
||||
#include "nsIPresShell.h"
|
||||
#include "nsIStringBundle.h"
|
||||
#include "nsPIDOMWindow.h"
|
||||
#include "nsPIWindowRoot.h"
|
||||
#include "nsIDOMWindowCollection.h"
|
||||
|
@ -68,6 +70,8 @@
|
|||
#include "mozilla/Attributes.h"
|
||||
#include "mozilla/EventListenerManager.h"
|
||||
#include "mozilla/dom/Event.h" // for nsIDOMEvent::InternalDOMEvent()
|
||||
#include "mozilla/dom/File.h" // for input type=file
|
||||
#include "mozilla/dom/FileList.h" // for input type=file
|
||||
|
||||
using namespace mozilla;
|
||||
using namespace mozilla::dom;
|
||||
|
@ -1071,9 +1075,7 @@ public:
|
|||
protected:
|
||||
~DefaultTooltipTextProvider() {}
|
||||
|
||||
nsCOMPtr<nsIAtom> mTag_dialog;
|
||||
nsCOMPtr<nsIAtom> mTag_dialogheader;
|
||||
nsCOMPtr<nsIAtom> mTag_window;
|
||||
nsCOMPtr<nsIAtom> mTag_dialogHeader;
|
||||
};
|
||||
|
||||
NS_IMPL_ISUPPORTS(DefaultTooltipTextProvider, nsITooltipTextProvider)
|
||||
|
@ -1082,9 +1084,7 @@ DefaultTooltipTextProvider::DefaultTooltipTextProvider()
|
|||
{
|
||||
// There are certain element types which we don't want to use
|
||||
// as tool tip text.
|
||||
mTag_dialog = do_GetAtom("dialog");
|
||||
mTag_dialogheader = do_GetAtom("dialogheader");
|
||||
mTag_window = do_GetAtom("window");
|
||||
mTag_dialogHeader = do_GetAtom("dialogheader");
|
||||
}
|
||||
|
||||
// A helper routine that determines whether we're still interested in SVG
|
||||
|
@ -1142,13 +1142,66 @@ DefaultTooltipTextProvider::GetNodeText(nsIDOMNode* aNode, char16_t** aText,
|
|||
if (currElement) {
|
||||
nsCOMPtr<nsIContent> content(do_QueryInterface(currElement));
|
||||
if (content) {
|
||||
if (!content->IsAnyOfXULElements(mTag_dialog,
|
||||
mTag_dialogheader,
|
||||
mTag_window)) {
|
||||
if (!content->IsAnyOfXULElements(nsGkAtoms::dialog,
|
||||
mTag_dialogHeader,
|
||||
nsGkAtoms::window)) {
|
||||
// first try the normal title attribute...
|
||||
if (!content->IsSVGElement()) {
|
||||
currElement->GetAttribute(NS_LITERAL_STRING("title"), outText);
|
||||
if (outText.Length()) {
|
||||
// If the element is an <input type="file"> without a title,
|
||||
// we should show the current file selection.
|
||||
if (content->IsHTMLElement(nsGkAtoms::input) &&
|
||||
content->AttrValueIs(kNameSpaceID_None, nsGkAtoms::type,
|
||||
NS_LITERAL_STRING("file"), eIgnoreCase) &&
|
||||
!content->HasAttr(kNameSpaceID_None, nsGkAtoms::title)) {
|
||||
found = true;
|
||||
nsCOMPtr<nsIDOMFileList> fileList;
|
||||
nsCOMPtr<nsIDOMHTMLInputElement> currInputElement(do_QueryInterface(currElement));
|
||||
nsresult rv = currInputElement->GetFiles(getter_AddRefs(fileList));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (!fileList) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIStringBundleService> bundleService =
|
||||
mozilla::services::GetStringBundleService();
|
||||
if (!bundleService) {
|
||||
return NS_ERROR_FAILURE;
|
||||
}
|
||||
|
||||
nsCOMPtr<nsIStringBundle> bundle;
|
||||
rv = bundleService->CreateBundle("chrome://global/locale/layout/HtmlForm.properties",
|
||||
getter_AddRefs(bundle));
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
uint32_t listLength = 0;
|
||||
rv = fileList->GetLength(&listLength);
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
if (listLength == 0) {
|
||||
if (content->HasAttr(kNameSpaceID_None, nsGkAtoms::multiple)) {
|
||||
rv = bundle->GetStringFromName(MOZ_UTF16("NoFilesSelected"),
|
||||
getter_Copies(outText));
|
||||
} else {
|
||||
rv = bundle->GetStringFromName(MOZ_UTF16("NoFileSelected"),
|
||||
getter_Copies(outText));
|
||||
}
|
||||
NS_ENSURE_SUCCESS(rv, rv);
|
||||
} else {
|
||||
FileList* fl = static_cast<FileList*>(fileList.get());
|
||||
fl->Item(0)->GetName(outText);
|
||||
|
||||
// For UX and performance (jank) reasons we cap the number of
|
||||
// files that we list in the tooltip to 20 plus a "and xxx more"
|
||||
// line, or to 21 if exactly 21 files were picked.
|
||||
const uint32_t TRUNCATED_FILE_COUNT = 20;
|
||||
uint32_t count = std::min(listLength, TRUNCATED_FILE_COUNT);
|
||||
for (uint32_t i = 1; i < count; ++i) {
|
||||
nsString fileName;
|
||||
fl->Item(i)->GetName(fileName);
|
||||
outText.Append(NS_LITERAL_STRING("\n"));
|
||||
outText.Append(fileName);
|
||||
}
|
||||
}
|
||||
} else if (NS_SUCCEEDED(currElement->GetAttribute(NS_LITERAL_STRING("title"), outText)) &&
|
||||
outText.Length()) {
|
||||
found = true;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -840,6 +840,18 @@ var BrowserApp = {
|
|||
aTarget.muted = false;
|
||||
});
|
||||
|
||||
NativeWindow.contextmenus.add(stringGetter("contextmenu.viewImage"),
|
||||
NativeWindow.contextmenus.imageLocationCopyableContext,
|
||||
function(aTarget) {
|
||||
let url = aTarget.src;
|
||||
ContentAreaUtils.urlSecurityCheck(url, aTarget.ownerDocument.nodePrincipal,
|
||||
Ci.nsIScriptSecurityManager.DISALLOW_SCRIPT);
|
||||
|
||||
UITelemetry.addEvent("action.1", "contextmenu", null, "web_view_image");
|
||||
UITelemetry.addEvent("loadurl.1", "contextmenu", null);
|
||||
BrowserApp.selectedBrowser.loadURI(url);
|
||||
});
|
||||
|
||||
NativeWindow.contextmenus.add(stringGetter("contextmenu.copyImageLocation"),
|
||||
NativeWindow.contextmenus.imageLocationCopyableContext,
|
||||
function(aTarget) {
|
||||
|
|
|
@ -1,22 +0,0 @@
|
|||
. "$topsrcdir/mobile/android/config/mozconfigs/common"
|
||||
|
||||
# Global options
|
||||
ac_add_options --enable-debug
|
||||
|
||||
# Android
|
||||
ac_add_options --with-android-min-sdk=9
|
||||
ac_add_options --with-android-max-sdk=10
|
||||
ac_add_options --enable-android-resource-constrained
|
||||
export MOZ_DISABLE_GECKOVIEW=1
|
||||
|
||||
ac_add_options --target=arm-linux-androideabi
|
||||
|
||||
export MOZILLA_OFFICIAL=1
|
||||
export MOZ_TELEMETRY_REPORTING=1
|
||||
|
||||
ac_add_options --with-branding=mobile/android/branding/nightly
|
||||
|
||||
# Treat warnings as errors (modulo ALLOW_COMPILER_WARNINGS).
|
||||
ac_add_options --enable-warnings-as-errors
|
||||
|
||||
. "$topsrcdir/mobile/android/config/mozconfigs/common.override"
|
|
@ -1,26 +0,0 @@
|
|||
. "$topsrcdir/mobile/android/config/mozconfigs/common"
|
||||
|
||||
# L10n
|
||||
ac_add_options --with-l10n-base=../../l10n-central
|
||||
|
||||
# Global options
|
||||
ac_add_options --disable-tests
|
||||
|
||||
# Android
|
||||
ac_add_options --with-android-min-sdk=9
|
||||
ac_add_options --with-android-max-sdk=10
|
||||
ac_add_options --enable-android-resource-constrained
|
||||
ac_add_options --target=arm-linux-androideabi
|
||||
|
||||
ac_add_options --with-system-zlib
|
||||
ac_add_options --enable-updater
|
||||
ac_add_options --enable-update-channel=${MOZ_UPDATE_CHANNEL}
|
||||
|
||||
export MOZILLA_OFFICIAL=1
|
||||
export MOZ_DISABLE_GECKOVIEW=1
|
||||
|
||||
ac_add_options --with-branding=mobile/android/branding/nightly
|
||||
|
||||
ac_add_options --disable-stdcxx-compat
|
||||
|
||||
. "$topsrcdir/mobile/android/config/mozconfigs/common.override"
|
|
@ -1,27 +0,0 @@
|
|||
. "$topsrcdir/mobile/android/config/mozconfigs/common"
|
||||
|
||||
# L10n
|
||||
ac_add_options --with-l10n-base=..
|
||||
|
||||
# Global options
|
||||
ac_add_options --disable-tests
|
||||
|
||||
# Android
|
||||
ac_add_options --with-android-min-sdk=9
|
||||
ac_add_options --with-android-max-sdk=10
|
||||
ac_add_options --enable-android-resource-constrained
|
||||
ac_add_options --target=arm-linux-androideabi
|
||||
|
||||
ac_add_options --with-system-zlib
|
||||
ac_add_options --enable-updater
|
||||
ac_add_options --enable-update-channel=${MOZ_UPDATE_CHANNEL}
|
||||
|
||||
export MOZILLA_OFFICIAL=1
|
||||
export MOZ_DISABLE_GECKOVIEW=1
|
||||
|
||||
ac_add_options --enable-official-branding
|
||||
ac_add_options --with-branding=mobile/android/branding/beta
|
||||
|
||||
ac_add_options --disable-stdcxx-compat
|
||||
|
||||
. "$topsrcdir/mobile/android/config/mozconfigs/common.override"
|
|
@ -1,22 +0,0 @@
|
|||
. "$topsrcdir/mobile/android/config/mozconfigs/common"
|
||||
|
||||
ac_add_options --enable-profiling
|
||||
|
||||
# Android
|
||||
ac_add_options --with-android-min-sdk=9
|
||||
ac_add_options --with-android-max-sdk=10
|
||||
ac_add_options --enable-android-resource-constrained
|
||||
export MOZ_DISABLE_GECKOVIEW=1
|
||||
|
||||
ac_add_options --target=arm-linux-androideabi
|
||||
|
||||
ac_add_options --with-branding=mobile/android/branding/nightly
|
||||
|
||||
# This will overwrite the default of stripping everything and keep the symbol table.
|
||||
# This is useful for profiling with eideticker. See bug 788680
|
||||
STRIP_FLAGS="--strip-debug"
|
||||
|
||||
export MOZILLA_OFFICIAL=1
|
||||
export MOZ_TELEMETRY_REPORTING=1
|
||||
|
||||
. "$topsrcdir/mobile/android/config/mozconfigs/common.override"
|
|
@ -1,20 +0,0 @@
|
|||
. "$topsrcdir/mobile/android/config/mozconfigs/common"
|
||||
|
||||
# Android
|
||||
ac_add_options --with-android-min-sdk=9
|
||||
ac_add_options --with-android-max-sdk=10
|
||||
ac_add_options --enable-android-resource-constrained
|
||||
export MOZ_DISABLE_GECKOVIEW=1
|
||||
|
||||
ac_add_options --target=arm-linux-androideabi
|
||||
|
||||
ac_add_options --with-branding=mobile/android/branding/beta
|
||||
|
||||
ac_add_options --enable-updater
|
||||
|
||||
export MOZILLA_OFFICIAL=1
|
||||
export MOZ_TELEMETRY_REPORTING=1
|
||||
|
||||
ac_add_options --enable-official-branding
|
||||
|
||||
. "$topsrcdir/mobile/android/config/mozconfigs/common.override"
|
|
@ -253,6 +253,7 @@ contextmenu.copyPhoneNumber=Copy Phone Number
|
|||
contextmenu.sharePhoneNumber=Share Phone Number
|
||||
contextmenu.changeInputMethod=Select Input Method
|
||||
contextmenu.fullScreen=Full Screen
|
||||
contextmenu.viewImage=View Image
|
||||
contextmenu.copyImageLocation=Copy Image Location
|
||||
contextmenu.shareImage=Share Image
|
||||
# LOCALIZATION NOTE (contextmenu.search):
|
||||
|
|
|
@ -6,6 +6,8 @@ package org.mozilla.gecko.tests;
|
|||
|
||||
import org.mozilla.gecko.Actions;
|
||||
import org.mozilla.gecko.util.Clipboard;
|
||||
import org.mozilla.gecko.Element;
|
||||
import org.mozilla.gecko.R;
|
||||
|
||||
import android.util.DisplayMetrics;
|
||||
|
||||
|
@ -102,6 +104,26 @@ abstract class ContentContextMenuTest extends PixelTest {
|
|||
waitForText(pageTitle);
|
||||
}
|
||||
|
||||
protected void verifyViewImageOption(String viewImageOption, final String imageUrl, String pageTitle) {
|
||||
if (!mSolo.searchText(viewImageOption)) {
|
||||
openWebContentContextMenu(viewImageOption);
|
||||
}
|
||||
mSolo.clickOnText(viewImageOption);
|
||||
|
||||
boolean viewedImage = waitForCondition(new Condition() {
|
||||
@Override
|
||||
public boolean isSatisfied() {
|
||||
final Element urlBarElement = mDriver.findElement(getActivity(), R.id.url_edit_text);
|
||||
final String loadedUrl = urlBarElement.getText();
|
||||
return loadedUrl.contentEquals(imageUrl);
|
||||
}
|
||||
}, MAX_TEST_TIMEOUT);
|
||||
mAsserter.ok(viewedImage, "Checking if the image is correctly viewed", "The image was correctly viewed");
|
||||
|
||||
mSolo.goBack();
|
||||
waitForText(pageTitle);
|
||||
}
|
||||
|
||||
protected void verifyBookmarkLinkOption(String bookmarkOption, String link) {
|
||||
if (!mSolo.searchText(bookmarkOption)) {
|
||||
openWebContentContextMenu(bookmarkOption); // Open the context menu if it is not already
|
||||
|
|
|
@ -88,6 +88,9 @@ public class StringHelper {
|
|||
|
||||
private final String ROBOCOP_JS_HARNESS_URL = "/robocop/robocop_javascript.html";
|
||||
|
||||
// Robocop page images
|
||||
public final String ROBOCOP_PICTURE_URL = "/robocop/Firefox.jpg";
|
||||
|
||||
// Robocop page titles
|
||||
public final String ROBOCOP_BIG_LINK_TITLE = "Big Link";
|
||||
public final String ROBOCOP_BIG_MAILTO_TITLE = "Big Mailto";
|
||||
|
|
|
@ -9,8 +9,9 @@ public class testPictureLinkContextMenu extends ContentContextMenuTest {
|
|||
// Test website strings
|
||||
private static String PICTURE_PAGE_URL;
|
||||
private static String BLANK_PAGE_URL;
|
||||
private static String PICTURE_URL;
|
||||
private static final String tabs [] = { "Image", "Link" };
|
||||
private static final String photoMenuItems [] = { "Copy Image Location", "Share Image", "Set Image As", "Save Image" };
|
||||
private static final String photoMenuItems [] = { "Copy Image Location", "Share Image", "View Image", "Set Image As", "Save Image" };
|
||||
private static final String imageTitle = "^Image$";
|
||||
|
||||
public void testPictureLinkContextMenu() {
|
||||
|
@ -21,6 +22,7 @@ public class testPictureLinkContextMenu extends ContentContextMenuTest {
|
|||
|
||||
PICTURE_PAGE_URL=getAbsoluteUrl(mStringHelper.ROBOCOP_PICTURE_LINK_URL);
|
||||
BLANK_PAGE_URL=getAbsoluteUrl(mStringHelper.ROBOCOP_BLANK_PAGE_02_URL);
|
||||
PICTURE_URL=getAbsoluteUrl(mStringHelper.ROBOCOP_PICTURE_URL);
|
||||
loadAndPaint(PICTURE_PAGE_URL);
|
||||
verifyUrlInContentDescription(PICTURE_PAGE_URL);
|
||||
|
||||
|
@ -31,6 +33,8 @@ public class testPictureLinkContextMenu extends ContentContextMenuTest {
|
|||
verifyCopyOption(photoMenuItems[0], "Firefox.jpg"); // Test the "Copy Image Location" option
|
||||
switchTabs(imageTitle);
|
||||
verifyShareOption(photoMenuItems[1], PICTURE_PAGE_TITLE); // Test the "Share Image" option
|
||||
switchTabs(imageTitle);
|
||||
verifyViewImageOption(photoMenuItems[2], PICTURE_URL, PICTURE_PAGE_TITLE); // Test the "View Image" option
|
||||
|
||||
verifyContextMenuItems(linkMenuItems);
|
||||
openTabFromContextMenu(linkMenuItems[0],2); // Test the "Open in New Tab" option - expecting 2 tabs: the original and the new one
|
||||
|
|
|
@ -57,9 +57,6 @@ DIRS += [
|
|||
'mozglue',
|
||||
]
|
||||
|
||||
if CONFIG['MOZ_WIDGET_TOOLKIT'] == 'android' and int(CONFIG['MOZ_ANDROID_MIN_SDK_VERSION']) < 11:
|
||||
DIRS += ['other-licenses/android']
|
||||
|
||||
if not CONFIG['JS_STANDALONE']:
|
||||
DIRS += ['xpcom/xpidl']
|
||||
|
||||
|
|
|
@ -6254,13 +6254,11 @@ fi
|
|||
|
||||
dnl We need to wrap dlopen and related functions on Android because we use
|
||||
dnl our own linker.
|
||||
dnl This configuration will only work on Android SDK 11 and above: Bug 1220184.
|
||||
if test "$OS_TARGET" = Android; then
|
||||
if test "$MOZ_WIDGET_TOOLKIT" = gonk -a -n "$MOZ_NUWA_PROCESS"; then
|
||||
MOZ_GLUE_WRAP_LDFLAGS="${MOZ_GLUE_WRAP_LDFLAGS} -Wl,--wrap=pthread_create,--wrap=epoll_wait,--wrap=poll,--wrap=pthread_cond_timedwait,--wrap=pthread_cond_wait,--wrap=epoll_create,--wrap=epoll_ctl,--wrap=close,--wrap=pthread_key_create,--wrap=pthread_key_delete,--wrap=socketpair,--wrap=pthread_self,--wrap=pthread_mutex_lock,--wrap=pthread_mutex_trylock,--wrap=pthread_join,--wrap=pipe,--wrap=pipe2"
|
||||
fi
|
||||
if test "$MOZ_WIDGET_TOOLKIT" = android -a "$MOZ_ANDROID_MIN_SDK_VERSION" -lt 11; then
|
||||
MOZ_GLUE_WRAP_LDFLAGS="${MOZ_GLUE_WRAP_LDFLAGS} -Wl,--wrap=getaddrinfo,--wrap=freeaddrinfo,--wrap=gai_strerror"
|
||||
fi
|
||||
fi
|
||||
|
||||
AC_SUBST_LIST(MOZ_GLUE_WRAP_LDFLAGS)
|
||||
|
|
|
@ -1,587 +0,0 @@
|
|||
/* $NetBSD: nameser.h,v 1.19 2005/12/26 19:01:47 perry Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1989, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
* 3. Neither the name of the University 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 REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1996-1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Id: nameser.h,v 1.2.2.4.4.1 2004/03/09 08:33:30 marka Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _ARPA_NAMESER_H_
|
||||
#define _ARPA_NAMESER_H_
|
||||
|
||||
#define BIND_4_COMPAT
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/cdefs.h>
|
||||
|
||||
/*
|
||||
* Revision information. This is the release date in YYYYMMDD format.
|
||||
* It can change every day so the right thing to do with it is use it
|
||||
* in preprocessor commands such as "#if (__NAMESER > 19931104)". Do not
|
||||
* compare for equality; rather, use it to determine whether your libbind.a
|
||||
* contains a new enough lib/nameser/ to support the feature you need.
|
||||
*/
|
||||
|
||||
#define __NAMESER 19991006 /* New interface version stamp. */
|
||||
|
||||
/*
|
||||
* Define constants based on RFC 883, RFC 1034, RFC 1035
|
||||
*/
|
||||
#define NS_PACKETSZ 512 /* default UDP packet size */
|
||||
#define NS_MAXDNAME 1025 /* maximum domain name */
|
||||
#define NS_MAXMSG 65535 /* maximum message size */
|
||||
#define NS_MAXCDNAME 255 /* maximum compressed domain name */
|
||||
#define NS_MAXLABEL 63 /* maximum length of domain label */
|
||||
#define NS_HFIXEDSZ 12 /* #/bytes of fixed data in header */
|
||||
#define NS_QFIXEDSZ 4 /* #/bytes of fixed data in query */
|
||||
#define NS_RRFIXEDSZ 10 /* #/bytes of fixed data in r record */
|
||||
#define NS_INT32SZ 4 /* #/bytes of data in a uint32_t */
|
||||
#define NS_INT16SZ 2 /* #/bytes of data in a uint16_t */
|
||||
#define NS_INT8SZ 1 /* #/bytes of data in a uint8_t */
|
||||
#define NS_INADDRSZ 4 /* IPv4 T_A */
|
||||
#define NS_IN6ADDRSZ 16 /* IPv6 T_AAAA */
|
||||
#define NS_CMPRSFLGS 0xc0 /* Flag bits indicating name compression. */
|
||||
#define NS_DEFAULTPORT 53 /* For both TCP and UDP. */
|
||||
|
||||
/*
|
||||
* These can be expanded with synonyms, just keep ns_parse.c:ns_parserecord()
|
||||
* in synch with it.
|
||||
*/
|
||||
typedef enum __ns_sect {
|
||||
ns_s_qd = 0, /* Query: Question. */
|
||||
ns_s_zn = 0, /* Update: Zone. */
|
||||
ns_s_an = 1, /* Query: Answer. */
|
||||
ns_s_pr = 1, /* Update: Prerequisites. */
|
||||
ns_s_ns = 2, /* Query: Name servers. */
|
||||
ns_s_ud = 2, /* Update: Update. */
|
||||
ns_s_ar = 3, /* Query|Update: Additional records. */
|
||||
ns_s_max = 4
|
||||
} ns_sect;
|
||||
|
||||
/*
|
||||
* This is a message handle. It is caller allocated and has no dynamic data.
|
||||
* This structure is intended to be opaque to all but ns_parse.c, thus the
|
||||
* leading _'s on the member names. Use the accessor functions, not the _'s.
|
||||
*/
|
||||
typedef struct __ns_msg {
|
||||
const u_char *_msg, *_eom;
|
||||
uint16_t _id, _flags, _counts[ns_s_max];
|
||||
const u_char *_sections[ns_s_max];
|
||||
ns_sect _sect;
|
||||
int _rrnum;
|
||||
const u_char *_msg_ptr;
|
||||
} ns_msg;
|
||||
|
||||
/* Private data structure - do not use from outside library. */
|
||||
struct _ns_flagdata { int mask, shift; };
|
||||
extern const struct _ns_flagdata _ns_flagdata[];
|
||||
|
||||
/* Accessor macros - this is part of the public interface. */
|
||||
|
||||
#define ns_msg_id(handle) ((handle)._id + 0)
|
||||
#define ns_msg_base(handle) ((handle)._msg + 0)
|
||||
#define ns_msg_end(handle) ((handle)._eom + 0)
|
||||
#define ns_msg_size(handle) ((size_t)((handle)._eom - (handle)._msg))
|
||||
#define ns_msg_count(handle, section) ((handle)._counts[section] + 0)
|
||||
|
||||
/*
|
||||
* This is a parsed record. It is caller allocated and has no dynamic data.
|
||||
*/
|
||||
typedef struct __ns_rr {
|
||||
char name[NS_MAXDNAME];
|
||||
uint16_t type;
|
||||
uint16_t rr_class;
|
||||
uint32_t ttl;
|
||||
uint16_t rdlength;
|
||||
const u_char * rdata;
|
||||
} ns_rr;
|
||||
|
||||
/* Accessor macros - this is part of the public interface. */
|
||||
#define ns_rr_name(rr) (((rr).name[0] != '\0') ? (rr).name : ".")
|
||||
#define ns_rr_type(rr) ((ns_type)((rr).type + 0))
|
||||
#define ns_rr_class(rr) ((ns_class)((rr).rr_class + 0))
|
||||
#define ns_rr_ttl(rr) ((u_long)(rr).ttl + 0)
|
||||
#define ns_rr_rdlen(rr) ((size_t)(rr).rdlength + 0)
|
||||
#define ns_rr_rdata(rr) ((rr).rdata + 0)
|
||||
|
||||
/*
|
||||
* These don't have to be in the same order as in the packet flags word,
|
||||
* and they can even overlap in some cases, but they will need to be kept
|
||||
* in synch with ns_parse.c:ns_flagdata[].
|
||||
*/
|
||||
typedef enum __ns_flag {
|
||||
ns_f_qr, /* Question/Response. */
|
||||
ns_f_opcode, /* Operation code. */
|
||||
ns_f_aa, /* Authoritative Answer. */
|
||||
ns_f_tc, /* Truncation occurred. */
|
||||
ns_f_rd, /* Recursion Desired. */
|
||||
ns_f_ra, /* Recursion Available. */
|
||||
ns_f_z, /* MBZ. */
|
||||
ns_f_ad, /* Authentic Data (DNSSEC). */
|
||||
ns_f_cd, /* Checking Disabled (DNSSEC). */
|
||||
ns_f_rcode, /* Response code. */
|
||||
ns_f_max
|
||||
} ns_flag;
|
||||
|
||||
/*
|
||||
* Currently defined opcodes.
|
||||
*/
|
||||
typedef enum __ns_opcode {
|
||||
ns_o_query = 0, /* Standard query. */
|
||||
ns_o_iquery = 1, /* Inverse query (deprecated/unsupported). */
|
||||
ns_o_status = 2, /* Name server status query (unsupported). */
|
||||
/* Opcode 3 is undefined/reserved. */
|
||||
ns_o_notify = 4, /* Zone change notification. */
|
||||
ns_o_update = 5, /* Zone update message. */
|
||||
ns_o_max = 6
|
||||
} ns_opcode;
|
||||
|
||||
/*
|
||||
* Currently defined response codes.
|
||||
*/
|
||||
typedef enum __ns_rcode {
|
||||
ns_r_noerror = 0, /* No error occurred. */
|
||||
ns_r_formerr = 1, /* Format error. */
|
||||
ns_r_servfail = 2, /* Server failure. */
|
||||
ns_r_nxdomain = 3, /* Name error. */
|
||||
ns_r_notimpl = 4, /* Unimplemented. */
|
||||
ns_r_refused = 5, /* Operation refused. */
|
||||
/* these are for BIND_UPDATE */
|
||||
ns_r_yxdomain = 6, /* Name exists */
|
||||
ns_r_yxrrset = 7, /* RRset exists */
|
||||
ns_r_nxrrset = 8, /* RRset does not exist */
|
||||
ns_r_notauth = 9, /* Not authoritative for zone */
|
||||
ns_r_notzone = 10, /* Zone of record different from zone section */
|
||||
ns_r_max = 11,
|
||||
/* The following are EDNS extended rcodes */
|
||||
ns_r_badvers = 16,
|
||||
/* The following are TSIG errors */
|
||||
ns_r_badsig = 16,
|
||||
ns_r_badkey = 17,
|
||||
ns_r_badtime = 18
|
||||
} ns_rcode;
|
||||
|
||||
/* BIND_UPDATE */
|
||||
typedef enum __ns_update_operation {
|
||||
ns_uop_delete = 0,
|
||||
ns_uop_add = 1,
|
||||
ns_uop_max = 2
|
||||
} ns_update_operation;
|
||||
|
||||
/*
|
||||
* This structure is used for TSIG authenticated messages
|
||||
*/
|
||||
struct ns_tsig_key {
|
||||
char name[NS_MAXDNAME], alg[NS_MAXDNAME];
|
||||
unsigned char *data;
|
||||
int len;
|
||||
};
|
||||
typedef struct ns_tsig_key ns_tsig_key;
|
||||
|
||||
/*
|
||||
* This structure is used for TSIG authenticated TCP messages
|
||||
*/
|
||||
struct ns_tcp_tsig_state {
|
||||
int counter;
|
||||
struct dst_key *key;
|
||||
void *ctx;
|
||||
unsigned char sig[NS_PACKETSZ];
|
||||
int siglen;
|
||||
};
|
||||
typedef struct ns_tcp_tsig_state ns_tcp_tsig_state;
|
||||
|
||||
#define NS_TSIG_FUDGE 300
|
||||
#define NS_TSIG_TCP_COUNT 100
|
||||
#define NS_TSIG_ALG_HMAC_MD5 "HMAC-MD5.SIG-ALG.REG.INT"
|
||||
|
||||
#define NS_TSIG_ERROR_NO_TSIG -10
|
||||
#define NS_TSIG_ERROR_NO_SPACE -11
|
||||
#define NS_TSIG_ERROR_FORMERR -12
|
||||
|
||||
/*
|
||||
* Currently defined type values for resources and queries.
|
||||
*/
|
||||
typedef enum __ns_type {
|
||||
ns_t_invalid = 0, /* Cookie. */
|
||||
ns_t_a = 1, /* Host address. */
|
||||
ns_t_ns = 2, /* Authoritative server. */
|
||||
ns_t_md = 3, /* Mail destination. */
|
||||
ns_t_mf = 4, /* Mail forwarder. */
|
||||
ns_t_cname = 5, /* Canonical name. */
|
||||
ns_t_soa = 6, /* Start of authority zone. */
|
||||
ns_t_mb = 7, /* Mailbox domain name. */
|
||||
ns_t_mg = 8, /* Mail group member. */
|
||||
ns_t_mr = 9, /* Mail rename name. */
|
||||
ns_t_null = 10, /* Null resource record. */
|
||||
ns_t_wks = 11, /* Well known service. */
|
||||
ns_t_ptr = 12, /* Domain name pointer. */
|
||||
ns_t_hinfo = 13, /* Host information. */
|
||||
ns_t_minfo = 14, /* Mailbox information. */
|
||||
ns_t_mx = 15, /* Mail routing information. */
|
||||
ns_t_txt = 16, /* Text strings. */
|
||||
ns_t_rp = 17, /* Responsible person. */
|
||||
ns_t_afsdb = 18, /* AFS cell database. */
|
||||
ns_t_x25 = 19, /* X_25 calling address. */
|
||||
ns_t_isdn = 20, /* ISDN calling address. */
|
||||
ns_t_rt = 21, /* Router. */
|
||||
ns_t_nsap = 22, /* NSAP address. */
|
||||
ns_t_nsap_ptr = 23, /* Reverse NSAP lookup (deprecated). */
|
||||
ns_t_sig = 24, /* Security signature. */
|
||||
ns_t_key = 25, /* Security key. */
|
||||
ns_t_px = 26, /* X.400 mail mapping. */
|
||||
ns_t_gpos = 27, /* Geographical position (withdrawn). */
|
||||
ns_t_aaaa = 28, /* Ip6 Address. */
|
||||
ns_t_loc = 29, /* Location Information. */
|
||||
ns_t_nxt = 30, /* Next domain (security). */
|
||||
ns_t_eid = 31, /* Endpoint identifier. */
|
||||
ns_t_nimloc = 32, /* Nimrod Locator. */
|
||||
ns_t_srv = 33, /* Server Selection. */
|
||||
ns_t_atma = 34, /* ATM Address */
|
||||
ns_t_naptr = 35, /* Naming Authority PoinTeR */
|
||||
ns_t_kx = 36, /* Key Exchange */
|
||||
ns_t_cert = 37, /* Certification record */
|
||||
ns_t_a6 = 38, /* IPv6 address (deprecates AAAA) */
|
||||
ns_t_dname = 39, /* Non-terminal DNAME (for IPv6) */
|
||||
ns_t_sink = 40, /* Kitchen sink (experimentatl) */
|
||||
ns_t_opt = 41, /* EDNS0 option (meta-RR) */
|
||||
ns_t_apl = 42, /* Address prefix list (RFC 3123) */
|
||||
ns_t_tkey = 249, /* Transaction key */
|
||||
ns_t_tsig = 250, /* Transaction signature. */
|
||||
ns_t_ixfr = 251, /* Incremental zone transfer. */
|
||||
ns_t_axfr = 252, /* Transfer zone of authority. */
|
||||
ns_t_mailb = 253, /* Transfer mailbox records. */
|
||||
ns_t_maila = 254, /* Transfer mail agent records. */
|
||||
ns_t_any = 255, /* Wildcard match. */
|
||||
ns_t_zxfr = 256, /* BIND-specific, nonstandard. */
|
||||
ns_t_max = 65536
|
||||
} ns_type;
|
||||
|
||||
/* Exclusively a QTYPE? (not also an RTYPE) */
|
||||
#define ns_t_qt_p(t) (ns_t_xfr_p(t) || (t) == ns_t_any || \
|
||||
(t) == ns_t_mailb || (t) == ns_t_maila)
|
||||
/* Some kind of meta-RR? (not a QTYPE, but also not an RTYPE) */
|
||||
#define ns_t_mrr_p(t) ((t) == ns_t_tsig || (t) == ns_t_opt)
|
||||
/* Exclusively an RTYPE? (not also a QTYPE or a meta-RR) */
|
||||
#define ns_t_rr_p(t) (!ns_t_qt_p(t) && !ns_t_mrr_p(t))
|
||||
#define ns_t_udp_p(t) ((t) != ns_t_axfr && (t) != ns_t_zxfr)
|
||||
#define ns_t_xfr_p(t) ((t) == ns_t_axfr || (t) == ns_t_ixfr || \
|
||||
(t) == ns_t_zxfr)
|
||||
|
||||
/*
|
||||
* Values for class field
|
||||
*/
|
||||
typedef enum __ns_class {
|
||||
ns_c_invalid = 0, /* Cookie. */
|
||||
ns_c_in = 1, /* Internet. */
|
||||
ns_c_2 = 2, /* unallocated/unsupported. */
|
||||
ns_c_chaos = 3, /* MIT Chaos-net. */
|
||||
ns_c_hs = 4, /* MIT Hesiod. */
|
||||
/* Query class values which do not appear in resource records */
|
||||
ns_c_none = 254, /* for prereq. sections in update requests */
|
||||
ns_c_any = 255, /* Wildcard match. */
|
||||
ns_c_max = 65536
|
||||
} ns_class;
|
||||
|
||||
/* DNSSEC constants. */
|
||||
|
||||
typedef enum __ns_key_types {
|
||||
ns_kt_rsa = 1, /* key type RSA/MD5 */
|
||||
ns_kt_dh = 2, /* Diffie Hellman */
|
||||
ns_kt_dsa = 3, /* Digital Signature Standard (MANDATORY) */
|
||||
ns_kt_private = 254 /* Private key type starts with OID */
|
||||
} ns_key_types;
|
||||
|
||||
typedef enum __ns_cert_types {
|
||||
cert_t_pkix = 1, /* PKIX (X.509v3) */
|
||||
cert_t_spki = 2, /* SPKI */
|
||||
cert_t_pgp = 3, /* PGP */
|
||||
cert_t_url = 253, /* URL private type */
|
||||
cert_t_oid = 254 /* OID private type */
|
||||
} ns_cert_types;
|
||||
|
||||
/* Flags field of the KEY RR rdata. */
|
||||
#define NS_KEY_TYPEMASK 0xC000 /* Mask for "type" bits */
|
||||
#define NS_KEY_TYPE_AUTH_CONF 0x0000 /* Key usable for both */
|
||||
#define NS_KEY_TYPE_CONF_ONLY 0x8000 /* Key usable for confidentiality */
|
||||
#define NS_KEY_TYPE_AUTH_ONLY 0x4000 /* Key usable for authentication */
|
||||
#define NS_KEY_TYPE_NO_KEY 0xC000 /* No key usable for either; no key */
|
||||
/* The type bits can also be interpreted independently, as single bits: */
|
||||
#define NS_KEY_NO_AUTH 0x8000 /* Key unusable for authentication */
|
||||
#define NS_KEY_NO_CONF 0x4000 /* Key unusable for confidentiality */
|
||||
#define NS_KEY_RESERVED2 0x2000 /* Security is *mandatory* if bit=0 */
|
||||
#define NS_KEY_EXTENDED_FLAGS 0x1000 /* reserved - must be zero */
|
||||
#define NS_KEY_RESERVED4 0x0800 /* reserved - must be zero */
|
||||
#define NS_KEY_RESERVED5 0x0400 /* reserved - must be zero */
|
||||
#define NS_KEY_NAME_TYPE 0x0300 /* these bits determine the type */
|
||||
#define NS_KEY_NAME_USER 0x0000 /* key is assoc. with user */
|
||||
#define NS_KEY_NAME_ENTITY 0x0200 /* key is assoc. with entity eg host */
|
||||
#define NS_KEY_NAME_ZONE 0x0100 /* key is zone key */
|
||||
#define NS_KEY_NAME_RESERVED 0x0300 /* reserved meaning */
|
||||
#define NS_KEY_RESERVED8 0x0080 /* reserved - must be zero */
|
||||
#define NS_KEY_RESERVED9 0x0040 /* reserved - must be zero */
|
||||
#define NS_KEY_RESERVED10 0x0020 /* reserved - must be zero */
|
||||
#define NS_KEY_RESERVED11 0x0010 /* reserved - must be zero */
|
||||
#define NS_KEY_SIGNATORYMASK 0x000F /* key can sign RR's of same name */
|
||||
#define NS_KEY_RESERVED_BITMASK ( NS_KEY_RESERVED2 | \
|
||||
NS_KEY_RESERVED4 | \
|
||||
NS_KEY_RESERVED5 | \
|
||||
NS_KEY_RESERVED8 | \
|
||||
NS_KEY_RESERVED9 | \
|
||||
NS_KEY_RESERVED10 | \
|
||||
NS_KEY_RESERVED11 )
|
||||
#define NS_KEY_RESERVED_BITMASK2 0xFFFF /* no bits defined here */
|
||||
|
||||
/* The Algorithm field of the KEY and SIG RR's is an integer, {1..254} */
|
||||
#define NS_ALG_MD5RSA 1 /* MD5 with RSA */
|
||||
#define NS_ALG_DH 2 /* Diffie Hellman KEY */
|
||||
#define NS_ALG_DSA 3 /* DSA KEY */
|
||||
#define NS_ALG_DSS NS_ALG_DSA
|
||||
#define NS_ALG_EXPIRE_ONLY 253 /* No alg, no security */
|
||||
#define NS_ALG_PRIVATE_OID 254 /* Key begins with OID giving alg */
|
||||
|
||||
/* Protocol values */
|
||||
/* value 0 is reserved */
|
||||
#define NS_KEY_PROT_TLS 1
|
||||
#define NS_KEY_PROT_EMAIL 2
|
||||
#define NS_KEY_PROT_DNSSEC 3
|
||||
#define NS_KEY_PROT_IPSEC 4
|
||||
#define NS_KEY_PROT_ANY 255
|
||||
|
||||
/* Signatures */
|
||||
#define NS_MD5RSA_MIN_BITS 512 /* Size of a mod or exp in bits */
|
||||
#define NS_MD5RSA_MAX_BITS 4096
|
||||
/* Total of binary mod and exp */
|
||||
#define NS_MD5RSA_MAX_BYTES ((NS_MD5RSA_MAX_BITS+7/8)*2+3)
|
||||
/* Max length of text sig block */
|
||||
#define NS_MD5RSA_MAX_BASE64 (((NS_MD5RSA_MAX_BYTES+2)/3)*4)
|
||||
#define NS_MD5RSA_MIN_SIZE ((NS_MD5RSA_MIN_BITS+7)/8)
|
||||
#define NS_MD5RSA_MAX_SIZE ((NS_MD5RSA_MAX_BITS+7)/8)
|
||||
|
||||
#define NS_DSA_SIG_SIZE 41
|
||||
#define NS_DSA_MIN_SIZE 213
|
||||
#define NS_DSA_MAX_BYTES 405
|
||||
|
||||
/* Offsets into SIG record rdata to find various values */
|
||||
#define NS_SIG_TYPE 0 /* Type flags */
|
||||
#define NS_SIG_ALG 2 /* Algorithm */
|
||||
#define NS_SIG_LABELS 3 /* How many labels in name */
|
||||
#define NS_SIG_OTTL 4 /* Original TTL */
|
||||
#define NS_SIG_EXPIR 8 /* Expiration time */
|
||||
#define NS_SIG_SIGNED 12 /* Signature time */
|
||||
#define NS_SIG_FOOT 16 /* Key footprint */
|
||||
#define NS_SIG_SIGNER 18 /* Domain name of who signed it */
|
||||
|
||||
/* How RR types are represented as bit-flags in NXT records */
|
||||
#define NS_NXT_BITS 8
|
||||
#define NS_NXT_BIT_SET( n,p) (p[(n)/NS_NXT_BITS] |= (0x80>>((n)%NS_NXT_BITS)))
|
||||
#define NS_NXT_BIT_CLEAR(n,p) (p[(n)/NS_NXT_BITS] &= ~(0x80>>((n)%NS_NXT_BITS)))
|
||||
#define NS_NXT_BIT_ISSET(n,p) (p[(n)/NS_NXT_BITS] & (0x80>>((n)%NS_NXT_BITS)))
|
||||
#define NS_NXT_MAX 127
|
||||
|
||||
/*
|
||||
* EDNS0 extended flags, host order.
|
||||
*/
|
||||
#define NS_OPT_DNSSEC_OK 0x8000U
|
||||
|
||||
/*
|
||||
* Inline versions of get/put short/long. Pointer is advanced.
|
||||
*/
|
||||
#define NS_GET16(s, cp) do { \
|
||||
const u_char *t_cp = (const u_char *)(cp); \
|
||||
(s) = ((uint16_t)t_cp[0] << 8) \
|
||||
| ((uint16_t)t_cp[1]) \
|
||||
; \
|
||||
(cp) += NS_INT16SZ; \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define NS_GET32(l, cp) do { \
|
||||
const u_char *t_cp = (const u_char *)(cp); \
|
||||
(l) = ((uint32_t)t_cp[0] << 24) \
|
||||
| ((uint32_t)t_cp[1] << 16) \
|
||||
| ((uint32_t)t_cp[2] << 8) \
|
||||
| ((uint32_t)t_cp[3]) \
|
||||
; \
|
||||
(cp) += NS_INT32SZ; \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define NS_PUT16(s, cp) do { \
|
||||
uint32_t t_s = (uint32_t)(s); \
|
||||
u_char *t_cp = (u_char *)(cp); \
|
||||
*t_cp++ = t_s >> 8; \
|
||||
*t_cp = t_s; \
|
||||
(cp) += NS_INT16SZ; \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define NS_PUT32(l, cp) do { \
|
||||
uint32_t t_l = (uint32_t)(l); \
|
||||
u_char *t_cp = (u_char *)(cp); \
|
||||
*t_cp++ = t_l >> 24; \
|
||||
*t_cp++ = t_l >> 16; \
|
||||
*t_cp++ = t_l >> 8; \
|
||||
*t_cp = t_l; \
|
||||
(cp) += NS_INT32SZ; \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
/*
|
||||
* ANSI C identifier hiding for bind's lib/nameser.
|
||||
*/
|
||||
#define ns_msg_getflag __ns_msg_getflag
|
||||
#define ns_get16 __ns_get16
|
||||
#define ns_get32 __ns_get32
|
||||
#define ns_put16 __ns_put16
|
||||
#define ns_put32 __ns_put32
|
||||
#define ns_initparse __ns_initparse
|
||||
#define ns_skiprr __ns_skiprr
|
||||
#define ns_parserr __ns_parserr
|
||||
#define ns_sprintrr __ns_sprintrr
|
||||
#define ns_sprintrrf __ns_sprintrrf
|
||||
#define ns_format_ttl __ns_format_ttl
|
||||
#define ns_parse_ttl __ns_parse_ttl
|
||||
#define ns_datetosecs __ns_datetosecs
|
||||
#define ns_name_ntol __ns_name_ntol
|
||||
#define ns_name_ntop __ns_name_ntop
|
||||
#define ns_name_pton __ns_name_pton
|
||||
#define ns_name_unpack __ns_name_unpack
|
||||
#define ns_name_pack __ns_name_pack
|
||||
#define ns_name_compress __ns_name_compress
|
||||
#define ns_name_uncompress __ns_name_uncompress
|
||||
#define ns_name_skip __ns_name_skip
|
||||
#define ns_name_rollback __ns_name_rollback
|
||||
#define ns_sign __ns_sign
|
||||
#define ns_sign2 __ns_sign2
|
||||
#define ns_sign_tcp __ns_sign_tcp
|
||||
#define ns_sign_tcp2 __ns_sign_tcp2
|
||||
#define ns_sign_tcp_init __ns_sign_tcp_init
|
||||
#define ns_find_tsig __ns_find_tsig
|
||||
#define ns_verify __ns_verify
|
||||
#define ns_verify_tcp __ns_verify_tcp
|
||||
#define ns_verify_tcp_init __ns_verify_tcp_init
|
||||
#define ns_samedomain __ns_samedomain
|
||||
#define ns_subdomain __ns_subdomain
|
||||
#define ns_makecanon __ns_makecanon
|
||||
#define ns_samename __ns_samename
|
||||
|
||||
__BEGIN_DECLS
|
||||
int ns_msg_getflag(ns_msg, int);
|
||||
uint16_t ns_get16(const u_char *);
|
||||
uint32_t ns_get32(const u_char *);
|
||||
void ns_put16(uint16_t, u_char *);
|
||||
void ns_put32(uint32_t, u_char *);
|
||||
int ns_initparse(const u_char *, int, ns_msg *);
|
||||
int ns_skiprr(const u_char *, const u_char *, ns_sect, int);
|
||||
int ns_parserr(ns_msg *, ns_sect, int, ns_rr *);
|
||||
int ns_sprintrr(const ns_msg *, const ns_rr *,
|
||||
const char *, const char *, char *, size_t);
|
||||
int ns_sprintrrf(const u_char *, size_t, const char *,
|
||||
ns_class, ns_type, u_long, const u_char *,
|
||||
size_t, const char *, const char *,
|
||||
char *, size_t);
|
||||
int ns_format_ttl(u_long, char *, size_t);
|
||||
int ns_parse_ttl(const char *, u_long *);
|
||||
uint32_t ns_datetosecs(const char *cp, int *errp);
|
||||
int ns_name_ntol(const u_char *, u_char *, size_t);
|
||||
int ns_name_ntop(const u_char *, char *, size_t);
|
||||
int ns_name_pton(const char *, u_char *, size_t);
|
||||
int ns_name_unpack(const u_char *, const u_char *,
|
||||
const u_char *, u_char *, size_t);
|
||||
int ns_name_pack(const u_char *, u_char *, int,
|
||||
const u_char **, const u_char **);
|
||||
int ns_name_uncompress(const u_char *, const u_char *,
|
||||
const u_char *, char *, size_t);
|
||||
int ns_name_compress(const char *, u_char *, size_t,
|
||||
const u_char **, const u_char **);
|
||||
int ns_name_skip(const u_char **, const u_char *);
|
||||
void ns_name_rollback(const u_char *, const u_char **,
|
||||
const u_char **);
|
||||
int ns_sign(u_char *, int *, int, int, void *,
|
||||
const u_char *, int, u_char *, int *, time_t);
|
||||
int ns_sign2(u_char *, int *, int, int, void *,
|
||||
const u_char *, int, u_char *, int *, time_t,
|
||||
u_char **, u_char **);
|
||||
int ns_sign_tcp(u_char *, int *, int, int,
|
||||
ns_tcp_tsig_state *, int);
|
||||
int ns_sign_tcp2(u_char *, int *, int, int,
|
||||
ns_tcp_tsig_state *, int,
|
||||
u_char **, u_char **);
|
||||
int ns_sign_tcp_init(void *, const u_char *, int,
|
||||
ns_tcp_tsig_state *);
|
||||
u_char *ns_find_tsig(u_char *, u_char *);
|
||||
int ns_verify(u_char *, int *, void *,
|
||||
const u_char *, int, u_char *, int *,
|
||||
time_t *, int);
|
||||
int ns_verify_tcp(u_char *, int *, ns_tcp_tsig_state *, int);
|
||||
int ns_verify_tcp_init(void *, const u_char *, int,
|
||||
ns_tcp_tsig_state *);
|
||||
int ns_samedomain(const char *, const char *);
|
||||
int ns_subdomain(const char *, const char *);
|
||||
int ns_makecanon(const char *, char *, size_t);
|
||||
int ns_samename(const char *, const char *);
|
||||
__END_DECLS
|
||||
|
||||
#ifdef BIND_4_COMPAT
|
||||
#include "arpa_nameser_compat.h"
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
# include <logd.h>
|
||||
# define XLOG(...) \
|
||||
__libc_android_log_print(ANDROID_LOG_DEBUG,"libc",__VA_ARGS__)
|
||||
#else
|
||||
#define XLOG(...) do {} while (0)
|
||||
#endif
|
||||
|
||||
#endif /* !_ARPA_NAMESER_H_ */
|
|
@ -1,246 +0,0 @@
|
|||
/* $NetBSD: nameser_compat.h,v 1.1.1.2 2004/11/07 01:28:27 christos Exp $ */
|
||||
|
||||
/* Copyright (c) 1983, 1989
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University 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 REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* from nameser.h 8.1 (Berkeley) 6/2/93
|
||||
* Id: nameser_compat.h,v 1.1.2.3.4.2 2004/07/01 04:43:41 marka Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _ARPA_NAMESER_COMPAT_
|
||||
#define _ARPA_NAMESER_COMPAT_
|
||||
|
||||
#define __BIND 19950621 /* (DEAD) interface version stamp. */
|
||||
|
||||
#include <endian.h>
|
||||
|
||||
#ifndef BYTE_ORDER
|
||||
#if (BSD >= 199103)
|
||||
# include <machine/endian.h>
|
||||
#else
|
||||
#ifdef __linux
|
||||
# include <endian.h>
|
||||
#else
|
||||
#define LITTLE_ENDIAN 1234 /* least-significant byte first (vax, pc) */
|
||||
#define BIG_ENDIAN 4321 /* most-significant byte first (IBM, net) */
|
||||
#define PDP_ENDIAN 3412 /* LSB first in word, MSW first in long (pdp)*/
|
||||
|
||||
#if defined(vax) || defined(ns32000) || defined(sun386) || defined(i386) || \
|
||||
defined(MIPSEL) || defined(_MIPSEL) || defined(BIT_ZERO_ON_RIGHT) || \
|
||||
defined(__alpha__) || defined(__alpha) || \
|
||||
(defined(__Lynx__) && defined(__x86__))
|
||||
#define BYTE_ORDER LITTLE_ENDIAN
|
||||
#endif
|
||||
|
||||
#if defined(sel) || defined(pyr) || defined(mc68000) || defined(sparc) || \
|
||||
defined(is68k) || defined(tahoe) || defined(ibm032) || defined(ibm370) || \
|
||||
defined(MIPSEB) || defined(_MIPSEB) || defined(_IBMR2) || defined(DGUX) ||\
|
||||
defined(apollo) || defined(__convex__) || defined(_CRAY) || \
|
||||
defined(__hppa) || defined(__hp9000) || \
|
||||
defined(__hp9000s300) || defined(__hp9000s700) || \
|
||||
defined(__hp3000s900) || defined(__hpux) || defined(MPE) || \
|
||||
defined (BIT_ZERO_ON_LEFT) || defined(m68k) || defined(__sparc) || \
|
||||
(defined(__Lynx__) && \
|
||||
(defined(__68k__) || defined(__sparc__) || defined(__powerpc__)))
|
||||
#define BYTE_ORDER BIG_ENDIAN
|
||||
#endif
|
||||
#endif /* __linux */
|
||||
#endif /* BSD */
|
||||
#endif /* BYTE_ORDER */
|
||||
|
||||
#if !defined(BYTE_ORDER) || \
|
||||
(BYTE_ORDER != BIG_ENDIAN && BYTE_ORDER != LITTLE_ENDIAN && \
|
||||
BYTE_ORDER != PDP_ENDIAN)
|
||||
/* you must determine what the correct bit order is for
|
||||
* your compiler - the next line is an intentional error
|
||||
* which will force your compiles to bomb until you fix
|
||||
* the above macros.
|
||||
*/
|
||||
#error "Undefined or invalid BYTE_ORDER";
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Structure for query header. The order of the fields is machine- and
|
||||
* compiler-dependent, depending on the byte/bit order and the layout
|
||||
* of bit fields. We use bit fields only in int variables, as this
|
||||
* is all ANSI requires. This requires a somewhat confusing rearrangement.
|
||||
*/
|
||||
|
||||
typedef struct {
|
||||
unsigned id :16; /* query identification number */
|
||||
#if BYTE_ORDER == BIG_ENDIAN
|
||||
/* fields in third byte */
|
||||
unsigned qr: 1; /* response flag */
|
||||
unsigned opcode: 4; /* purpose of message */
|
||||
unsigned aa: 1; /* authoritive answer */
|
||||
unsigned tc: 1; /* truncated message */
|
||||
unsigned rd: 1; /* recursion desired */
|
||||
/* fields in fourth byte */
|
||||
unsigned ra: 1; /* recursion available */
|
||||
unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */
|
||||
unsigned ad: 1; /* authentic data from named */
|
||||
unsigned cd: 1; /* checking disabled by resolver */
|
||||
unsigned rcode :4; /* response code */
|
||||
#endif
|
||||
#if BYTE_ORDER == LITTLE_ENDIAN || BYTE_ORDER == PDP_ENDIAN
|
||||
/* fields in third byte */
|
||||
unsigned rd :1; /* recursion desired */
|
||||
unsigned tc :1; /* truncated message */
|
||||
unsigned aa :1; /* authoritive answer */
|
||||
unsigned opcode :4; /* purpose of message */
|
||||
unsigned qr :1; /* response flag */
|
||||
/* fields in fourth byte */
|
||||
unsigned rcode :4; /* response code */
|
||||
unsigned cd: 1; /* checking disabled by resolver */
|
||||
unsigned ad: 1; /* authentic data from named */
|
||||
unsigned unused :1; /* unused bits (MBZ as of 4.9.3a3) */
|
||||
unsigned ra :1; /* recursion available */
|
||||
#endif
|
||||
/* remaining bytes */
|
||||
unsigned qdcount :16; /* number of question entries */
|
||||
unsigned ancount :16; /* number of answer entries */
|
||||
unsigned nscount :16; /* number of authority entries */
|
||||
unsigned arcount :16; /* number of resource entries */
|
||||
} HEADER;
|
||||
|
||||
#define PACKETSZ NS_PACKETSZ
|
||||
#define MAXDNAME NS_MAXDNAME
|
||||
#define MAXCDNAME NS_MAXCDNAME
|
||||
#define MAXLABEL NS_MAXLABEL
|
||||
#define HFIXEDSZ NS_HFIXEDSZ
|
||||
#define QFIXEDSZ NS_QFIXEDSZ
|
||||
#define RRFIXEDSZ NS_RRFIXEDSZ
|
||||
#define INT32SZ NS_INT32SZ
|
||||
#define INT16SZ NS_INT16SZ
|
||||
#define INT8SZ NS_INT8SZ
|
||||
#define INADDRSZ NS_INADDRSZ
|
||||
#define IN6ADDRSZ NS_IN6ADDRSZ
|
||||
#define INDIR_MASK NS_CMPRSFLGS
|
||||
#define NAMESERVER_PORT NS_DEFAULTPORT
|
||||
|
||||
#define S_ZONE ns_s_zn
|
||||
#define S_PREREQ ns_s_pr
|
||||
#define S_UPDATE ns_s_ud
|
||||
#define S_ADDT ns_s_ar
|
||||
|
||||
#define QUERY ns_o_query
|
||||
#define IQUERY ns_o_iquery
|
||||
#define STATUS ns_o_status
|
||||
#define NS_NOTIFY_OP ns_o_notify
|
||||
#define NS_UPDATE_OP ns_o_update
|
||||
|
||||
#define NOERROR ns_r_noerror
|
||||
#define FORMERR ns_r_formerr
|
||||
#define SERVFAIL ns_r_servfail
|
||||
#define NXDOMAIN ns_r_nxdomain
|
||||
#define NOTIMP ns_r_notimpl
|
||||
#define REFUSED ns_r_refused
|
||||
#define YXDOMAIN ns_r_yxdomain
|
||||
#define YXRRSET ns_r_yxrrset
|
||||
#define NXRRSET ns_r_nxrrset
|
||||
#define NOTAUTH ns_r_notauth
|
||||
#define NOTZONE ns_r_notzone
|
||||
/*#define BADSIG ns_r_badsig*/
|
||||
/*#define BADKEY ns_r_badkey*/
|
||||
/*#define BADTIME ns_r_badtime*/
|
||||
|
||||
|
||||
#define DELETE ns_uop_delete
|
||||
#define ADD ns_uop_add
|
||||
|
||||
#define T_A ns_t_a
|
||||
#define T_NS ns_t_ns
|
||||
#define T_MD ns_t_md
|
||||
#define T_MF ns_t_mf
|
||||
#define T_CNAME ns_t_cname
|
||||
#define T_SOA ns_t_soa
|
||||
#define T_MB ns_t_mb
|
||||
#define T_MG ns_t_mg
|
||||
#define T_MR ns_t_mr
|
||||
#define T_NULL ns_t_null
|
||||
#define T_WKS ns_t_wks
|
||||
#define T_PTR ns_t_ptr
|
||||
#define T_HINFO ns_t_hinfo
|
||||
#define T_MINFO ns_t_minfo
|
||||
#define T_MX ns_t_mx
|
||||
#define T_TXT ns_t_txt
|
||||
#define T_RP ns_t_rp
|
||||
#define T_AFSDB ns_t_afsdb
|
||||
#define T_X25 ns_t_x25
|
||||
#define T_ISDN ns_t_isdn
|
||||
#define T_RT ns_t_rt
|
||||
#define T_NSAP ns_t_nsap
|
||||
#define T_NSAP_PTR ns_t_nsap_ptr
|
||||
#define T_SIG ns_t_sig
|
||||
#define T_KEY ns_t_key
|
||||
#define T_PX ns_t_px
|
||||
#define T_GPOS ns_t_gpos
|
||||
#define T_AAAA ns_t_aaaa
|
||||
#define T_LOC ns_t_loc
|
||||
#define T_NXT ns_t_nxt
|
||||
#define T_EID ns_t_eid
|
||||
#define T_NIMLOC ns_t_nimloc
|
||||
#define T_SRV ns_t_srv
|
||||
#define T_ATMA ns_t_atma
|
||||
#define T_NAPTR ns_t_naptr
|
||||
#define T_A6 ns_t_a6
|
||||
#define T_TSIG ns_t_tsig
|
||||
#define T_IXFR ns_t_ixfr
|
||||
#define T_AXFR ns_t_axfr
|
||||
#define T_MAILB ns_t_mailb
|
||||
#define T_MAILA ns_t_maila
|
||||
#define T_ANY ns_t_any
|
||||
|
||||
#define C_IN ns_c_in
|
||||
#define C_CHAOS ns_c_chaos
|
||||
#define C_HS ns_c_hs
|
||||
/* BIND_UPDATE */
|
||||
#define C_NONE ns_c_none
|
||||
#define C_ANY ns_c_any
|
||||
|
||||
#define GETSHORT NS_GET16
|
||||
#define GETLONG NS_GET32
|
||||
#define PUTSHORT NS_PUT16
|
||||
#define PUTLONG NS_PUT32
|
||||
|
||||
#endif /* _ARPA_NAMESER_COMPAT_ */
|
|
@ -1,134 +0,0 @@
|
|||
/* $NetBSD: assertions.h,v 1.1.1.1 2004/05/20 19:49:41 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1997-1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Id: assertions.h,v 1.1.206.1 2004/03/09 08:33:30 marka Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef ASSERTIONS_H
|
||||
#define ASSERTIONS_H 1
|
||||
|
||||
typedef enum {
|
||||
assert_require, assert_ensure, assert_insist, assert_invariant
|
||||
} assertion_type;
|
||||
|
||||
typedef void (*assertion_failure_callback)(const char *, int, assertion_type,
|
||||
const char *, int);
|
||||
|
||||
extern assertion_failure_callback __assertion_failed;
|
||||
void set_assertion_failure_callback(assertion_failure_callback f);
|
||||
const char *assertion_type_to_text(assertion_type type);
|
||||
|
||||
#ifdef CHECK_ALL
|
||||
#define CHECK_REQUIRE 1
|
||||
#define CHECK_ENSURE 1
|
||||
#define CHECK_INSIST 1
|
||||
#define CHECK_INVARIANT 1
|
||||
#endif
|
||||
|
||||
#ifdef CHECK_NONE
|
||||
#define CHECK_REQUIRE 0
|
||||
#define CHECK_ENSURE 0
|
||||
#define CHECK_INSIST 0
|
||||
#define CHECK_INVARIANT 0
|
||||
#endif
|
||||
|
||||
#ifndef CHECK_REQUIRE
|
||||
#define CHECK_REQUIRE 1
|
||||
#endif
|
||||
|
||||
#ifndef CHECK_ENSURE
|
||||
#define CHECK_ENSURE 1
|
||||
#endif
|
||||
|
||||
#ifndef CHECK_INSIST
|
||||
#define CHECK_INSIST 1
|
||||
#endif
|
||||
|
||||
#ifndef CHECK_INVARIANT
|
||||
#define CHECK_INVARIANT 1
|
||||
#endif
|
||||
|
||||
#if CHECK_REQUIRE != 0
|
||||
#define REQUIRE(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_require, \
|
||||
#cond, 0), 0)))
|
||||
#define REQUIRE_ERR(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_require, \
|
||||
#cond, 1), 0)))
|
||||
#else
|
||||
#define REQUIRE(cond) ((void) (cond))
|
||||
#define REQUIRE_ERR(cond) ((void) (cond))
|
||||
#endif /* CHECK_REQUIRE */
|
||||
|
||||
#if CHECK_ENSURE != 0
|
||||
#define ENSURE(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_ensure, \
|
||||
#cond, 0), 0)))
|
||||
#define ENSURE_ERR(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_ensure, \
|
||||
#cond, 1), 0)))
|
||||
#else
|
||||
#define ENSURE(cond) ((void) (cond))
|
||||
#define ENSURE_ERR(cond) ((void) (cond))
|
||||
#endif /* CHECK_ENSURE */
|
||||
|
||||
#if CHECK_INSIST != 0
|
||||
#define INSIST(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_insist, \
|
||||
#cond, 0), 0)))
|
||||
#define INSIST_ERR(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_insist, \
|
||||
#cond, 1), 0)))
|
||||
#else
|
||||
#define INSIST(cond) ((void) (cond))
|
||||
#define INSIST_ERR(cond) ((void) (cond))
|
||||
#endif /* CHECK_INSIST */
|
||||
|
||||
#if CHECK_INVARIANT != 0
|
||||
#define INVARIANT(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_invariant, \
|
||||
#cond, 0), 0)))
|
||||
#define INVARIANT_ERR(cond) \
|
||||
((void) ((cond) || \
|
||||
((__assertion_failed)(__FILE__, __LINE__, assert_invariant, \
|
||||
#cond, 1), 0)))
|
||||
#else
|
||||
#define INVARIANT(cond) ((void) (cond))
|
||||
#define INVARIANT_ERR(cond) ((void) (cond))
|
||||
#endif /* CHECK_INVARIANT */
|
||||
|
||||
#endif /* ASSERTIONS_H */
|
|
@ -1,192 +0,0 @@
|
|||
/* $NetBSD: dst.h,v 1.1.1.1 2004/05/20 19:49:41 christos Exp $ */
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef DST_H
|
||||
#define DST_H
|
||||
|
||||
#ifndef HAS_DST_KEY
|
||||
typedef struct dst_key {
|
||||
char *dk_key_name; /* name of the key */
|
||||
int dk_key_size; /* this is the size of the key in bits */
|
||||
int dk_proto; /* what protocols this key can be used for */
|
||||
int dk_alg; /* algorithm number from key record */
|
||||
u_int32_t dk_flags; /* and the flags of the public key */
|
||||
u_int16_t dk_id; /* identifier of the key */
|
||||
} DST_KEY;
|
||||
#endif /* HAS_DST_KEY */
|
||||
|
||||
/*
|
||||
* do not taint namespace
|
||||
*/
|
||||
#define dst_bsafe_init __dst_bsafe_init
|
||||
#define dst_buffer_to_key __dst_buffer_to_key
|
||||
#define dst_check_algorithm __dst_check_algorithm
|
||||
#define dst_compare_keys __dst_compare_keys
|
||||
#define dst_cylink_init __dst_cylink_init
|
||||
#define dst_dnskey_to_key __dst_dnskey_to_key
|
||||
#define dst_eay_dss_init __dst_eay_dss_init
|
||||
#define dst_free_key __dst_free_key
|
||||
#define dst_generate_key __dst_generate_key
|
||||
#define dst_hmac_md5_init __dst_hmac_md5_init
|
||||
#define dst_init __dst_init
|
||||
#define dst_key_to_buffer __dst_key_to_buffer
|
||||
#define dst_key_to_dnskey __dst_key_to_dnskey
|
||||
#define dst_read_key __dst_read_key
|
||||
#define dst_rsaref_init __dst_rsaref_init
|
||||
#define dst_s_build_filename __dst_s_build_filename
|
||||
#define dst_s_calculate_bits __dst_s_calculate_bits
|
||||
#define dst_s_conv_bignum_b64_to_u8 __dst_s_conv_bignum_b64_to_u8
|
||||
#define dst_s_conv_bignum_u8_to_b64 __dst_s_conv_bignum_u8_to_b64
|
||||
#define dst_s_dns_key_id __dst_s_dns_key_id
|
||||
#define dst_s_dump __dst_s_dump
|
||||
#define dst_s_filename_length __dst_s_filename_length
|
||||
#define dst_s_fopen __dst_s_fopen
|
||||
#define dst_s_get_int16 __dst_s_get_int16
|
||||
#define dst_s_get_int32 __dst_s_get_int32
|
||||
#define dst_s_id_calc __dst_s_id_calc
|
||||
#define dst_s_put_int16 __dst_s_put_int16
|
||||
#define dst_s_put_int32 __dst_s_put_int32
|
||||
#define dst_s_quick_random __dst_s_quick_random
|
||||
#define dst_s_quick_random_set __dst_s_quick_random_set
|
||||
#define dst_s_random __dst_s_random
|
||||
#define dst_s_semi_random __dst_s_semi_random
|
||||
#define dst_s_verify_str __dst_s_verify_str
|
||||
#define dst_sig_size __dst_sig_size
|
||||
#define dst_sign_data __dst_sign_data
|
||||
#define dst_verify_data __dst_verify_data
|
||||
#define dst_write_key __dst_write_key
|
||||
|
||||
/*
|
||||
* DST Crypto API defintions
|
||||
*/
|
||||
void dst_init(void);
|
||||
int dst_check_algorithm(const int);
|
||||
|
||||
int dst_sign_data(const int, /* specifies INIT/UPDATE/FINAL/ALL */
|
||||
DST_KEY *, /* the key to use */
|
||||
void **, /* pointer to state structure */
|
||||
const u_char *, /* data to be signed */
|
||||
const int, /* length of input data */
|
||||
u_char *, /* buffer to write signature to */
|
||||
const int); /* size of output buffer */
|
||||
|
||||
int dst_verify_data(const int, /* specifies INIT/UPDATE/FINAL/ALL */
|
||||
DST_KEY *, /* the key to use */
|
||||
void **, /* pointer to state structure */
|
||||
const u_char *, /* data to be verified */
|
||||
const int, /* length of input data */
|
||||
const u_char *, /* buffer containing signature */
|
||||
const int); /* length of signature */
|
||||
|
||||
|
||||
DST_KEY *dst_read_key(const char *, /* name of key */
|
||||
const u_int16_t, /* key tag identifier */
|
||||
const int, /* key algorithm */
|
||||
const int); /* Private/PublicKey wanted*/
|
||||
|
||||
int dst_write_key(const DST_KEY *, /* key to write out */
|
||||
const int); /* Public/Private */
|
||||
|
||||
DST_KEY *dst_dnskey_to_key(const char *, /* KEY record name */
|
||||
const u_char *, /* KEY RDATA */
|
||||
const int); /* size of input buffer*/
|
||||
|
||||
|
||||
int dst_key_to_dnskey(const DST_KEY *, /* key to translate */
|
||||
u_char *, /* output buffer */
|
||||
const int); /* size of out_storage*/
|
||||
|
||||
|
||||
DST_KEY *dst_buffer_to_key(const char *, /* name of the key */
|
||||
const int, /* algorithm */
|
||||
const int, /* dns flags */
|
||||
const int, /* dns protocol */
|
||||
const u_char *, /* key in dns wire fmt */
|
||||
const int); /* size of key */
|
||||
|
||||
|
||||
int dst_key_to_buffer(DST_KEY *, u_char *, int);
|
||||
|
||||
DST_KEY *dst_generate_key(const char *, /* name of new key */
|
||||
const int, /* key algorithm to generate */
|
||||
const int, /* size of new key */
|
||||
const int, /* alg dependent parameter*/
|
||||
const int, /* key DNS flags */
|
||||
const int); /* key DNS protocol */
|
||||
|
||||
DST_KEY *dst_free_key(DST_KEY *);
|
||||
int dst_compare_keys(const DST_KEY *, const DST_KEY *);
|
||||
|
||||
int dst_sig_size(DST_KEY *);
|
||||
|
||||
|
||||
/* support for dns key tags/ids */
|
||||
u_int16_t dst_s_dns_key_id(const u_char *, const int);
|
||||
u_int16_t dst_s_id_calc(const u_char *, const int);
|
||||
|
||||
/* Used by callers as well as by the library. */
|
||||
#define RAW_KEY_SIZE 8192 /* large enough to store any key */
|
||||
|
||||
/* DST_API control flags */
|
||||
/* These are used used in functions dst_sign_data and dst_verify_data */
|
||||
#define SIG_MODE_INIT 1 /* initialize digest */
|
||||
#define SIG_MODE_UPDATE 2 /* add data to digest */
|
||||
#define SIG_MODE_FINAL 4 /* generate/verify signature */
|
||||
#define SIG_MODE_ALL (SIG_MODE_INIT|SIG_MODE_UPDATE|SIG_MODE_FINAL)
|
||||
|
||||
/* Flags for dst_read_private_key() */
|
||||
#define DST_FORCE_READ 0x1000000
|
||||
#define DST_CAN_SIGN 0x010F
|
||||
#define DST_NO_AUTHEN 0x8000
|
||||
#define DST_EXTEND_FLAG 0x1000
|
||||
#define DST_STANDARD 0
|
||||
#define DST_PRIVATE 0x2000000
|
||||
#define DST_PUBLIC 0x4000000
|
||||
#define DST_RAND_SEMI 1
|
||||
#define DST_RAND_STD 2
|
||||
#define DST_RAND_KEY 3
|
||||
#define DST_RAND_DSS 4
|
||||
|
||||
|
||||
/* DST algorithm codes */
|
||||
#define KEY_RSA 1
|
||||
#define KEY_DH 2
|
||||
#define KEY_DSA 3
|
||||
#define KEY_PRIVATE 254
|
||||
#define KEY_EXPAND 255
|
||||
#define KEY_HMAC_MD5 157
|
||||
#define KEY_HMAC_SHA1 158
|
||||
#define UNKNOWN_KEYALG 0
|
||||
#define DST_MAX_ALGS KEY_HMAC_SHA1
|
||||
|
||||
/* DST constants to locations in KEY record changes in new KEY record */
|
||||
#define DST_FLAGS_SIZE 2
|
||||
#define DST_KEY_PROT 2
|
||||
#define DST_KEY_ALG 3
|
||||
#define DST_EXT_FLAG 4
|
||||
#define DST_KEY_START 4
|
||||
|
||||
#ifndef SIGN_F_NOKEY
|
||||
#define SIGN_F_NOKEY 0xC000
|
||||
#endif
|
||||
|
||||
/* error codes from dst routines */
|
||||
#define SIGN_INIT_FAILURE (-23)
|
||||
#define SIGN_UPDATE_FAILURE (-24)
|
||||
#define SIGN_FINAL_FAILURE (-25)
|
||||
#define VERIFY_INIT_FAILURE (-26)
|
||||
#define VERIFY_UPDATE_FAILURE (-27)
|
||||
#define VERIFY_FINAL_FAILURE (-28)
|
||||
#define MISSING_KEY_OR_SIGNATURE (-30)
|
||||
#define UNSUPPORTED_KEYALG (-31)
|
||||
|
||||
#endif /* DST_H */
|
|
@ -1,328 +0,0 @@
|
|||
/* $NetBSD: ev_streams.c,v 1.2 2004/05/20 19:52:31 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1996-1999 by Internet Software Consortium
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* ev_streams.c - implement asynch stream file IO for the eventlib
|
||||
* vix 04mar96 [initial]
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if !defined(LINT) && !defined(CODECENTER) && !defined(lint)
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ev_streams.c,v 1.2.206.2 2004/03/17 00:29:51 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ev_streams.c,v 1.2 2004/05/20 19:52:31 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/uio.h>
|
||||
|
||||
#include <errno.h>
|
||||
|
||||
#include "eventlib.h"
|
||||
#include "eventlib_p.h"
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifndef _LIBC
|
||||
static int copyvec(evStream *str, const struct iovec *iov, int iocnt);
|
||||
static void consume(evStream *str, size_t bytes);
|
||||
static void done(evContext opaqueCtx, evStream *str);
|
||||
static void writable(evContext opaqueCtx, void *uap, int fd, int evmask);
|
||||
static void readable(evContext opaqueCtx, void *uap, int fd, int evmask);
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct iovec
|
||||
evConsIovec(void *buf, size_t cnt) {
|
||||
struct iovec ret;
|
||||
|
||||
memset(&ret, 0xf5, sizeof ret);
|
||||
ret.iov_base = buf;
|
||||
ret.iov_len = cnt;
|
||||
return (ret);
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifndef _LIBC
|
||||
int
|
||||
evWrite(evContext opaqueCtx, int fd, const struct iovec *iov, int iocnt,
|
||||
evStreamFunc func, void *uap, evStreamID *id)
|
||||
{
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
evStream *new;
|
||||
int save;
|
||||
|
||||
OKNEW(new);
|
||||
new->func = func;
|
||||
new->uap = uap;
|
||||
new->fd = fd;
|
||||
new->flags = 0;
|
||||
if (evSelectFD(opaqueCtx, fd, EV_WRITE, writable, new, &new->file) < 0)
|
||||
goto free;
|
||||
if (copyvec(new, iov, iocnt) < 0)
|
||||
goto free;
|
||||
new->prevDone = NULL;
|
||||
new->nextDone = NULL;
|
||||
if (ctx->streams != NULL)
|
||||
ctx->streams->prev = new;
|
||||
new->prev = NULL;
|
||||
new->next = ctx->streams;
|
||||
ctx->streams = new;
|
||||
if (id != NULL)
|
||||
id->opaque = new;
|
||||
return (0);
|
||||
free:
|
||||
save = errno;
|
||||
FREE(new);
|
||||
errno = save;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
int
|
||||
evRead(evContext opaqueCtx, int fd, const struct iovec *iov, int iocnt,
|
||||
evStreamFunc func, void *uap, evStreamID *id)
|
||||
{
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
evStream *new;
|
||||
int save;
|
||||
|
||||
OKNEW(new);
|
||||
new->func = func;
|
||||
new->uap = uap;
|
||||
new->fd = fd;
|
||||
new->flags = 0;
|
||||
if (evSelectFD(opaqueCtx, fd, EV_READ, readable, new, &new->file) < 0)
|
||||
goto free;
|
||||
if (copyvec(new, iov, iocnt) < 0)
|
||||
goto free;
|
||||
new->prevDone = NULL;
|
||||
new->nextDone = NULL;
|
||||
if (ctx->streams != NULL)
|
||||
ctx->streams->prev = new;
|
||||
new->prev = NULL;
|
||||
new->next = ctx->streams;
|
||||
ctx->streams = new;
|
||||
if (id)
|
||||
id->opaque = new;
|
||||
return (0);
|
||||
free:
|
||||
save = errno;
|
||||
FREE(new);
|
||||
errno = save;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
int
|
||||
evTimeRW(evContext opaqueCtx, evStreamID id, evTimerID timer) /*ARGSUSED*/ {
|
||||
evStream *str = id.opaque;
|
||||
|
||||
UNUSED(opaqueCtx);
|
||||
|
||||
str->timer = timer;
|
||||
str->flags |= EV_STR_TIMEROK;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
evUntimeRW(evContext opaqueCtx, evStreamID id) /*ARGSUSED*/ {
|
||||
evStream *str = id.opaque;
|
||||
|
||||
UNUSED(opaqueCtx);
|
||||
|
||||
str->flags &= ~EV_STR_TIMEROK;
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
evCancelRW(evContext opaqueCtx, evStreamID id) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
evStream *old = id.opaque;
|
||||
|
||||
/*
|
||||
* The streams list is doubly threaded. First, there's ctx->streams
|
||||
* that's used by evDestroy() to find and cancel all streams. Second,
|
||||
* there's ctx->strDone (head) and ctx->strLast (tail) which thread
|
||||
* through the potentially smaller number of "IO completed" streams,
|
||||
* used in evGetNext() to avoid scanning the entire list.
|
||||
*/
|
||||
|
||||
/* Unlink from ctx->streams. */
|
||||
if (old->prev != NULL)
|
||||
old->prev->next = old->next;
|
||||
else
|
||||
ctx->streams = old->next;
|
||||
if (old->next != NULL)
|
||||
old->next->prev = old->prev;
|
||||
|
||||
/*
|
||||
* If 'old' is on the ctx->strDone list, remove it. Update
|
||||
* ctx->strLast if necessary.
|
||||
*/
|
||||
if (old->prevDone == NULL && old->nextDone == NULL) {
|
||||
/*
|
||||
* Either 'old' is the only item on the done list, or it's
|
||||
* not on the done list. If the former, then we unlink it
|
||||
* from the list. If the latter, we leave the list alone.
|
||||
*/
|
||||
if (ctx->strDone == old) {
|
||||
ctx->strDone = NULL;
|
||||
ctx->strLast = NULL;
|
||||
}
|
||||
} else {
|
||||
if (old->prevDone != NULL)
|
||||
old->prevDone->nextDone = old->nextDone;
|
||||
else
|
||||
ctx->strDone = old->nextDone;
|
||||
if (old->nextDone != NULL)
|
||||
old->nextDone->prevDone = old->prevDone;
|
||||
else
|
||||
ctx->strLast = old->prevDone;
|
||||
}
|
||||
|
||||
/* Deallocate the stream. */
|
||||
if (old->file.opaque)
|
||||
evDeselectFD(opaqueCtx, old->file);
|
||||
memput(old->iovOrig, sizeof (struct iovec) * old->iovOrigCount);
|
||||
FREE(old);
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Copy a scatter/gather vector and initialize a stream handler's IO. */
|
||||
static int
|
||||
copyvec(evStream *str, const struct iovec *iov, int iocnt) {
|
||||
int i;
|
||||
|
||||
str->iovOrig = (struct iovec *)memget(sizeof(struct iovec) * iocnt);
|
||||
if (str->iovOrig == NULL) {
|
||||
errno = ENOMEM;
|
||||
return (-1);
|
||||
}
|
||||
str->ioTotal = 0;
|
||||
for (i = 0; i < iocnt; i++) {
|
||||
str->iovOrig[i] = iov[i];
|
||||
str->ioTotal += iov[i].iov_len;
|
||||
}
|
||||
str->iovOrigCount = iocnt;
|
||||
str->iovCur = str->iovOrig;
|
||||
str->iovCurCount = str->iovOrigCount;
|
||||
str->ioDone = 0;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Pull off or truncate lead iovec(s). */
|
||||
static void
|
||||
consume(evStream *str, size_t bytes) {
|
||||
while (bytes > 0U) {
|
||||
if (bytes < (size_t)str->iovCur->iov_len) {
|
||||
str->iovCur->iov_len -= bytes;
|
||||
str->iovCur->iov_base = (void *)
|
||||
((u_char *)str->iovCur->iov_base + bytes);
|
||||
str->ioDone += bytes;
|
||||
bytes = 0;
|
||||
} else {
|
||||
bytes -= str->iovCur->iov_len;
|
||||
str->ioDone += str->iovCur->iov_len;
|
||||
str->iovCur++;
|
||||
str->iovCurCount--;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Add a stream to Done list and deselect the FD. */
|
||||
static void
|
||||
done(evContext opaqueCtx, evStream *str) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
|
||||
if (ctx->strLast != NULL) {
|
||||
str->prevDone = ctx->strLast;
|
||||
ctx->strLast->nextDone = str;
|
||||
ctx->strLast = str;
|
||||
} else {
|
||||
INSIST(ctx->strDone == NULL);
|
||||
ctx->strDone = ctx->strLast = str;
|
||||
}
|
||||
evDeselectFD(opaqueCtx, str->file);
|
||||
str->file.opaque = NULL;
|
||||
/* evDrop() will call evCancelRW() on us. */
|
||||
}
|
||||
|
||||
/* Dribble out some bytes on the stream. (Called by evDispatch().) */
|
||||
static void
|
||||
writable(evContext opaqueCtx, void *uap, int fd, int evmask) {
|
||||
evStream *str = uap;
|
||||
int bytes;
|
||||
|
||||
UNUSED(evmask);
|
||||
|
||||
bytes = writev(fd, str->iovCur, str->iovCurCount);
|
||||
if (bytes > 0) {
|
||||
if ((str->flags & EV_STR_TIMEROK) != 0)
|
||||
evTouchIdleTimer(opaqueCtx, str->timer);
|
||||
consume(str, bytes);
|
||||
} else {
|
||||
if (bytes < 0 && errno != EINTR) {
|
||||
str->ioDone = -1;
|
||||
str->ioErrno = errno;
|
||||
}
|
||||
}
|
||||
if (str->ioDone == -1 || str->ioDone == str->ioTotal)
|
||||
done(opaqueCtx, str);
|
||||
}
|
||||
|
||||
/* Scoop up some bytes from the stream. (Called by evDispatch().) */
|
||||
static void
|
||||
readable(evContext opaqueCtx, void *uap, int fd, int evmask) {
|
||||
evStream *str = uap;
|
||||
int bytes;
|
||||
|
||||
UNUSED(evmask);
|
||||
|
||||
bytes = readv(fd, str->iovCur, str->iovCurCount);
|
||||
if (bytes > 0) {
|
||||
if ((str->flags & EV_STR_TIMEROK) != 0)
|
||||
evTouchIdleTimer(opaqueCtx, str->timer);
|
||||
consume(str, bytes);
|
||||
} else {
|
||||
if (bytes == 0)
|
||||
str->ioDone = 0;
|
||||
else {
|
||||
if (errno != EINTR) {
|
||||
str->ioDone = -1;
|
||||
str->ioErrno = errno;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (str->ioDone <= 0 || str->ioDone == str->ioTotal)
|
||||
done(opaqueCtx, str);
|
||||
}
|
||||
#endif
|
||||
#endif
|
|
@ -1,522 +0,0 @@
|
|||
/* $NetBSD: ev_timers.c,v 1.2 2004/05/20 19:52:31 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1995-1999 by Internet Software Consortium
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* ev_timers.c - implement timers for the eventlib
|
||||
* vix 09sep95 [initial]
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if !defined(LINT) && !defined(CODECENTER) && !defined(lint)
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ev_timers.c,v 1.2.2.1.4.5 2004/03/17 02:39:13 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ev_timers.c,v 1.2 2004/05/20 19:52:31 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
|
||||
#include <errno.h>
|
||||
#include <time.h>
|
||||
|
||||
#include "assertions.h"
|
||||
#include "eventlib.h"
|
||||
#include "eventlib_p.h"
|
||||
|
||||
/* Constants. */
|
||||
|
||||
#define MILLION 1000000
|
||||
#define BILLION 1000000000
|
||||
|
||||
/* Forward. */
|
||||
|
||||
#ifndef _LIBC
|
||||
static int due_sooner(void *, void *);
|
||||
static void set_index(void *, int);
|
||||
static void free_timer(void *, void *);
|
||||
static void print_timer(void *, void *);
|
||||
static void idle_timeout(evContext, void *, struct timespec, struct timespec);
|
||||
|
||||
/* Private type. */
|
||||
|
||||
typedef struct {
|
||||
evTimerFunc func;
|
||||
void * uap;
|
||||
struct timespec lastTouched;
|
||||
struct timespec max_idle;
|
||||
evTimer * timer;
|
||||
} idle_timer;
|
||||
#endif
|
||||
|
||||
/* Public. */
|
||||
|
||||
struct timespec
|
||||
evConsTime(time_t sec, long nsec) {
|
||||
struct timespec x;
|
||||
|
||||
x.tv_sec = sec;
|
||||
x.tv_nsec = nsec;
|
||||
return (x);
|
||||
}
|
||||
|
||||
struct timespec
|
||||
evAddTime(struct timespec addend1, struct timespec addend2) {
|
||||
struct timespec x;
|
||||
|
||||
x.tv_sec = addend1.tv_sec + addend2.tv_sec;
|
||||
x.tv_nsec = addend1.tv_nsec + addend2.tv_nsec;
|
||||
if (x.tv_nsec >= BILLION) {
|
||||
x.tv_sec++;
|
||||
x.tv_nsec -= BILLION;
|
||||
}
|
||||
return (x);
|
||||
}
|
||||
|
||||
struct timespec
|
||||
evSubTime(struct timespec minuend, struct timespec subtrahend) {
|
||||
struct timespec x;
|
||||
|
||||
x.tv_sec = minuend.tv_sec - subtrahend.tv_sec;
|
||||
if (minuend.tv_nsec >= subtrahend.tv_nsec)
|
||||
x.tv_nsec = minuend.tv_nsec - subtrahend.tv_nsec;
|
||||
else {
|
||||
x.tv_nsec = BILLION - subtrahend.tv_nsec + minuend.tv_nsec;
|
||||
x.tv_sec--;
|
||||
}
|
||||
return (x);
|
||||
}
|
||||
|
||||
int
|
||||
evCmpTime(struct timespec a, struct timespec b) {
|
||||
long x = a.tv_sec - b.tv_sec;
|
||||
|
||||
if (x == 0L)
|
||||
x = a.tv_nsec - b.tv_nsec;
|
||||
return (x < 0L ? (-1) : x > 0L ? (1) : (0));
|
||||
}
|
||||
|
||||
struct timespec
|
||||
evNowTime() {
|
||||
struct timeval now;
|
||||
#ifdef CLOCK_REALTIME
|
||||
struct timespec tsnow;
|
||||
int m = CLOCK_REALTIME;
|
||||
|
||||
#ifdef CLOCK_MONOTONIC
|
||||
if (__evOptMonoTime)
|
||||
m = CLOCK_MONOTONIC;
|
||||
#endif
|
||||
if (clock_gettime(m, &tsnow) == 0)
|
||||
return (tsnow);
|
||||
#endif
|
||||
if (gettimeofday(&now, NULL) < 0)
|
||||
return (evConsTime(0L, 0L));
|
||||
return (evTimeSpec(now));
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
struct timespec
|
||||
evUTCTime(void) {
|
||||
struct timeval now;
|
||||
#ifdef CLOCK_REALTIME
|
||||
struct timespec tsnow;
|
||||
if (clock_gettime(CLOCK_REALTIME, &tsnow) == 0)
|
||||
return (tsnow);
|
||||
#endif
|
||||
if (gettimeofday(&now, NULL) < 0)
|
||||
return (evConsTime(0L, 0L));
|
||||
return (evTimeSpec(now));
|
||||
}
|
||||
|
||||
#ifndef _LIBC
|
||||
struct timespec
|
||||
evLastEventTime(evContext opaqueCtx) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
|
||||
return (ctx->lastEventTime);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
struct timespec
|
||||
evTimeSpec(struct timeval tv) {
|
||||
struct timespec ts;
|
||||
|
||||
ts.tv_sec = tv.tv_sec;
|
||||
ts.tv_nsec = tv.tv_usec * 1000;
|
||||
return (ts);
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
struct timeval
|
||||
evTimeVal(struct timespec ts) {
|
||||
struct timeval tv;
|
||||
|
||||
tv.tv_sec = ts.tv_sec;
|
||||
tv.tv_usec = ts.tv_nsec / 1000;
|
||||
return (tv);
|
||||
}
|
||||
|
||||
#ifndef _LIBC
|
||||
int
|
||||
evSetTimer(evContext opaqueCtx,
|
||||
evTimerFunc func,
|
||||
void *uap,
|
||||
struct timespec due,
|
||||
struct timespec inter,
|
||||
evTimerID *opaqueID
|
||||
) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
evTimer *id;
|
||||
|
||||
printf("evSetTimer(ctx %p, func %p, uap %p, due %ld.%09ld, inter %ld.%09ld)\n",
|
||||
ctx, func, uap,
|
||||
(long)due.tv_sec, due.tv_nsec,
|
||||
(long)inter.tv_sec, inter.tv_nsec);
|
||||
|
||||
#ifdef __hpux
|
||||
/*
|
||||
* tv_sec and tv_nsec are unsigned.
|
||||
*/
|
||||
if (due.tv_nsec >= BILLION)
|
||||
EV_ERR(EINVAL);
|
||||
|
||||
if (inter.tv_nsec >= BILLION)
|
||||
EV_ERR(EINVAL);
|
||||
#else
|
||||
if (due.tv_sec < 0 || due.tv_nsec < 0 || due.tv_nsec >= BILLION)
|
||||
EV_ERR(EINVAL);
|
||||
|
||||
if (inter.tv_sec < 0 || inter.tv_nsec < 0 || inter.tv_nsec >= BILLION)
|
||||
EV_ERR(EINVAL);
|
||||
#endif
|
||||
|
||||
/* due={0,0} is a magic cookie meaning "now." */
|
||||
if (due.tv_sec == (time_t)0 && due.tv_nsec == 0L)
|
||||
due = evNowTime();
|
||||
|
||||
/* Allocate and fill. */
|
||||
OKNEW(id);
|
||||
id->func = func;
|
||||
id->uap = uap;
|
||||
id->due = due;
|
||||
id->inter = inter;
|
||||
|
||||
if (heap_insert(ctx->timers, id) < 0)
|
||||
return (-1);
|
||||
|
||||
/* Remember the ID if the caller provided us a place for it. */
|
||||
if (opaqueID)
|
||||
opaqueID->opaque = id;
|
||||
|
||||
if (ctx->debug > 7) {
|
||||
printf("timers after evSetTimer:\n");
|
||||
(void) heap_for_each(ctx->timers, print_timer, (void *)ctx);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
evClearTimer(evContext opaqueCtx, evTimerID id) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
evTimer *del = id.opaque;
|
||||
|
||||
if (ctx->cur != NULL &&
|
||||
ctx->cur->type == Timer &&
|
||||
ctx->cur->u.timer.this == del) {
|
||||
printf("deferring delete of timer (executing)\n");
|
||||
/*
|
||||
* Setting the interval to zero ensures that evDrop() will
|
||||
* clean up the timer.
|
||||
*/
|
||||
del->inter = evConsTime(0, 0);
|
||||
return (0);
|
||||
}
|
||||
|
||||
if (heap_element(ctx->timers, del->index) != del)
|
||||
EV_ERR(ENOENT);
|
||||
|
||||
if (heap_delete(ctx->timers, del->index) < 0)
|
||||
return (-1);
|
||||
FREE(del);
|
||||
|
||||
if (ctx->debug > 7) {
|
||||
printf("timers after evClearTimer:\n");
|
||||
(void) heap_for_each(ctx->timers, print_timer, (void *)ctx);
|
||||
}
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
evConfigTimer(evContext opaqueCtx,
|
||||
evTimerID id,
|
||||
const char *param,
|
||||
int value
|
||||
) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
evTimer *timer = id.opaque;
|
||||
int result=0;
|
||||
|
||||
UNUSED(value);
|
||||
|
||||
if (heap_element(ctx->timers, timer->index) != timer)
|
||||
EV_ERR(ENOENT);
|
||||
|
||||
if (strcmp(param, "rate") == 0)
|
||||
timer->mode |= EV_TMR_RATE;
|
||||
else if (strcmp(param, "interval") == 0)
|
||||
timer->mode &= ~EV_TMR_RATE;
|
||||
else
|
||||
EV_ERR(EINVAL);
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
int
|
||||
evResetTimer(evContext opaqueCtx,
|
||||
evTimerID id,
|
||||
evTimerFunc func,
|
||||
void *uap,
|
||||
struct timespec due,
|
||||
struct timespec inter
|
||||
) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
evTimer *timer = id.opaque;
|
||||
struct timespec old_due;
|
||||
int result=0;
|
||||
|
||||
if (heap_element(ctx->timers, timer->index) != timer)
|
||||
EV_ERR(ENOENT);
|
||||
|
||||
#ifdef __hpux
|
||||
/*
|
||||
* tv_sec and tv_nsec are unsigned.
|
||||
*/
|
||||
if (due.tv_nsec >= BILLION)
|
||||
EV_ERR(EINVAL);
|
||||
|
||||
if (inter.tv_nsec >= BILLION)
|
||||
EV_ERR(EINVAL);
|
||||
#else
|
||||
if (due.tv_sec < 0 || due.tv_nsec < 0 || due.tv_nsec >= BILLION)
|
||||
EV_ERR(EINVAL);
|
||||
|
||||
if (inter.tv_sec < 0 || inter.tv_nsec < 0 || inter.tv_nsec >= BILLION)
|
||||
EV_ERR(EINVAL);
|
||||
#endif
|
||||
|
||||
old_due = timer->due;
|
||||
|
||||
timer->func = func;
|
||||
timer->uap = uap;
|
||||
timer->due = due;
|
||||
timer->inter = inter;
|
||||
|
||||
switch (evCmpTime(due, old_due)) {
|
||||
case -1:
|
||||
result = heap_increased(ctx->timers, timer->index);
|
||||
break;
|
||||
case 0:
|
||||
result = 0;
|
||||
break;
|
||||
case 1:
|
||||
result = heap_decreased(ctx->timers, timer->index);
|
||||
break;
|
||||
}
|
||||
|
||||
if (ctx->debug > 7) {
|
||||
printf("timers after evResetTimer:\n");
|
||||
(void) heap_for_each(ctx->timers, print_timer, (void *)ctx);
|
||||
}
|
||||
|
||||
return (result);
|
||||
}
|
||||
|
||||
int
|
||||
evSetIdleTimer(evContext opaqueCtx,
|
||||
evTimerFunc func,
|
||||
void *uap,
|
||||
struct timespec max_idle,
|
||||
evTimerID *opaqueID
|
||||
) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
idle_timer *tt;
|
||||
|
||||
/* Allocate and fill. */
|
||||
OKNEW(tt);
|
||||
tt->func = func;
|
||||
tt->uap = uap;
|
||||
tt->lastTouched = ctx->lastEventTime;
|
||||
tt->max_idle = max_idle;
|
||||
|
||||
if (evSetTimer(opaqueCtx, idle_timeout, tt,
|
||||
evAddTime(ctx->lastEventTime, max_idle),
|
||||
max_idle, opaqueID) < 0) {
|
||||
FREE(tt);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
tt->timer = opaqueID->opaque;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
evClearIdleTimer(evContext opaqueCtx, evTimerID id) {
|
||||
evTimer *del = id.opaque;
|
||||
idle_timer *tt = del->uap;
|
||||
|
||||
FREE(tt);
|
||||
return (evClearTimer(opaqueCtx, id));
|
||||
}
|
||||
|
||||
int
|
||||
evResetIdleTimer(evContext opaqueCtx,
|
||||
evTimerID opaqueID,
|
||||
evTimerFunc func,
|
||||
void *uap,
|
||||
struct timespec max_idle
|
||||
) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
evTimer *timer = opaqueID.opaque;
|
||||
idle_timer *tt = timer->uap;
|
||||
|
||||
tt->func = func;
|
||||
tt->uap = uap;
|
||||
tt->lastTouched = ctx->lastEventTime;
|
||||
tt->max_idle = max_idle;
|
||||
|
||||
return (evResetTimer(opaqueCtx, opaqueID, idle_timeout, tt,
|
||||
evAddTime(ctx->lastEventTime, max_idle),
|
||||
max_idle));
|
||||
}
|
||||
|
||||
int
|
||||
evTouchIdleTimer(evContext opaqueCtx, evTimerID id) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
evTimer *t = id.opaque;
|
||||
idle_timer *tt = t->uap;
|
||||
|
||||
tt->lastTouched = ctx->lastEventTime;
|
||||
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Public to the rest of eventlib. */
|
||||
|
||||
heap_context
|
||||
evCreateTimers(const evContext_p *ctx) {
|
||||
|
||||
UNUSED(ctx);
|
||||
|
||||
return (heap_new(due_sooner, set_index, 2048));
|
||||
}
|
||||
|
||||
void
|
||||
evDestroyTimers(const evContext_p *ctx) {
|
||||
(void) heap_for_each(ctx->timers, free_timer, NULL);
|
||||
(void) heap_free(ctx->timers);
|
||||
}
|
||||
|
||||
/* Private. */
|
||||
|
||||
static int
|
||||
due_sooner(void *a, void *b) {
|
||||
evTimer *a_timer, *b_timer;
|
||||
|
||||
a_timer = a;
|
||||
b_timer = b;
|
||||
return (evCmpTime(a_timer->due, b_timer->due) < 0);
|
||||
}
|
||||
|
||||
static void
|
||||
set_index(void *what, int idx) {
|
||||
evTimer *timer;
|
||||
|
||||
timer = what;
|
||||
timer->index = idx;
|
||||
}
|
||||
|
||||
static void
|
||||
free_timer(void *what, void *uap) {
|
||||
evTimer *t = what;
|
||||
|
||||
UNUSED(uap);
|
||||
|
||||
FREE(t);
|
||||
}
|
||||
|
||||
static void
|
||||
print_timer(void *what, void *uap) {
|
||||
evTimer *cur = what;
|
||||
evContext_p *ctx = uap;
|
||||
|
||||
cur = what;
|
||||
evPrintf(ctx, 7,
|
||||
" func %p, uap %p, due %ld.%09ld, inter %ld.%09ld\n",
|
||||
cur->func, cur->uap,
|
||||
(long)cur->due.tv_sec, cur->due.tv_nsec,
|
||||
(long)cur->inter.tv_sec, cur->inter.tv_nsec);
|
||||
}
|
||||
|
||||
static void
|
||||
idle_timeout(evContext opaqueCtx,
|
||||
void *uap,
|
||||
struct timespec due,
|
||||
struct timespec inter
|
||||
) {
|
||||
evContext_p *ctx = opaqueCtx.opaque;
|
||||
idle_timer *this = uap;
|
||||
struct timespec idle;
|
||||
|
||||
UNUSED(due);
|
||||
UNUSED(inter);
|
||||
|
||||
idle = evSubTime(ctx->lastEventTime, this->lastTouched);
|
||||
if (evCmpTime(idle, this->max_idle) >= 0) {
|
||||
(this->func)(opaqueCtx, this->uap, this->timer->due,
|
||||
this->max_idle);
|
||||
/*
|
||||
* Setting the interval to zero will cause the timer to
|
||||
* be cleaned up in evDrop().
|
||||
*/
|
||||
this->timer->inter = evConsTime(0L, 0L);
|
||||
FREE(this);
|
||||
} else {
|
||||
/* evDrop() will reschedule the timer. */
|
||||
this->timer->inter = evSubTime(this->max_idle, idle);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
#endif
|
|
@ -1,214 +0,0 @@
|
|||
/* $NetBSD: eventlib.h,v 1.1.1.3 2005/12/21 23:15:22 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1995-1999 by Internet Software Consortium
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* eventlib.h - exported interfaces for eventlib
|
||||
* vix 09sep95 [initial]
|
||||
*
|
||||
* Id: eventlib.h,v 1.1.2.1.4.2 2005/07/28 07:43:18 marka Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _EVENTLIB_H
|
||||
#define _EVENTLIB_H
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/uio.h>
|
||||
#include <sys/time.h>
|
||||
#include <stdio.h>
|
||||
|
||||
#ifndef __P
|
||||
# define __EVENTLIB_P_DEFINED
|
||||
# ifdef __STDC__
|
||||
# define __P(x) x
|
||||
# else
|
||||
# define __P(x) ()
|
||||
# endif
|
||||
#endif
|
||||
|
||||
/* In the absence of branded types... */
|
||||
typedef struct { void *opaque; } evConnID;
|
||||
typedef struct { void *opaque; } evFileID;
|
||||
typedef struct { void *opaque; } evStreamID;
|
||||
typedef struct { void *opaque; } evTimerID;
|
||||
typedef struct { void *opaque; } evWaitID;
|
||||
typedef struct { void *opaque; } evContext;
|
||||
typedef struct { void *opaque; } evEvent;
|
||||
|
||||
#define evInitID(id) ((id)->opaque = NULL)
|
||||
#define evTestID(id) ((id).opaque != NULL)
|
||||
|
||||
typedef void (*evConnFunc)__P((evContext, void *, int, const void *, int,
|
||||
const void *, int));
|
||||
typedef void (*evFileFunc)__P((evContext, void *, int, int));
|
||||
typedef void (*evStreamFunc)__P((evContext, void *, int, int));
|
||||
typedef void (*evTimerFunc)__P((evContext, void *,
|
||||
struct timespec, struct timespec));
|
||||
typedef void (*evWaitFunc)__P((evContext, void *, const void *));
|
||||
|
||||
typedef struct { unsigned char mask[256/8]; } evByteMask;
|
||||
#define EV_BYTEMASK_BYTE(b) ((b) / 8)
|
||||
#define EV_BYTEMASK_MASK(b) (1 << ((b) % 8))
|
||||
#define EV_BYTEMASK_SET(bm, b) \
|
||||
((bm).mask[EV_BYTEMASK_BYTE(b)] |= EV_BYTEMASK_MASK(b))
|
||||
#define EV_BYTEMASK_CLR(bm, b) \
|
||||
((bm).mask[EV_BYTEMASK_BYTE(b)] &= ~EV_BYTEMASK_MASK(b))
|
||||
#define EV_BYTEMASK_TST(bm, b) \
|
||||
((bm).mask[EV_BYTEMASK_BYTE(b)] & EV_BYTEMASK_MASK(b))
|
||||
|
||||
#define EV_POLL 1
|
||||
#define EV_WAIT 2
|
||||
#define EV_NULL 4
|
||||
|
||||
#define EV_READ 1
|
||||
#define EV_WRITE 2
|
||||
#define EV_EXCEPT 4
|
||||
|
||||
#define EV_WASNONBLOCKING 8 /* Internal library use. */
|
||||
|
||||
/* eventlib.c */
|
||||
#define evCreate __evCreate
|
||||
#define evSetDebug __evSetDebug
|
||||
#define evDestroy __evDestroy
|
||||
#define evGetNext __evGetNext
|
||||
#define evDispatch __evDispatch
|
||||
#define evDrop __evDrop
|
||||
#define evMainLoop __evMainLoop
|
||||
#define evHighestFD __evHighestFD
|
||||
#define evGetOption __evGetOption
|
||||
#define evSetOption __evSetOption
|
||||
|
||||
int evCreate __P((evContext *));
|
||||
void evSetDebug __P((evContext, int, FILE *));
|
||||
int evDestroy __P((evContext));
|
||||
int evGetNext __P((evContext, evEvent *, int));
|
||||
int evDispatch __P((evContext, evEvent));
|
||||
void evDrop __P((evContext, evEvent));
|
||||
int evMainLoop __P((evContext));
|
||||
int evHighestFD __P((evContext));
|
||||
int evGetOption __P((evContext *, const char *, int *));
|
||||
int evSetOption __P((evContext *, const char *, int));
|
||||
|
||||
/* ev_connects.c */
|
||||
#define evListen __evListen
|
||||
#define evConnect __evConnect
|
||||
#define evCancelConn __evCancelConn
|
||||
#define evHold __evHold
|
||||
#define evUnhold __evUnhold
|
||||
#define evTryAccept __evTryAccept
|
||||
|
||||
int evListen __P((evContext, int, int, evConnFunc, void *, evConnID *));
|
||||
int evConnect __P((evContext, int, const void *, int,
|
||||
evConnFunc, void *, evConnID *));
|
||||
int evCancelConn __P((evContext, evConnID));
|
||||
int evHold __P((evContext, evConnID));
|
||||
int evUnhold __P((evContext, evConnID));
|
||||
int evTryAccept __P((evContext, evConnID, int *));
|
||||
|
||||
/* ev_files.c */
|
||||
#define evSelectFD __evSelectFD
|
||||
#define evDeselectFD __evDeselectFD
|
||||
|
||||
int evSelectFD __P((evContext, int, int, evFileFunc, void *, evFileID *));
|
||||
int evDeselectFD __P((evContext, evFileID));
|
||||
|
||||
/* ev_streams.c */
|
||||
#define evConsIovec __evConsIovec
|
||||
#define evWrite __evWrite
|
||||
#define evRead __evRead
|
||||
#define evTimeRW __evTimeRW
|
||||
#define evUntimeRW __evUntimeRW
|
||||
#define evCancelRW __evCancelRW
|
||||
|
||||
struct iovec evConsIovec __P((void *, size_t));
|
||||
int evWrite __P((evContext, int, const struct iovec *, int,
|
||||
evStreamFunc func, void *, evStreamID *));
|
||||
int evRead __P((evContext, int, const struct iovec *, int,
|
||||
evStreamFunc func, void *, evStreamID *));
|
||||
int evTimeRW __P((evContext, evStreamID, evTimerID timer));
|
||||
int evUntimeRW __P((evContext, evStreamID));
|
||||
int evCancelRW __P((evContext, evStreamID));
|
||||
|
||||
/* ev_timers.c */
|
||||
#define evConsTime __evConsTime
|
||||
#define evAddTime __evAddTime
|
||||
#define evSubTime __evSubTime
|
||||
#define evCmpTime __evCmpTime
|
||||
#define evTimeSpec __evTimeSpec
|
||||
#define evTimeVal __evTimeVal
|
||||
|
||||
#define evNowTime __evNowTime
|
||||
#define evUTCTime __evUTCTime
|
||||
#define evLastEventTime __evLastEventTime
|
||||
#define evSetTimer __evSetTimer
|
||||
#define evClearTimer __evClearTimer
|
||||
#define evConfigTimer __evConfigTimer
|
||||
#define evResetTimer __evResetTimer
|
||||
#define evSetIdleTimer __evSetIdleTimer
|
||||
#define evClearIdleTimer __evClearIdleTimer
|
||||
#define evResetIdleTimer __evResetIdleTimer
|
||||
#define evTouchIdleTimer __evTouchIdleTimer
|
||||
|
||||
struct timespec evConsTime __P((time_t sec, long nsec));
|
||||
struct timespec evAddTime __P((struct timespec, struct timespec));
|
||||
struct timespec evSubTime __P((struct timespec, struct timespec));
|
||||
struct timespec evNowTime __P((void));
|
||||
struct timespec evUTCTime __P((void));
|
||||
struct timespec evLastEventTime __P((evContext));
|
||||
struct timespec evTimeSpec __P((struct timeval));
|
||||
struct timeval evTimeVal __P((struct timespec));
|
||||
int evCmpTime __P((struct timespec, struct timespec));
|
||||
int evSetTimer __P((evContext, evTimerFunc, void *, struct timespec,
|
||||
struct timespec, evTimerID *));
|
||||
int evClearTimer __P((evContext, evTimerID));
|
||||
int evConfigTimer __P((evContext, evTimerID, const char *param,
|
||||
int value));
|
||||
int evResetTimer __P((evContext, evTimerID, evTimerFunc, void *,
|
||||
struct timespec, struct timespec));
|
||||
int evSetIdleTimer __P((evContext, evTimerFunc, void *, struct timespec,
|
||||
evTimerID *));
|
||||
int evClearIdleTimer __P((evContext, evTimerID));
|
||||
int evResetIdleTimer __P((evContext, evTimerID, evTimerFunc, void *,
|
||||
struct timespec));
|
||||
int evTouchIdleTimer __P((evContext, evTimerID));
|
||||
|
||||
/* ev_waits.c */
|
||||
#define evWaitFor __evWaitFor
|
||||
#define evDo __evDo
|
||||
#define evUnwait __evUnwait
|
||||
#define evDefer __evDefer
|
||||
|
||||
int evWaitFor __P((evContext, const void *, evWaitFunc, void *, evWaitID *));
|
||||
int evDo __P((evContext, const void *));
|
||||
int evUnwait __P((evContext, evWaitID));
|
||||
int evDefer __P((evContext, evWaitFunc, void *));
|
||||
|
||||
#ifdef __EVENTLIB_P_DEFINED
|
||||
# undef __P
|
||||
#endif
|
||||
|
||||
#endif /*_EVENTLIB_H*/
|
|
@ -1,243 +0,0 @@
|
|||
/* $NetBSD: eventlib_p.h,v 1.1.1.1 2004/05/20 19:34:32 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1995-1999 by Internet Software Consortium
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/* eventlib_p.h - private interfaces for eventlib
|
||||
* vix 09sep95 [initial]
|
||||
*
|
||||
* Id: eventlib_p.h,v 1.3.2.1.4.1 2004/03/09 08:33:43 marka Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _EVENTLIB_P_H
|
||||
#define _EVENTLIB_P_H
|
||||
|
||||
#include <sys/param.h>
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
#include <netinet/in.h>
|
||||
#include <sys/un.h>
|
||||
|
||||
#define EVENTLIB_DEBUG 1
|
||||
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
|
||||
#include "heap.h"
|
||||
#include "list.h"
|
||||
#include "memcluster.h"
|
||||
|
||||
|
||||
#define EV_MASK_ALL (EV_READ | EV_WRITE | EV_EXCEPT)
|
||||
#define EV_ERR(e) return (errno = (e), -1)
|
||||
#define OK(x) if ((x) < 0) EV_ERR(errno); else (void)NULL
|
||||
|
||||
|
||||
#if HAVE_MEM_GET_SET
|
||||
#define NEW(p) if (((p) = memget(sizeof *(p))) != NULL) \
|
||||
FILL(p); \
|
||||
else \
|
||||
(void)NULL;
|
||||
#define OKNEW(p) if (!((p) = memget(sizeof *(p)))) { \
|
||||
errno = ENOMEM; \
|
||||
return (-1); \
|
||||
} else \
|
||||
FILL(p)
|
||||
#define FREE(p) memput((p), sizeof *(p))
|
||||
|
||||
#if EVENTLIB_DEBUG
|
||||
#define FILL(p) memset((p), 0xF5, sizeof *(p))
|
||||
#else
|
||||
#define FILL(p)
|
||||
#endif
|
||||
|
||||
#else
|
||||
|
||||
#define NEW(p) p = malloc(sizeof *(p));
|
||||
#define OKNEW(p) if (!((p) = malloc(sizeof *(p)))) { errno = ENOMEM; return (-1); }
|
||||
#define FREE(p) free(p)
|
||||
#define FILL(p)
|
||||
|
||||
#endif
|
||||
|
||||
|
||||
typedef struct evConn {
|
||||
evConnFunc func;
|
||||
void * uap;
|
||||
int fd;
|
||||
int flags;
|
||||
#define EV_CONN_LISTEN 0x0001 /* Connection is a listener. */
|
||||
#define EV_CONN_SELECTED 0x0002 /* evSelectFD(conn->file). */
|
||||
#define EV_CONN_BLOCK 0x0004 /* Listener fd was blocking. */
|
||||
evFileID file;
|
||||
struct evConn * prev;
|
||||
struct evConn * next;
|
||||
} evConn;
|
||||
|
||||
typedef struct evAccept {
|
||||
int fd;
|
||||
union {
|
||||
struct sockaddr sa;
|
||||
struct sockaddr_in in;
|
||||
#ifndef NO_SOCKADDR_UN
|
||||
struct sockaddr_un un;
|
||||
#endif
|
||||
} la;
|
||||
socklen_t lalen;
|
||||
union {
|
||||
struct sockaddr sa;
|
||||
struct sockaddr_in in;
|
||||
#ifndef NO_SOCKADDR_UN
|
||||
struct sockaddr_un un;
|
||||
#endif
|
||||
} ra;
|
||||
socklen_t ralen;
|
||||
int ioErrno;
|
||||
evConn * conn;
|
||||
LINK(struct evAccept) link;
|
||||
} evAccept;
|
||||
|
||||
typedef struct evFile {
|
||||
evFileFunc func;
|
||||
void * uap;
|
||||
int fd;
|
||||
int eventmask;
|
||||
int preemptive;
|
||||
struct evFile * prev;
|
||||
struct evFile * next;
|
||||
struct evFile * fdprev;
|
||||
struct evFile * fdnext;
|
||||
} evFile;
|
||||
|
||||
typedef struct evStream {
|
||||
evStreamFunc func;
|
||||
void * uap;
|
||||
evFileID file;
|
||||
evTimerID timer;
|
||||
int flags;
|
||||
#define EV_STR_TIMEROK 0x0001 /* IFF timer valid. */
|
||||
int fd;
|
||||
struct iovec * iovOrig;
|
||||
int iovOrigCount;
|
||||
struct iovec * iovCur;
|
||||
int iovCurCount;
|
||||
int ioTotal;
|
||||
int ioDone;
|
||||
int ioErrno;
|
||||
struct evStream *prevDone, *nextDone;
|
||||
struct evStream *prev, *next;
|
||||
} evStream;
|
||||
|
||||
typedef struct evTimer {
|
||||
evTimerFunc func;
|
||||
void * uap;
|
||||
struct timespec due, inter;
|
||||
int index;
|
||||
int mode;
|
||||
#define EV_TMR_RATE 1
|
||||
} evTimer;
|
||||
|
||||
typedef struct evWait {
|
||||
evWaitFunc func;
|
||||
void * uap;
|
||||
const void * tag;
|
||||
struct evWait * next;
|
||||
} evWait;
|
||||
|
||||
typedef struct evWaitList {
|
||||
evWait * first;
|
||||
evWait * last;
|
||||
struct evWaitList * prev;
|
||||
struct evWaitList * next;
|
||||
} evWaitList;
|
||||
|
||||
typedef struct evEvent_p {
|
||||
enum { Accept, File, Stream, Timer, Wait, Free, Null } type;
|
||||
union {
|
||||
struct { evAccept *this; } accept;
|
||||
struct { evFile *this; int eventmask; } file;
|
||||
struct { evStream *this; } stream;
|
||||
struct { evTimer *this; } timer;
|
||||
struct { evWait *this; } wait;
|
||||
struct { struct evEvent_p *next; } free;
|
||||
struct { const void *placeholder; } null;
|
||||
} u;
|
||||
} evEvent_p;
|
||||
|
||||
typedef struct {
|
||||
/* Global. */
|
||||
const evEvent_p *cur;
|
||||
/* Debugging. */
|
||||
int debug;
|
||||
FILE *output;
|
||||
/* Connections. */
|
||||
evConn *conns;
|
||||
LIST(evAccept) accepts;
|
||||
/* Files. */
|
||||
evFile *files, *fdNext;
|
||||
fd_set rdLast, rdNext;
|
||||
fd_set wrLast, wrNext;
|
||||
fd_set exLast, exNext;
|
||||
fd_set nonblockBefore;
|
||||
int fdMax, fdCount, highestFD;
|
||||
evFile *fdTable[FD_SETSIZE];
|
||||
#ifdef EVENTLIB_TIME_CHECKS
|
||||
struct timespec lastSelectTime;
|
||||
int lastFdCount;
|
||||
#endif
|
||||
/* Streams. */
|
||||
evStream *streams;
|
||||
evStream *strDone, *strLast;
|
||||
/* Timers. */
|
||||
struct timespec lastEventTime;
|
||||
heap_context timers;
|
||||
/* Waits. */
|
||||
evWaitList *waitLists;
|
||||
evWaitList waitDone;
|
||||
} evContext_p;
|
||||
|
||||
/* eventlib.c */
|
||||
#define evPrintf __evPrintf
|
||||
void evPrintf(const evContext_p *ctx, int level, const char *fmt, ...);
|
||||
|
||||
/* ev_timers.c */
|
||||
#define evCreateTimers __evCreateTimers
|
||||
heap_context evCreateTimers(const evContext_p *);
|
||||
#define evDestroyTimers __evDestroyTimers
|
||||
void evDestroyTimers(const evContext_p *);
|
||||
|
||||
/* ev_waits.c */
|
||||
#define evFreeWait __evFreeWait
|
||||
evWait *evFreeWait(evContext_p *ctx, evWait *old);
|
||||
|
||||
/* Global options */
|
||||
int __evOptMonoTime;
|
||||
|
||||
#endif /*_EVENTLIB_P_H*/
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,59 +0,0 @@
|
|||
/* $NetBSD: heap.h,v 1.1.1.1 2004/05/20 19:49:41 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1997,1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
typedef int (*heap_higher_priority_func)(void *, void *);
|
||||
typedef void (*heap_index_func)(void *, int);
|
||||
typedef void (*heap_for_each_func)(void *, void *);
|
||||
|
||||
typedef struct heap_context {
|
||||
int array_size;
|
||||
int array_size_increment;
|
||||
int heap_size;
|
||||
void **heap;
|
||||
heap_higher_priority_func higher_priority;
|
||||
heap_index_func index;
|
||||
} *heap_context;
|
||||
|
||||
#define heap_new __heap_new
|
||||
#define heap_free __heap_free
|
||||
#define heap_insert __heap_insert
|
||||
#define heap_delete __heap_delete
|
||||
#define heap_increased __heap_increased
|
||||
#define heap_decreased __heap_decreased
|
||||
#define heap_element __heap_element
|
||||
#define heap_for_each __heap_for_each
|
||||
|
||||
heap_context heap_new(heap_higher_priority_func, heap_index_func, int);
|
||||
int heap_free(heap_context);
|
||||
int heap_insert(heap_context, void *);
|
||||
int heap_delete(heap_context, int);
|
||||
int heap_increased(heap_context, int);
|
||||
int heap_decreased(heap_context, int);
|
||||
void * heap_element(heap_context, int);
|
||||
int heap_for_each(heap_context, heap_for_each_func, void *);
|
|
@ -1,41 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2010 The Android Open Source Project
|
||||
* 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.
|
||||
*
|
||||
* 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 AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE 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 _LINKER_FORMAT_H
|
||||
#define _LINKER_FORMAT_H
|
||||
|
||||
#include <stdarg.h>
|
||||
#include <stddef.h>
|
||||
|
||||
/* Formatting routines for the dynamic linker's debug traces */
|
||||
/* We want to avoid dragging the whole C library fprintf() */
|
||||
/* implementation into the dynamic linker since this creates */
|
||||
/* issues (it uses malloc()/free()) and increases code size */
|
||||
|
||||
int format_buffer(char *buffer, size_t bufsize, const char *format, ...);
|
||||
|
||||
#endif /* _LINKER_FORMAT_H */
|
|
@ -1,124 +0,0 @@
|
|||
/* $NetBSD: list.h,v 1.2 2004/05/20 19:51:55 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1997,1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef LIST_H
|
||||
#define LIST_H 1
|
||||
#include "assertions.h"
|
||||
|
||||
#define LIST(type) struct { type *head, *tail; }
|
||||
#define INIT_LIST(list) \
|
||||
do { (list).head = NULL; (list).tail = NULL; } while (/*CONSTCOND*/0)
|
||||
|
||||
#define LINK(type) struct { type *prev, *next; }
|
||||
#define INIT_LINK_TYPE(elt, link, type) \
|
||||
do { \
|
||||
(elt)->link.prev = (type *)(-1); \
|
||||
(elt)->link.next = (type *)(-1); \
|
||||
} while (/*CONSTCOND*/0)
|
||||
#define INIT_LINK(elt, link) \
|
||||
INIT_LINK_TYPE(elt, link, void)
|
||||
#define LINKED(elt, link) ((void *)((elt)->link.prev) != (void *)(-1))
|
||||
|
||||
#define HEAD(list) ((list).head)
|
||||
#define TAIL(list) ((list).tail)
|
||||
#define EMPTY(list) ((list).head == NULL)
|
||||
|
||||
#define PREPEND(list, elt, link) \
|
||||
do { \
|
||||
INSIST(!LINKED(elt, link));\
|
||||
if ((list).head != NULL) \
|
||||
(list).head->link.prev = (elt); \
|
||||
else \
|
||||
(list).tail = (elt); \
|
||||
(elt)->link.prev = NULL; \
|
||||
(elt)->link.next = (list).head; \
|
||||
(list).head = (elt); \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define APPEND(list, elt, link) \
|
||||
do { \
|
||||
INSIST(!LINKED(elt, link));\
|
||||
if ((list).tail != NULL) \
|
||||
(list).tail->link.next = (elt); \
|
||||
else \
|
||||
(list).head = (elt); \
|
||||
(elt)->link.prev = (list).tail; \
|
||||
(elt)->link.next = NULL; \
|
||||
(list).tail = (elt); \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define UNLINK_TYPE(list, elt, link, type) \
|
||||
do { \
|
||||
INSIST(LINKED(elt, link));\
|
||||
if ((elt)->link.next != NULL) \
|
||||
(elt)->link.next->link.prev = (elt)->link.prev; \
|
||||
else \
|
||||
(list).tail = (elt)->link.prev; \
|
||||
if ((elt)->link.prev != NULL) \
|
||||
(elt)->link.prev->link.next = (elt)->link.next; \
|
||||
else \
|
||||
(list).head = (elt)->link.next; \
|
||||
INIT_LINK_TYPE(elt, link, type); \
|
||||
} while (/*CONSTCOND*/0)
|
||||
#define UNLINK(list, elt, link) \
|
||||
UNLINK_TYPE(list, elt, link, void)
|
||||
|
||||
#define PREV(elt, link) ((elt)->link.prev)
|
||||
#define NEXT(elt, link) ((elt)->link.next)
|
||||
|
||||
#define INSERT_BEFORE(list, before, elt, link) \
|
||||
do { \
|
||||
INSIST(!LINKED(elt, link));\
|
||||
if ((before)->link.prev == NULL) \
|
||||
PREPEND(list, elt, link); \
|
||||
else { \
|
||||
(elt)->link.prev = (before)->link.prev; \
|
||||
(before)->link.prev = (elt); \
|
||||
(elt)->link.prev->link.next = (elt); \
|
||||
(elt)->link.next = (before); \
|
||||
} \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define INSERT_AFTER(list, after, elt, link) \
|
||||
do { \
|
||||
INSIST(!LINKED(elt, link));\
|
||||
if ((after)->link.next == NULL) \
|
||||
APPEND(list, elt, link); \
|
||||
else { \
|
||||
(elt)->link.next = (after)->link.next; \
|
||||
(after)->link.next = (elt); \
|
||||
(elt)->link.next->link.prev = (elt); \
|
||||
(elt)->link.prev = (after); \
|
||||
} \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
#define ENQUEUE(list, elt, link) APPEND(list, elt, link)
|
||||
#define DEQUEUE(list, elt, link) UNLINK(list, elt, link)
|
||||
|
||||
#endif /* LIST_H */
|
|
@ -1,61 +0,0 @@
|
|||
/* $NetBSD: memcluster.h,v 1.1.1.1 2004/05/20 19:49:41 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1997,1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef MEMCLUSTER_H
|
||||
#define MEMCLUSTER_H
|
||||
|
||||
#include <stdio.h>
|
||||
|
||||
#define meminit __meminit
|
||||
#ifdef MEMCLUSTER_DEBUG
|
||||
#define memget(s) __memget_debug(s, __FILE__, __LINE__)
|
||||
#define memput(p, s) __memput_debug(p, s, __FILE__, __LINE__)
|
||||
#else /*MEMCLUSTER_DEBUG*/
|
||||
#ifdef MEMCLUSTER_RECORD
|
||||
#define memget(s) __memget_record(s, __FILE__, __LINE__)
|
||||
#define memput(p, s) __memput_record(p, s, __FILE__, __LINE__)
|
||||
#else /*MEMCLUSTER_RECORD*/
|
||||
#define memget __memget
|
||||
#define memput __memput
|
||||
#endif /*MEMCLUSTER_RECORD*/
|
||||
#endif /*MEMCLUSTER_DEBUG*/
|
||||
#define memstats __memstats
|
||||
#define memactive __memactive
|
||||
|
||||
int meminit(size_t, size_t);
|
||||
void * __memget(size_t);
|
||||
void __memput(void *, size_t);
|
||||
void * __memget_debug(size_t, const char *, int);
|
||||
void __memput_debug(void *, size_t, const char *, int);
|
||||
void * __memget_record(size_t, const char *, int);
|
||||
void __memput_record(void *, size_t, const char *, int);
|
||||
void memstats(FILE *);
|
||||
int memactive(void);
|
||||
|
||||
#endif /* MEMCLUSTER_H */
|
|
@ -1,33 +0,0 @@
|
|||
# -*- Mode: python; c-basic-offset: 4; indent-tabs-mode: nil; tab-width: 40 -*-
|
||||
# vim: set filetype=python:
|
||||
# This Source Code Form is subject to the terms of the Mozilla Public
|
||||
# License, v. 2.0. If a copy of the MPL was not distributed with this
|
||||
# file, You can obtain one at http://mozilla.org/MPL/2.0/.
|
||||
|
||||
UNIFIED_SOURCES += [
|
||||
'ev_streams.c',
|
||||
'ev_timers.c',
|
||||
'getaddrinfo.c',
|
||||
'ns_name.c',
|
||||
'ns_netint.c',
|
||||
'ns_parse.c',
|
||||
'ns_samedomain.c',
|
||||
'ns_ttl.c',
|
||||
'res_comp.c',
|
||||
'res_data.c',
|
||||
'res_init.c',
|
||||
'res_send.c',
|
||||
]
|
||||
|
||||
# These files can't be unified because of conflicting global variable names.
|
||||
SOURCES += [
|
||||
'ns_print.c',
|
||||
'res_debug.c',
|
||||
'res_mkquery.c',
|
||||
'res_state.c',
|
||||
]
|
||||
|
||||
# We allow warnings for third-party code that can be updated from upstream.
|
||||
ALLOW_COMPILER_WARNINGS = True
|
||||
|
||||
FINAL_LIBRARY = 'mozglue'
|
|
@ -1,987 +0,0 @@
|
|||
/* $NetBSD: ns_name.c,v 1.3 2004/11/07 02:19:49 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1996,1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_name.c,v 1.3.2.4.4.2 2004/05/04 03:27:47 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_name.c,v 1.3 2004/11/07 02:19:49 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include "arpa_nameser.h"
|
||||
|
||||
#include <errno.h>
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <stdlib.h>
|
||||
#include <limits.h>
|
||||
|
||||
#ifdef SPRINTF_CHAR
|
||||
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||
#else
|
||||
# define SPRINTF(x) ((size_t)sprintf x)
|
||||
#endif
|
||||
|
||||
#define NS_TYPE_ELT 0x40 /* EDNS0 extended label type */
|
||||
#define DNS_LABELTYPE_BITSTRING 0x41
|
||||
|
||||
/* Data. */
|
||||
|
||||
static const char digits[] = "0123456789";
|
||||
|
||||
static const char digitvalue[256] = {
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*16*/
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*32*/
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*48*/
|
||||
0, 1, 2, 3, 4, 5, 6, 7, 8, 9, -1, -1, -1, -1, -1, -1, /*64*/
|
||||
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*80*/
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*96*/
|
||||
-1, 10, 11, 12, 13, 14, 15, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*112*/
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*128*/
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1,
|
||||
-1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, -1, /*256*/
|
||||
};
|
||||
|
||||
/* Forward. */
|
||||
|
||||
static int special(int);
|
||||
static int printable(int);
|
||||
static int dn_find(const u_char *, const u_char *,
|
||||
const u_char * const *,
|
||||
const u_char * const *);
|
||||
static int encode_bitsring(const char **, const char *,
|
||||
unsigned char **, unsigned char **,
|
||||
unsigned const char *);
|
||||
static int labellen(const u_char *);
|
||||
static int decode_bitstring(const unsigned char **,
|
||||
char *, const char *);
|
||||
|
||||
/* Public. */
|
||||
|
||||
/*
|
||||
* ns_name_ntop(src, dst, dstsiz)
|
||||
* Convert an encoded domain name to printable ascii as per RFC1035.
|
||||
* return:
|
||||
* Number of bytes written to buffer, or -1 (with errno set)
|
||||
* notes:
|
||||
* The root is returned as "."
|
||||
* All other domains are returned in non absolute form
|
||||
*/
|
||||
int
|
||||
ns_name_ntop(const u_char *src, char *dst, size_t dstsiz)
|
||||
{
|
||||
const u_char *cp;
|
||||
char *dn, *eom;
|
||||
u_char c;
|
||||
u_int n;
|
||||
int l;
|
||||
|
||||
cp = src;
|
||||
dn = dst;
|
||||
eom = dst + dstsiz;
|
||||
|
||||
while ((n = *cp++) != 0) {
|
||||
if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) {
|
||||
/* Some kind of compression pointer. */
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
if (dn != dst) {
|
||||
if (dn >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*dn++ = '.';
|
||||
}
|
||||
if ((l = labellen(cp - 1)) < 0) {
|
||||
errno = EMSGSIZE; /* XXX */
|
||||
return(-1);
|
||||
}
|
||||
if (dn + l >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
if ((n & NS_CMPRSFLGS) == NS_TYPE_ELT) {
|
||||
int m;
|
||||
|
||||
if (n != DNS_LABELTYPE_BITSTRING) {
|
||||
/* XXX: labellen should reject this case */
|
||||
errno = EINVAL;
|
||||
return(-1);
|
||||
}
|
||||
if ((m = decode_bitstring(&cp, dn, eom)) < 0)
|
||||
{
|
||||
errno = EMSGSIZE;
|
||||
return(-1);
|
||||
}
|
||||
dn += m;
|
||||
continue;
|
||||
}
|
||||
for (; l > 0; l--) {
|
||||
c = *cp++;
|
||||
if (special(c)) {
|
||||
if (dn + 1 >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*dn++ = '\\';
|
||||
*dn++ = (char)c;
|
||||
} else if (!printable(c)) {
|
||||
if (dn + 3 >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*dn++ = '\\';
|
||||
*dn++ = digits[c / 100];
|
||||
*dn++ = digits[(c % 100) / 10];
|
||||
*dn++ = digits[c % 10];
|
||||
} else {
|
||||
if (dn >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*dn++ = (char)c;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (dn == dst) {
|
||||
if (dn >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*dn++ = '.';
|
||||
}
|
||||
if (dn >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*dn++ = '\0';
|
||||
return (dn - dst);
|
||||
}
|
||||
|
||||
/*
|
||||
* ns_name_pton(src, dst, dstsiz)
|
||||
* Convert a ascii string into an encoded domain name as per RFC1035.
|
||||
* return:
|
||||
* -1 if it fails
|
||||
* 1 if string was fully qualified
|
||||
* 0 is string was not fully qualified
|
||||
* notes:
|
||||
* Enforces label and domain length limits.
|
||||
*/
|
||||
|
||||
int
|
||||
ns_name_pton(const char *src, u_char *dst, size_t dstsiz)
|
||||
{
|
||||
u_char *label, *bp, *eom;
|
||||
int c, n, escaped, e = 0;
|
||||
char *cp;
|
||||
|
||||
escaped = 0;
|
||||
bp = dst;
|
||||
eom = dst + dstsiz;
|
||||
label = bp++;
|
||||
|
||||
while ((c = *src++) != 0) {
|
||||
if (escaped) {
|
||||
if (c == '[') { /* start a bit string label */
|
||||
if ((cp = strchr(src, ']')) == NULL) {
|
||||
errno = EINVAL; /* ??? */
|
||||
return(-1);
|
||||
}
|
||||
if ((e = encode_bitsring(&src, cp + 2,
|
||||
&label, &bp, eom))
|
||||
!= 0) {
|
||||
errno = e;
|
||||
return(-1);
|
||||
}
|
||||
escaped = 0;
|
||||
label = bp++;
|
||||
if ((c = *src++) == 0)
|
||||
goto done;
|
||||
else if (c != '.') {
|
||||
errno = EINVAL;
|
||||
return(-1);
|
||||
}
|
||||
continue;
|
||||
}
|
||||
else if ((cp = strchr(digits, c)) != NULL) {
|
||||
n = (cp - digits) * 100;
|
||||
if ((c = *src++) == 0 ||
|
||||
(cp = strchr(digits, c)) == NULL) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
n += (cp - digits) * 10;
|
||||
if ((c = *src++) == 0 ||
|
||||
(cp = strchr(digits, c)) == NULL) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
n += (cp - digits);
|
||||
if (n > 255) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
c = n;
|
||||
}
|
||||
escaped = 0;
|
||||
} else if (c == '\\') {
|
||||
escaped = 1;
|
||||
continue;
|
||||
} else if (c == '.') {
|
||||
c = (bp - label - 1);
|
||||
if ((c & NS_CMPRSFLGS) != 0) { /* Label too big. */
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
if (label >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*label = c;
|
||||
/* Fully qualified ? */
|
||||
if (*src == '\0') {
|
||||
if (c != 0) {
|
||||
if (bp >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*bp++ = '\0';
|
||||
}
|
||||
if ((bp - dst) > MAXCDNAME) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
if (c == 0 || *src == '.') {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
label = bp++;
|
||||
continue;
|
||||
}
|
||||
if (bp >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*bp++ = (u_char)c;
|
||||
}
|
||||
c = (bp - label - 1);
|
||||
if ((c & NS_CMPRSFLGS) != 0) { /* Label too big. */
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
done:
|
||||
if (label >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*label = c;
|
||||
if (c != 0) {
|
||||
if (bp >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*bp++ = 0;
|
||||
}
|
||||
if ((bp - dst) > MAXCDNAME) { /* src too big */
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
/*
|
||||
* ns_name_ntol(src, dst, dstsiz)
|
||||
* Convert a network strings labels into all lowercase.
|
||||
* return:
|
||||
* Number of bytes written to buffer, or -1 (with errno set)
|
||||
* notes:
|
||||
* Enforces label and domain length limits.
|
||||
*/
|
||||
|
||||
int
|
||||
ns_name_ntol(const u_char *src, u_char *dst, size_t dstsiz)
|
||||
{
|
||||
const u_char *cp;
|
||||
u_char *dn, *eom;
|
||||
u_char c;
|
||||
u_int n;
|
||||
int l;
|
||||
|
||||
cp = src;
|
||||
dn = dst;
|
||||
eom = dst + dstsiz;
|
||||
|
||||
if (dn >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
while ((n = *cp++) != 0) {
|
||||
if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) {
|
||||
/* Some kind of compression pointer. */
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*dn++ = n;
|
||||
if ((l = labellen(cp - 1)) < 0) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
if (dn + l >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
for (; l > 0; l--) {
|
||||
c = *cp++;
|
||||
if (isupper(c))
|
||||
*dn++ = tolower(c);
|
||||
else
|
||||
*dn++ = c;
|
||||
}
|
||||
}
|
||||
*dn++ = '\0';
|
||||
return (dn - dst);
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ns_name_unpack(msg, eom, src, dst, dstsiz)
|
||||
* Unpack a domain name from a message, source may be compressed.
|
||||
* return:
|
||||
* -1 if it fails, or consumed octets if it succeeds.
|
||||
*/
|
||||
int
|
||||
ns_name_unpack(const u_char *msg, const u_char *eom, const u_char *src,
|
||||
u_char *dst, size_t dstsiz)
|
||||
{
|
||||
const u_char *srcp, *dstlim;
|
||||
u_char *dstp;
|
||||
int n, len, checked, l;
|
||||
|
||||
len = -1;
|
||||
checked = 0;
|
||||
dstp = dst;
|
||||
srcp = src;
|
||||
dstlim = dst + dstsiz;
|
||||
if (srcp < msg || srcp >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
/* Fetch next label in domain name. */
|
||||
while ((n = *srcp++) != 0) {
|
||||
/* Check for indirection. */
|
||||
switch (n & NS_CMPRSFLGS) {
|
||||
case 0:
|
||||
case NS_TYPE_ELT:
|
||||
/* Limit checks. */
|
||||
if ((l = labellen(srcp - 1)) < 0) {
|
||||
errno = EMSGSIZE;
|
||||
return(-1);
|
||||
}
|
||||
if (dstp + l + 1 >= dstlim || srcp + l >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
checked += l + 1;
|
||||
*dstp++ = n;
|
||||
memcpy(dstp, srcp, (size_t)l);
|
||||
dstp += l;
|
||||
srcp += l;
|
||||
break;
|
||||
|
||||
case NS_CMPRSFLGS:
|
||||
if (srcp >= eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
if (len < 0)
|
||||
len = srcp - src + 1;
|
||||
srcp = msg + (((n & 0x3f) << 8) | (*srcp & 0xff));
|
||||
if (srcp < msg || srcp >= eom) { /* Out of range. */
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
checked += 2;
|
||||
/*
|
||||
* Check for loops in the compressed name;
|
||||
* if we've looked at the whole message,
|
||||
* there must be a loop.
|
||||
*/
|
||||
if (checked >= eom - msg) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
errno = EMSGSIZE;
|
||||
return (-1); /* flag error */
|
||||
}
|
||||
}
|
||||
*dstp = '\0';
|
||||
if (len < 0)
|
||||
len = srcp - src;
|
||||
return (len);
|
||||
}
|
||||
|
||||
/*
|
||||
* ns_name_pack(src, dst, dstsiz, dnptrs, lastdnptr)
|
||||
* Pack domain name 'domain' into 'comp_dn'.
|
||||
* return:
|
||||
* Size of the compressed name, or -1.
|
||||
* notes:
|
||||
* 'dnptrs' is an array of pointers to previous compressed names.
|
||||
* dnptrs[0] is a pointer to the beginning of the message. The array
|
||||
* ends with NULL.
|
||||
* 'lastdnptr' is a pointer to the end of the array pointed to
|
||||
* by 'dnptrs'.
|
||||
* Side effects:
|
||||
* The list of pointers in dnptrs is updated for labels inserted into
|
||||
* the message as we compress the name. If 'dnptr' is NULL, we don't
|
||||
* try to compress names. If 'lastdnptr' is NULL, we don't update the
|
||||
* list.
|
||||
*/
|
||||
int
|
||||
ns_name_pack(const u_char *src, u_char *dst, int dstsiz,
|
||||
const u_char **dnptrs, const u_char **lastdnptr)
|
||||
{
|
||||
u_char *dstp;
|
||||
const u_char **cpp, **lpp, *eob, *msg;
|
||||
const u_char *srcp;
|
||||
int n, l, first = 1;
|
||||
|
||||
srcp = src;
|
||||
dstp = dst;
|
||||
eob = dstp + dstsiz;
|
||||
lpp = cpp = NULL;
|
||||
if (dnptrs != NULL) {
|
||||
if ((msg = *dnptrs++) != NULL) {
|
||||
for (cpp = dnptrs; *cpp != NULL; cpp++)
|
||||
;
|
||||
lpp = cpp; /* end of list to search */
|
||||
}
|
||||
} else
|
||||
msg = NULL;
|
||||
|
||||
/* make sure the domain we are about to add is legal */
|
||||
l = 0;
|
||||
do {
|
||||
int l0;
|
||||
|
||||
n = *srcp;
|
||||
if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
if ((l0 = labellen(srcp)) < 0) {
|
||||
errno = EINVAL;
|
||||
return(-1);
|
||||
}
|
||||
l += l0 + 1;
|
||||
if (l > MAXCDNAME) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
srcp += l0 + 1;
|
||||
} while (n != 0);
|
||||
|
||||
/* from here on we need to reset compression pointer array on error */
|
||||
srcp = src;
|
||||
do {
|
||||
/* Look to see if we can use pointers. */
|
||||
n = *srcp;
|
||||
if (n != 0 && msg != NULL) {
|
||||
l = dn_find(srcp, msg, (const u_char * const *)dnptrs,
|
||||
(const u_char * const *)lpp);
|
||||
if (l >= 0) {
|
||||
if (dstp + 1 >= eob) {
|
||||
goto cleanup;
|
||||
}
|
||||
*dstp++ = ((u_int32_t)l >> 8) | NS_CMPRSFLGS;
|
||||
*dstp++ = l % 256;
|
||||
return (dstp - dst);
|
||||
}
|
||||
/* Not found, save it. */
|
||||
if (lastdnptr != NULL && cpp < lastdnptr - 1 &&
|
||||
(dstp - msg) < 0x4000 && first) {
|
||||
*cpp++ = dstp;
|
||||
*cpp = NULL;
|
||||
first = 0;
|
||||
}
|
||||
}
|
||||
/* copy label to buffer */
|
||||
if ((n & NS_CMPRSFLGS) == NS_CMPRSFLGS) {
|
||||
/* Should not happen. */
|
||||
goto cleanup;
|
||||
}
|
||||
n = labellen(srcp);
|
||||
if (dstp + 1 + n >= eob) {
|
||||
goto cleanup;
|
||||
}
|
||||
memcpy(dstp, srcp, (size_t)(n + 1));
|
||||
srcp += n + 1;
|
||||
dstp += n + 1;
|
||||
} while (n != 0);
|
||||
|
||||
if (dstp > eob) {
|
||||
cleanup:
|
||||
if (msg != NULL)
|
||||
*lpp = NULL;
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
return (dstp - dst);
|
||||
}
|
||||
|
||||
/*
|
||||
* ns_name_uncompress(msg, eom, src, dst, dstsiz)
|
||||
* Expand compressed domain name to presentation format.
|
||||
* return:
|
||||
* Number of bytes read out of `src', or -1 (with errno set).
|
||||
* note:
|
||||
* Root domain returns as "." not "".
|
||||
*/
|
||||
int
|
||||
ns_name_uncompress(const u_char *msg, const u_char *eom, const u_char *src,
|
||||
char *dst, size_t dstsiz)
|
||||
{
|
||||
u_char tmp[NS_MAXCDNAME];
|
||||
int n;
|
||||
|
||||
if ((n = ns_name_unpack(msg, eom, src, tmp, sizeof tmp)) == -1)
|
||||
return (-1);
|
||||
if (ns_name_ntop(tmp, dst, dstsiz) == -1)
|
||||
return (-1);
|
||||
return (n);
|
||||
}
|
||||
|
||||
/*
|
||||
* ns_name_compress(src, dst, dstsiz, dnptrs, lastdnptr)
|
||||
* Compress a domain name into wire format, using compression pointers.
|
||||
* return:
|
||||
* Number of bytes consumed in `dst' or -1 (with errno set).
|
||||
* notes:
|
||||
* 'dnptrs' is an array of pointers to previous compressed names.
|
||||
* dnptrs[0] is a pointer to the beginning of the message.
|
||||
* The list ends with NULL. 'lastdnptr' is a pointer to the end of the
|
||||
* array pointed to by 'dnptrs'. Side effect is to update the list of
|
||||
* pointers for labels inserted into the message as we compress the name.
|
||||
* If 'dnptr' is NULL, we don't try to compress names. If 'lastdnptr'
|
||||
* is NULL, we don't update the list.
|
||||
*/
|
||||
int
|
||||
ns_name_compress(const char *src, u_char *dst, size_t dstsiz,
|
||||
const u_char **dnptrs, const u_char **lastdnptr)
|
||||
{
|
||||
u_char tmp[NS_MAXCDNAME];
|
||||
|
||||
if (ns_name_pton(src, tmp, sizeof tmp) == -1)
|
||||
return (-1);
|
||||
return (ns_name_pack(tmp, dst, (int)dstsiz, dnptrs, lastdnptr));
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
/*
|
||||
* Reset dnptrs so that there are no active references to pointers at or
|
||||
* after src.
|
||||
*/
|
||||
void
|
||||
ns_name_rollback(const u_char *src, const u_char **dnptrs,
|
||||
const u_char **lastdnptr)
|
||||
{
|
||||
while (dnptrs < lastdnptr && *dnptrs != NULL) {
|
||||
if (*dnptrs >= src) {
|
||||
*dnptrs = NULL;
|
||||
break;
|
||||
}
|
||||
dnptrs++;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ns_name_skip(ptrptr, eom)
|
||||
* Advance *ptrptr to skip over the compressed name it points at.
|
||||
* return:
|
||||
* 0 on success, -1 (with errno set) on failure.
|
||||
*/
|
||||
int
|
||||
ns_name_skip(const u_char **ptrptr, const u_char *eom)
|
||||
{
|
||||
const u_char *cp;
|
||||
u_int n;
|
||||
int l;
|
||||
|
||||
cp = *ptrptr;
|
||||
while (cp < eom && (n = *cp++) != 0) {
|
||||
/* Check for indirection. */
|
||||
switch (n & NS_CMPRSFLGS) {
|
||||
case 0: /* normal case, n == len */
|
||||
cp += n;
|
||||
continue;
|
||||
case NS_TYPE_ELT: /* EDNS0 extended label */
|
||||
if ((l = labellen(cp - 1)) < 0) {
|
||||
errno = EMSGSIZE; /* XXX */
|
||||
return(-1);
|
||||
}
|
||||
cp += l;
|
||||
continue;
|
||||
case NS_CMPRSFLGS: /* indirection */
|
||||
cp++;
|
||||
break;
|
||||
default: /* illegal type */
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
break;
|
||||
}
|
||||
if (cp > eom) {
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
*ptrptr = cp;
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Private. */
|
||||
|
||||
/*
|
||||
* special(ch)
|
||||
* Thinking in noninternationalized USASCII (per the DNS spec),
|
||||
* is this characted special ("in need of quoting") ?
|
||||
* return:
|
||||
* boolean.
|
||||
*/
|
||||
static int
|
||||
special(int ch) {
|
||||
switch (ch) {
|
||||
case 0x22: /* '"' */
|
||||
case 0x2E: /* '.' */
|
||||
case 0x3B: /* ';' */
|
||||
case 0x5C: /* '\\' */
|
||||
case 0x28: /* '(' */
|
||||
case 0x29: /* ')' */
|
||||
/* Special modifiers in zone files. */
|
||||
case 0x40: /* '@' */
|
||||
case 0x24: /* '$' */
|
||||
return (1);
|
||||
default:
|
||||
return (0);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* printable(ch)
|
||||
* Thinking in noninternationalized USASCII (per the DNS spec),
|
||||
* is this character visible and not a space when printed ?
|
||||
* return:
|
||||
* boolean.
|
||||
*/
|
||||
static int
|
||||
printable(int ch) {
|
||||
return (ch > 0x20 && ch < 0x7f);
|
||||
}
|
||||
|
||||
/*
|
||||
* Thinking in noninternationalized USASCII (per the DNS spec),
|
||||
* convert this character to lower case if it's upper case.
|
||||
*/
|
||||
static int
|
||||
mklower(int ch) {
|
||||
if (ch >= 0x41 && ch <= 0x5A)
|
||||
return (ch + 0x20);
|
||||
return (ch);
|
||||
}
|
||||
|
||||
/*
|
||||
* dn_find(domain, msg, dnptrs, lastdnptr)
|
||||
* Search for the counted-label name in an array of compressed names.
|
||||
* return:
|
||||
* offset from msg if found, or -1.
|
||||
* notes:
|
||||
* dnptrs is the pointer to the first name on the list,
|
||||
* not the pointer to the start of the message.
|
||||
*/
|
||||
static int
|
||||
dn_find(const u_char *domain, const u_char *msg,
|
||||
const u_char * const *dnptrs,
|
||||
const u_char * const *lastdnptr)
|
||||
{
|
||||
const u_char *dn, *cp, *sp;
|
||||
const u_char * const *cpp;
|
||||
u_int n;
|
||||
|
||||
for (cpp = dnptrs; cpp < lastdnptr; cpp++) {
|
||||
sp = *cpp;
|
||||
/*
|
||||
* terminate search on:
|
||||
* root label
|
||||
* compression pointer
|
||||
* unusable offset
|
||||
*/
|
||||
while (*sp != 0 && (*sp & NS_CMPRSFLGS) == 0 &&
|
||||
(sp - msg) < 0x4000) {
|
||||
dn = domain;
|
||||
cp = sp;
|
||||
while ((n = *cp++) != 0) {
|
||||
/*
|
||||
* check for indirection
|
||||
*/
|
||||
switch (n & NS_CMPRSFLGS) {
|
||||
case 0: /* normal case, n == len */
|
||||
n = labellen(cp - 1); /* XXX */
|
||||
|
||||
if (n != *dn++)
|
||||
goto next;
|
||||
|
||||
for (; n > 0; n--)
|
||||
if (mklower(*dn++) !=
|
||||
mklower(*cp++))
|
||||
goto next;
|
||||
/* Is next root for both ? */
|
||||
if (*dn == '\0' && *cp == '\0')
|
||||
return (sp - msg);
|
||||
if (*dn)
|
||||
continue;
|
||||
goto next;
|
||||
case NS_CMPRSFLGS: /* indirection */
|
||||
cp = msg + (((n & 0x3f) << 8) | *cp);
|
||||
break;
|
||||
|
||||
default: /* illegal type */
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
}
|
||||
next: ;
|
||||
sp += *sp + 1;
|
||||
}
|
||||
}
|
||||
errno = ENOENT;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
static int
|
||||
decode_bitstring(const unsigned char **cpp, char *dn, const char *eom)
|
||||
{
|
||||
const unsigned char *cp = *cpp;
|
||||
char *beg = dn, tc;
|
||||
int b, blen, plen, i;
|
||||
|
||||
if ((blen = (*cp & 0xff)) == 0)
|
||||
blen = 256;
|
||||
plen = (blen + 3) / 4;
|
||||
plen += sizeof("\\[x/]") + (blen > 99 ? 3 : (blen > 9) ? 2 : 1);
|
||||
if (dn + plen >= eom)
|
||||
return(-1);
|
||||
|
||||
cp++;
|
||||
i = SPRINTF((dn, "\\[x"));
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
dn += i;
|
||||
for (b = blen; b > 7; b -= 8, cp++) {
|
||||
i = SPRINTF((dn, "%02x", *cp & 0xff));
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
dn += i;
|
||||
}
|
||||
if (b > 4) {
|
||||
tc = *cp++;
|
||||
i = SPRINTF((dn, "%02x", tc & (0xff << (8 - b))));
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
dn += i;
|
||||
} else if (b > 0) {
|
||||
tc = *cp++;
|
||||
i = SPRINTF((dn, "%1x",
|
||||
(((u_int32_t)tc >> 4) & 0x0f) & (0x0f << (4 - b))));
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
dn += i;
|
||||
}
|
||||
i = SPRINTF((dn, "/%d]", blen));
|
||||
if (i < 0)
|
||||
return (-1);
|
||||
dn += i;
|
||||
|
||||
*cpp = cp;
|
||||
return(dn - beg);
|
||||
}
|
||||
|
||||
static int
|
||||
encode_bitsring(const char **bp, const char *end, unsigned char **labelp,
|
||||
unsigned char ** dst, unsigned const char *eom)
|
||||
{
|
||||
int afterslash = 0;
|
||||
const char *cp = *bp;
|
||||
unsigned char *tp;
|
||||
char c;
|
||||
const char *beg_blen;
|
||||
char *end_blen = NULL;
|
||||
int value = 0, count = 0, tbcount = 0, blen = 0;
|
||||
|
||||
beg_blen = end_blen = NULL;
|
||||
|
||||
/* a bitstring must contain at least 2 characters */
|
||||
if (end - cp < 2)
|
||||
return(EINVAL);
|
||||
|
||||
/* XXX: currently, only hex strings are supported */
|
||||
if (*cp++ != 'x')
|
||||
return(EINVAL);
|
||||
if (!isxdigit((*cp) & 0xff)) /* reject '\[x/BLEN]' */
|
||||
return(EINVAL);
|
||||
|
||||
for (tp = *dst + 1; cp < end && tp < eom; cp++) {
|
||||
switch((c = *cp)) {
|
||||
case ']': /* end of the bitstring */
|
||||
if (afterslash) {
|
||||
if (beg_blen == NULL)
|
||||
return(EINVAL);
|
||||
blen = (int)strtol(beg_blen, &end_blen, 10);
|
||||
if (*end_blen != ']')
|
||||
return(EINVAL);
|
||||
}
|
||||
if (count)
|
||||
*tp++ = ((value << 4) & 0xff);
|
||||
cp++; /* skip ']' */
|
||||
goto done;
|
||||
case '/':
|
||||
afterslash = 1;
|
||||
break;
|
||||
default:
|
||||
if (afterslash) {
|
||||
if (!isdigit(c&0xff))
|
||||
return(EINVAL);
|
||||
if (beg_blen == NULL) {
|
||||
|
||||
if (c == '0') {
|
||||
/* blen never begings with 0 */
|
||||
return(EINVAL);
|
||||
}
|
||||
beg_blen = cp;
|
||||
}
|
||||
} else {
|
||||
if (!isxdigit(c&0xff))
|
||||
return(EINVAL);
|
||||
value <<= 4;
|
||||
value += digitvalue[(int)c];
|
||||
count += 4;
|
||||
tbcount += 4;
|
||||
if (tbcount > 256)
|
||||
return(EINVAL);
|
||||
if (count == 8) {
|
||||
*tp++ = value;
|
||||
count = 0;
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
done:
|
||||
if (cp >= end || tp >= eom)
|
||||
return(EMSGSIZE);
|
||||
|
||||
/*
|
||||
* bit length validation:
|
||||
* If a <length> is present, the number of digits in the <bit-data>
|
||||
* MUST be just sufficient to contain the number of bits specified
|
||||
* by the <length>. If there are insignificant bits in a final
|
||||
* hexadecimal or octal digit, they MUST be zero.
|
||||
* RFC 2673, Section 3.2.
|
||||
*/
|
||||
if (blen > 0) {
|
||||
int traillen;
|
||||
|
||||
if (((blen + 3) & ~3) != tbcount)
|
||||
return(EINVAL);
|
||||
traillen = tbcount - blen; /* between 0 and 3 */
|
||||
if (((value << (8 - traillen)) & 0xff) != 0)
|
||||
return(EINVAL);
|
||||
}
|
||||
else
|
||||
blen = tbcount;
|
||||
if (blen == 256)
|
||||
blen = 0;
|
||||
|
||||
/* encode the type and the significant bit fields */
|
||||
**labelp = DNS_LABELTYPE_BITSTRING;
|
||||
**dst = blen;
|
||||
|
||||
*bp = cp;
|
||||
*dst = tp;
|
||||
|
||||
return(0);
|
||||
}
|
||||
|
||||
static int
|
||||
labellen(const u_char *lp)
|
||||
{
|
||||
int bitlen;
|
||||
u_char l = *lp;
|
||||
|
||||
if ((l & NS_CMPRSFLGS) == NS_CMPRSFLGS) {
|
||||
/* should be avoided by the caller */
|
||||
return(-1);
|
||||
}
|
||||
|
||||
if ((l & NS_CMPRSFLGS) == NS_TYPE_ELT) {
|
||||
if (l == DNS_LABELTYPE_BITSTRING) {
|
||||
if ((bitlen = *(lp + 1)) == 0)
|
||||
bitlen = 256;
|
||||
return((bitlen + 7 ) / 8 + 1);
|
||||
}
|
||||
return(-1); /* unknwon ELT */
|
||||
}
|
||||
return(l);
|
||||
}
|
|
@ -1,72 +0,0 @@
|
|||
/* $NetBSD: ns_netint.c,v 1.2 2004/05/20 20:19:00 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1996,1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_netint.c,v 1.1.206.1 2004/03/09 08:33:44 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_netint.c,v 1.2 2004/05/20 20:19:00 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
|
||||
#include "arpa_nameser.h"
|
||||
|
||||
/* Public. */
|
||||
|
||||
u_int16_t
|
||||
ns_get16(const u_char *src) {
|
||||
u_int dst;
|
||||
|
||||
NS_GET16(dst, src);
|
||||
return (dst);
|
||||
}
|
||||
|
||||
u_int32_t
|
||||
ns_get32(const u_char *src) {
|
||||
u_long dst;
|
||||
|
||||
NS_GET32(dst, src);
|
||||
return (dst);
|
||||
}
|
||||
|
||||
void
|
||||
ns_put16(u_int16_t src, u_char *dst) {
|
||||
NS_PUT16(src, dst);
|
||||
}
|
||||
|
||||
void
|
||||
ns_put32(u_int32_t src, u_char *dst) {
|
||||
NS_PUT32(src, dst);
|
||||
}
|
|
@ -1,222 +0,0 @@
|
|||
/* $NetBSD: ns_parse.c,v 1.2 2004/05/20 20:35:05 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1996,1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_parse.c,v 1.3.2.1.4.1 2004/03/09 08:33:44 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_parse.c,v 1.2 2004/05/20 20:35:05 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include "arpa_nameser.h"
|
||||
|
||||
#include <errno.h>
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
|
||||
/* Forward. */
|
||||
|
||||
static void setsection(ns_msg *msg, ns_sect sect);
|
||||
|
||||
/* Macros. */
|
||||
|
||||
#define RETERR(err) do { errno = (err); return (-1); } while (/*NOTREACHED*//*CONSTCOND*/0)
|
||||
|
||||
/* Public. */
|
||||
|
||||
/* These need to be in the same order as the nres.h:ns_flag enum. */
|
||||
const struct _ns_flagdata _ns_flagdata[16] = {
|
||||
{ 0x8000, 15 }, /* qr. */
|
||||
{ 0x7800, 11 }, /* opcode. */
|
||||
{ 0x0400, 10 }, /* aa. */
|
||||
{ 0x0200, 9 }, /* tc. */
|
||||
{ 0x0100, 8 }, /* rd. */
|
||||
{ 0x0080, 7 }, /* ra. */
|
||||
{ 0x0040, 6 }, /* z. */
|
||||
{ 0x0020, 5 }, /* ad. */
|
||||
{ 0x0010, 4 }, /* cd. */
|
||||
{ 0x000f, 0 }, /* rcode. */
|
||||
{ 0x0000, 0 }, /* expansion (1/6). */
|
||||
{ 0x0000, 0 }, /* expansion (2/6). */
|
||||
{ 0x0000, 0 }, /* expansion (3/6). */
|
||||
{ 0x0000, 0 }, /* expansion (4/6). */
|
||||
{ 0x0000, 0 }, /* expansion (5/6). */
|
||||
{ 0x0000, 0 }, /* expansion (6/6). */
|
||||
};
|
||||
|
||||
int ns_msg_getflag(ns_msg handle, int flag) {
|
||||
return((u_int32_t)((handle)._flags & _ns_flagdata[flag].mask) >> _ns_flagdata[flag].shift);
|
||||
}
|
||||
|
||||
int
|
||||
ns_skiprr(const u_char *ptr, const u_char *eom, ns_sect section, int count) {
|
||||
const u_char *optr = ptr;
|
||||
|
||||
for (; count > 0; count--) {
|
||||
int b, rdlength;
|
||||
|
||||
b = dn_skipname(ptr, eom);
|
||||
if (b < 0)
|
||||
RETERR(EMSGSIZE);
|
||||
ptr += b/*Name*/ + NS_INT16SZ/*Type*/ + NS_INT16SZ/*Class*/;
|
||||
if (section != ns_s_qd) {
|
||||
if (ptr + NS_INT32SZ + NS_INT16SZ > eom)
|
||||
RETERR(EMSGSIZE);
|
||||
ptr += NS_INT32SZ/*TTL*/;
|
||||
NS_GET16(rdlength, ptr);
|
||||
ptr += rdlength/*RData*/;
|
||||
}
|
||||
}
|
||||
if (ptr > eom)
|
||||
RETERR(EMSGSIZE);
|
||||
return (ptr - optr);
|
||||
}
|
||||
|
||||
int
|
||||
ns_initparse(const u_char *msg, int msglen, ns_msg *handle) {
|
||||
const u_char *eom = msg + msglen;
|
||||
int i;
|
||||
|
||||
memset(handle, 0x5e, sizeof *handle);
|
||||
handle->_msg = msg;
|
||||
handle->_eom = eom;
|
||||
if (msg + NS_INT16SZ > eom)
|
||||
RETERR(EMSGSIZE);
|
||||
NS_GET16(handle->_id, msg);
|
||||
if (msg + NS_INT16SZ > eom)
|
||||
RETERR(EMSGSIZE);
|
||||
NS_GET16(handle->_flags, msg);
|
||||
for (i = 0; i < ns_s_max; i++) {
|
||||
if (msg + NS_INT16SZ > eom)
|
||||
RETERR(EMSGSIZE);
|
||||
NS_GET16(handle->_counts[i], msg);
|
||||
}
|
||||
for (i = 0; i < ns_s_max; i++)
|
||||
if (handle->_counts[i] == 0)
|
||||
handle->_sections[i] = NULL;
|
||||
else {
|
||||
int b = ns_skiprr(msg, eom, (ns_sect)i,
|
||||
handle->_counts[i]);
|
||||
|
||||
if (b < 0)
|
||||
return (-1);
|
||||
handle->_sections[i] = msg;
|
||||
msg += b;
|
||||
}
|
||||
if (msg != eom)
|
||||
RETERR(EMSGSIZE);
|
||||
setsection(handle, ns_s_max);
|
||||
return (0);
|
||||
}
|
||||
|
||||
int
|
||||
ns_parserr(ns_msg *handle, ns_sect section, int rrnum, ns_rr *rr) {
|
||||
int b;
|
||||
|
||||
/* Make section right. */
|
||||
if ((unsigned)section >= (unsigned)ns_s_max)
|
||||
RETERR(ENODEV);
|
||||
if (section != handle->_sect)
|
||||
setsection(handle, section);
|
||||
|
||||
/* Make rrnum right. */
|
||||
if (rrnum == -1)
|
||||
rrnum = handle->_rrnum;
|
||||
if (rrnum < 0 || rrnum >= handle->_counts[(int)section])
|
||||
RETERR(ENODEV);
|
||||
if (rrnum < handle->_rrnum)
|
||||
setsection(handle, section);
|
||||
if (rrnum > handle->_rrnum) {
|
||||
b = ns_skiprr(handle->_msg_ptr, handle->_eom, section,
|
||||
rrnum - handle->_rrnum);
|
||||
|
||||
if (b < 0)
|
||||
return (-1);
|
||||
handle->_msg_ptr += b;
|
||||
handle->_rrnum = rrnum;
|
||||
}
|
||||
|
||||
/* Do the parse. */
|
||||
b = dn_expand(handle->_msg, handle->_eom,
|
||||
handle->_msg_ptr, rr->name, NS_MAXDNAME);
|
||||
if (b < 0)
|
||||
return (-1);
|
||||
handle->_msg_ptr += b;
|
||||
if (handle->_msg_ptr + NS_INT16SZ + NS_INT16SZ > handle->_eom)
|
||||
RETERR(EMSGSIZE);
|
||||
NS_GET16(rr->type, handle->_msg_ptr);
|
||||
NS_GET16(rr->rr_class, handle->_msg_ptr);
|
||||
if (section == ns_s_qd) {
|
||||
rr->ttl = 0;
|
||||
rr->rdlength = 0;
|
||||
rr->rdata = NULL;
|
||||
} else {
|
||||
if (handle->_msg_ptr + NS_INT32SZ + NS_INT16SZ > handle->_eom)
|
||||
RETERR(EMSGSIZE);
|
||||
NS_GET32(rr->ttl, handle->_msg_ptr);
|
||||
NS_GET16(rr->rdlength, handle->_msg_ptr);
|
||||
if (handle->_msg_ptr + rr->rdlength > handle->_eom)
|
||||
RETERR(EMSGSIZE);
|
||||
rr->rdata = handle->_msg_ptr;
|
||||
handle->_msg_ptr += rr->rdlength;
|
||||
}
|
||||
if (++handle->_rrnum > handle->_counts[(int)section])
|
||||
setsection(handle, (ns_sect)((int)section + 1));
|
||||
|
||||
/* All done. */
|
||||
return (0);
|
||||
}
|
||||
|
||||
/* Private. */
|
||||
|
||||
static void
|
||||
setsection(ns_msg *msg, ns_sect sect) {
|
||||
msg->_sect = sect;
|
||||
if (sect == ns_s_max) {
|
||||
msg->_rrnum = -1;
|
||||
msg->_msg_ptr = NULL;
|
||||
} else {
|
||||
msg->_rrnum = 0;
|
||||
msg->_msg_ptr = msg->_sections[(int)sect];
|
||||
}
|
||||
}
|
|
@ -1,928 +0,0 @@
|
|||
/* $NetBSD: ns_print.c,v 1.5 2004/11/07 02:19:49 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1996-1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_print.c,v 1.3.2.1.4.5 2004/07/28 20:16:45 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_print.c,v 1.5 2004/11/07 02:19:49 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/socket.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include "arpa_nameser.h"
|
||||
#include <arpa/inet.h>
|
||||
|
||||
#include "assertions.h"
|
||||
#include "dst.h"
|
||||
#include <errno.h>
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <assert.h>
|
||||
|
||||
#ifdef SPRINTF_CHAR
|
||||
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||
#else
|
||||
# define SPRINTF(x) ((size_t)sprintf x)
|
||||
#endif
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(x,y) ((x)<(y)?(x):(y))
|
||||
#endif
|
||||
|
||||
/* Forward. */
|
||||
|
||||
static size_t prune_origin(const char *name, const char *origin);
|
||||
static int charstr(const u_char *rdata, const u_char *edata,
|
||||
char **buf, size_t *buflen);
|
||||
static int addname(const u_char *msg, size_t msglen,
|
||||
const u_char **p, const char *origin,
|
||||
char **buf, size_t *buflen);
|
||||
static void addlen(size_t len, char **buf, size_t *buflen);
|
||||
static int addstr(const char *src, size_t len,
|
||||
char **buf, size_t *buflen);
|
||||
static int addtab(size_t len, size_t target, int spaced,
|
||||
char **buf, size_t *buflen);
|
||||
|
||||
/* Macros. */
|
||||
|
||||
#define T(x) \
|
||||
do { \
|
||||
if ((x) < 0) \
|
||||
return (-1); \
|
||||
} while (/*CONSTCOND*/0)
|
||||
|
||||
/* Public. */
|
||||
|
||||
/*
|
||||
* int
|
||||
* ns_sprintrr(handle, rr, name_ctx, origin, buf, buflen)
|
||||
* Convert an RR to presentation format.
|
||||
* return:
|
||||
* Number of characters written to buf, or -1 (check errno).
|
||||
*/
|
||||
int
|
||||
ns_sprintrr(const ns_msg *handle, const ns_rr *rr,
|
||||
const char *name_ctx, const char *origin,
|
||||
char *buf, size_t buflen)
|
||||
{
|
||||
int n;
|
||||
|
||||
n = ns_sprintrrf(ns_msg_base(*handle), ns_msg_size(*handle),
|
||||
ns_rr_name(*rr), ns_rr_class(*rr), ns_rr_type(*rr),
|
||||
ns_rr_ttl(*rr), ns_rr_rdata(*rr), ns_rr_rdlen(*rr),
|
||||
name_ctx, origin, buf, buflen);
|
||||
return (n);
|
||||
}
|
||||
|
||||
/*
|
||||
* int
|
||||
* ns_sprintrrf(msg, msglen, name, class, type, ttl, rdata, rdlen,
|
||||
* name_ctx, origin, buf, buflen)
|
||||
* Convert the fields of an RR into presentation format.
|
||||
* return:
|
||||
* Number of characters written to buf, or -1 (check errno).
|
||||
*/
|
||||
int
|
||||
ns_sprintrrf(const u_char *msg, size_t msglen,
|
||||
const char *name, ns_class class, ns_type type,
|
||||
u_long ttl, const u_char *rdata, size_t rdlen,
|
||||
const char *name_ctx, const char *origin,
|
||||
char *buf, size_t buflen)
|
||||
{
|
||||
const char *obuf = buf;
|
||||
const u_char *edata = rdata + rdlen;
|
||||
int spaced = 0;
|
||||
|
||||
const char *comment;
|
||||
char tmp[100];
|
||||
int len, x;
|
||||
|
||||
/*
|
||||
* Owner.
|
||||
*/
|
||||
if (name_ctx != NULL && ns_samename(name_ctx, name) == 1) {
|
||||
T(addstr("\t\t\t", (size_t)3, &buf, &buflen));
|
||||
} else {
|
||||
len = prune_origin(name, origin);
|
||||
if (*name == '\0') {
|
||||
goto root;
|
||||
} else if (len == 0) {
|
||||
T(addstr("@\t\t\t", (size_t)4, &buf, &buflen));
|
||||
} else {
|
||||
T(addstr(name, (size_t)len, &buf, &buflen));
|
||||
/* Origin not used or not root, and no trailing dot? */
|
||||
if (((origin == NULL || origin[0] == '\0') ||
|
||||
(origin[0] != '.' && origin[1] != '\0' &&
|
||||
name[len] == '\0')) && name[len - 1] != '.') {
|
||||
root:
|
||||
T(addstr(".", (size_t)1, &buf, &buflen));
|
||||
len++;
|
||||
}
|
||||
T(spaced = addtab((size_t)len, 24, spaced, &buf, &buflen));
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* TTL, Class, Type.
|
||||
*/
|
||||
T(x = ns_format_ttl(ttl, buf, buflen));
|
||||
addlen((size_t)x, &buf, &buflen);
|
||||
len = SPRINTF((tmp, " %s %s", p_class(class), p_type(type)));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
T(spaced = addtab((size_t)(x + len), (size_t)16, spaced, &buf, &buflen));
|
||||
|
||||
/*
|
||||
* RData.
|
||||
*/
|
||||
switch (type) {
|
||||
case ns_t_a:
|
||||
if (rdlen != (size_t)NS_INADDRSZ)
|
||||
goto formerr;
|
||||
(void) inet_ntop(AF_INET, rdata, buf, buflen);
|
||||
addlen(strlen(buf), &buf, &buflen);
|
||||
break;
|
||||
|
||||
case ns_t_cname:
|
||||
case ns_t_mb:
|
||||
case ns_t_mg:
|
||||
case ns_t_mr:
|
||||
case ns_t_ns:
|
||||
case ns_t_ptr:
|
||||
case ns_t_dname:
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
break;
|
||||
|
||||
case ns_t_hinfo:
|
||||
case ns_t_isdn:
|
||||
/* First word. */
|
||||
T(len = charstr(rdata, edata, &buf, &buflen));
|
||||
if (len == 0)
|
||||
goto formerr;
|
||||
rdata += len;
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
|
||||
/* Second word, optional in ISDN records. */
|
||||
if (type == ns_t_isdn && rdata == edata)
|
||||
break;
|
||||
|
||||
T(len = charstr(rdata, edata, &buf, &buflen));
|
||||
if (len == 0)
|
||||
goto formerr;
|
||||
rdata += len;
|
||||
break;
|
||||
|
||||
case ns_t_soa: {
|
||||
u_long t;
|
||||
|
||||
/* Server name. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
/* Administrator name. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
T(addstr(" (\n", (size_t)3, &buf, &buflen));
|
||||
spaced = 0;
|
||||
|
||||
if ((edata - rdata) != 5*NS_INT32SZ)
|
||||
goto formerr;
|
||||
|
||||
/* Serial number. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
|
||||
len = SPRINTF((tmp, "%lu", t));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
|
||||
T(addstr("; serial\n", (size_t)9, &buf, &buflen));
|
||||
spaced = 0;
|
||||
|
||||
/* Refresh interval. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
|
||||
T(len = ns_format_ttl(t, buf, buflen));
|
||||
addlen((size_t)len, &buf, &buflen);
|
||||
T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
|
||||
T(addstr("; refresh\n", (size_t)10, &buf, &buflen));
|
||||
spaced = 0;
|
||||
|
||||
/* Retry interval. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
|
||||
T(len = ns_format_ttl(t, buf, buflen));
|
||||
addlen((size_t)len, &buf, &buflen);
|
||||
T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
|
||||
T(addstr("; retry\n", (size_t)8, &buf, &buflen));
|
||||
spaced = 0;
|
||||
|
||||
/* Expiry. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
|
||||
T(len = ns_format_ttl(t, buf, buflen));
|
||||
addlen((size_t)len, &buf, &buflen);
|
||||
T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
|
||||
T(addstr("; expiry\n", (size_t)9, &buf, &buflen));
|
||||
spaced = 0;
|
||||
|
||||
/* Minimum TTL. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
T(addstr("\t\t\t\t\t", (size_t)5, &buf, &buflen));
|
||||
T(len = ns_format_ttl(t, buf, buflen));
|
||||
addlen((size_t)len, &buf, &buflen);
|
||||
T(addstr(" )", (size_t)2, &buf, &buflen));
|
||||
T(spaced = addtab((size_t)len, (size_t)16, spaced, &buf, &buflen));
|
||||
T(addstr("; minimum\n", (size_t)10, &buf, &buflen));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_mx:
|
||||
case ns_t_afsdb:
|
||||
case ns_t_rt: {
|
||||
u_int t;
|
||||
|
||||
if (rdlen < (size_t)NS_INT16SZ)
|
||||
goto formerr;
|
||||
|
||||
/* Priority. */
|
||||
t = ns_get16(rdata);
|
||||
rdata += NS_INT16SZ;
|
||||
len = SPRINTF((tmp, "%u ", t));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Target. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_px: {
|
||||
u_int t;
|
||||
|
||||
if (rdlen < (size_t)NS_INT16SZ)
|
||||
goto formerr;
|
||||
|
||||
/* Priority. */
|
||||
t = ns_get16(rdata);
|
||||
rdata += NS_INT16SZ;
|
||||
len = SPRINTF((tmp, "%u ", t));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Name1. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
/* Name2. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_x25:
|
||||
T(len = charstr(rdata, edata, &buf, &buflen));
|
||||
if (len == 0)
|
||||
goto formerr;
|
||||
rdata += len;
|
||||
break;
|
||||
|
||||
case ns_t_txt:
|
||||
while (rdata < edata) {
|
||||
T(len = charstr(rdata, edata, &buf, &buflen));
|
||||
if (len == 0)
|
||||
goto formerr;
|
||||
rdata += len;
|
||||
if (rdata < edata)
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
}
|
||||
break;
|
||||
|
||||
case ns_t_nsap: {
|
||||
char t[2+255*3];
|
||||
|
||||
(void) inet_nsap_ntoa((int)rdlen, rdata, t);
|
||||
T(addstr(t, strlen(t), &buf, &buflen));
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_aaaa:
|
||||
if (rdlen != (size_t)NS_IN6ADDRSZ)
|
||||
goto formerr;
|
||||
(void) inet_ntop(AF_INET6, rdata, buf, buflen);
|
||||
addlen(strlen(buf), &buf, &buflen);
|
||||
break;
|
||||
|
||||
case ns_t_loc: {
|
||||
char t[255];
|
||||
|
||||
/* XXX protocol format checking? */
|
||||
(void) loc_ntoa(rdata, t);
|
||||
T(addstr(t, strlen(t), &buf, &buflen));
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_naptr: {
|
||||
u_int order, preference;
|
||||
char t[50];
|
||||
|
||||
if (rdlen < 2U*NS_INT16SZ)
|
||||
goto formerr;
|
||||
|
||||
/* Order, Precedence. */
|
||||
order = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
preference = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
len = SPRINTF((t, "%u %u ", order, preference));
|
||||
T(addstr(t, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Flags. */
|
||||
T(len = charstr(rdata, edata, &buf, &buflen));
|
||||
if (len == 0)
|
||||
goto formerr;
|
||||
rdata += len;
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
/* Service. */
|
||||
T(len = charstr(rdata, edata, &buf, &buflen));
|
||||
if (len == 0)
|
||||
goto formerr;
|
||||
rdata += len;
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
/* Regexp. */
|
||||
T(len = charstr(rdata, edata, &buf, &buflen));
|
||||
if (len < 0)
|
||||
return (-1);
|
||||
if (len == 0)
|
||||
goto formerr;
|
||||
rdata += len;
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
/* Server. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_srv: {
|
||||
u_int priority, weight, port;
|
||||
char t[50];
|
||||
|
||||
if (rdlen < 3U*NS_INT16SZ)
|
||||
goto formerr;
|
||||
|
||||
/* Priority, Weight, Port. */
|
||||
priority = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
weight = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
port = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
len = SPRINTF((t, "%u %u %u ", priority, weight, port));
|
||||
T(addstr(t, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Server. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_minfo:
|
||||
case ns_t_rp:
|
||||
/* Name1. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
/* Name2. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
|
||||
break;
|
||||
|
||||
case ns_t_wks: {
|
||||
int n, lcnt;
|
||||
|
||||
if (rdlen < 1U + NS_INT32SZ)
|
||||
goto formerr;
|
||||
|
||||
/* Address. */
|
||||
(void) inet_ntop(AF_INET, rdata, buf, buflen);
|
||||
addlen(strlen(buf), &buf, &buflen);
|
||||
rdata += NS_INADDRSZ;
|
||||
|
||||
/* Protocol. */
|
||||
len = SPRINTF((tmp, " %u ( ", *rdata));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
rdata += NS_INT8SZ;
|
||||
|
||||
/* Bit map. */
|
||||
n = 0;
|
||||
lcnt = 0;
|
||||
while (rdata < edata) {
|
||||
u_int c = *rdata++;
|
||||
do {
|
||||
if (c & 0200) {
|
||||
if (lcnt == 0) {
|
||||
T(addstr("\n\t\t\t\t", (size_t)5,
|
||||
&buf, &buflen));
|
||||
lcnt = 10;
|
||||
spaced = 0;
|
||||
}
|
||||
len = SPRINTF((tmp, "%d ", n));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
lcnt--;
|
||||
}
|
||||
c <<= 1;
|
||||
} while (++n & 07);
|
||||
}
|
||||
T(addstr(")", (size_t)1, &buf, &buflen));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_key: {
|
||||
char base64_key[NS_MD5RSA_MAX_BASE64];
|
||||
u_int keyflags, protocol, algorithm, key_id;
|
||||
const char *leader;
|
||||
int n;
|
||||
|
||||
if (rdlen < 0U + NS_INT16SZ + NS_INT8SZ + NS_INT8SZ)
|
||||
goto formerr;
|
||||
|
||||
/* Key flags, Protocol, Algorithm. */
|
||||
#if !defined(MOZILLA_NECKO_EXCLUDE_CODE) && !defined(_LIBC)
|
||||
key_id = dst_s_dns_key_id(rdata, edata-rdata);
|
||||
#else
|
||||
key_id = 0;
|
||||
#endif
|
||||
keyflags = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
protocol = *rdata++;
|
||||
algorithm = *rdata++;
|
||||
len = SPRINTF((tmp, "0x%04x %u %u",
|
||||
keyflags, protocol, algorithm));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Public key data. */
|
||||
len = b64_ntop(rdata, (size_t)(edata - rdata),
|
||||
base64_key, sizeof base64_key);
|
||||
if (len < 0)
|
||||
goto formerr;
|
||||
if (len > 15) {
|
||||
T(addstr(" (", (size_t)2, &buf, &buflen));
|
||||
leader = "\n\t\t";
|
||||
spaced = 0;
|
||||
} else
|
||||
leader = " ";
|
||||
for (n = 0; n < len; n += 48) {
|
||||
T(addstr(leader, strlen(leader), &buf, &buflen));
|
||||
T(addstr(base64_key + n, (size_t)MIN(len - n, 48),
|
||||
&buf, &buflen));
|
||||
}
|
||||
if (len > 15)
|
||||
T(addstr(" )", (size_t)2, &buf, &buflen));
|
||||
n = SPRINTF((tmp, " ; key_tag= %u", key_id));
|
||||
T(addstr(tmp, (size_t)n, &buf, &buflen));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_sig: {
|
||||
char base64_key[NS_MD5RSA_MAX_BASE64];
|
||||
u_int typ, algorithm, labels, footprint;
|
||||
const char *leader;
|
||||
u_long t;
|
||||
int n;
|
||||
|
||||
if (rdlen < 22U)
|
||||
goto formerr;
|
||||
|
||||
/* Type covered, Algorithm, Label count, Original TTL. */
|
||||
typ = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
algorithm = *rdata++;
|
||||
labels = *rdata++;
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
len = SPRINTF((tmp, "%s %d %d %lu ",
|
||||
p_type((int)typ), algorithm, labels, t));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
if (labels > (u_int)dn_count_labels(name))
|
||||
goto formerr;
|
||||
|
||||
/* Signature expiry. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
len = SPRINTF((tmp, "%s ", p_secstodate(t)));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Time signed. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
len = SPRINTF((tmp, "%s ", p_secstodate(t)));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Signature Footprint. */
|
||||
footprint = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
len = SPRINTF((tmp, "%u ", footprint));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Signer's name. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
|
||||
/* Signature. */
|
||||
len = b64_ntop(rdata, (size_t)(edata - rdata),
|
||||
base64_key, sizeof base64_key);
|
||||
if (len > 15) {
|
||||
T(addstr(" (", (size_t)2, &buf, &buflen));
|
||||
leader = "\n\t\t";
|
||||
spaced = 0;
|
||||
} else
|
||||
leader = " ";
|
||||
if (len < 0)
|
||||
goto formerr;
|
||||
for (n = 0; n < len; n += 48) {
|
||||
T(addstr(leader, strlen(leader), &buf, &buflen));
|
||||
T(addstr(base64_key + n, (size_t)MIN(len - n, 48),
|
||||
&buf, &buflen));
|
||||
}
|
||||
if (len > 15)
|
||||
T(addstr(" )", (size_t)2, &buf, &buflen));
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_nxt: {
|
||||
int n, c;
|
||||
|
||||
/* Next domain name. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
|
||||
/* Type bit map. */
|
||||
n = edata - rdata;
|
||||
for (c = 0; c < n*8; c++)
|
||||
if (NS_NXT_BIT_ISSET(c, rdata)) {
|
||||
len = SPRINTF((tmp, " %s", p_type(c)));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_cert: {
|
||||
u_int c_type, key_tag, alg;
|
||||
int n;
|
||||
unsigned int siz;
|
||||
char base64_cert[8192], tmp1[40];
|
||||
const char *leader;
|
||||
|
||||
c_type = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
key_tag = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
alg = (u_int) *rdata++;
|
||||
|
||||
len = SPRINTF((tmp1, "%d %d %d ", c_type, key_tag, alg));
|
||||
T(addstr(tmp1, (size_t)len, &buf, &buflen));
|
||||
siz = (edata-rdata)*4/3 + 4; /* "+4" accounts for trailing \0 */
|
||||
if (siz > sizeof(base64_cert) * 3/4) {
|
||||
const char *str = "record too long to print";
|
||||
T(addstr(str, strlen(str), &buf, &buflen));
|
||||
}
|
||||
else {
|
||||
len = b64_ntop(rdata, (size_t)(edata-rdata),
|
||||
base64_cert, siz);
|
||||
|
||||
if (len < 0)
|
||||
goto formerr;
|
||||
else if (len > 15) {
|
||||
T(addstr(" (", (size_t)2, &buf, &buflen));
|
||||
leader = "\n\t\t";
|
||||
spaced = 0;
|
||||
}
|
||||
else
|
||||
leader = " ";
|
||||
|
||||
for (n = 0; n < len; n += 48) {
|
||||
T(addstr(leader, strlen(leader),
|
||||
&buf, &buflen));
|
||||
T(addstr(base64_cert + n, (size_t)MIN(len - n, 48),
|
||||
&buf, &buflen));
|
||||
}
|
||||
if (len > 15)
|
||||
T(addstr(" )", (size_t)2, &buf, &buflen));
|
||||
}
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_tkey: {
|
||||
/* KJD - need to complete this */
|
||||
u_long t;
|
||||
int mode, err, keysize;
|
||||
|
||||
/* Algorithm name. */
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
|
||||
/* Inception. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
len = SPRINTF((tmp, "%s ", p_secstodate(t)));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Experation. */
|
||||
t = ns_get32(rdata); rdata += NS_INT32SZ;
|
||||
len = SPRINTF((tmp, "%s ", p_secstodate(t)));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* Mode , Error, Key Size. */
|
||||
/* Priority, Weight, Port. */
|
||||
mode = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
err = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
keysize = ns_get16(rdata); rdata += NS_INT16SZ;
|
||||
len = SPRINTF((tmp, "%u %u %u ", mode, err, keysize));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
|
||||
/* XXX need to dump key, print otherdata length & other data */
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_tsig: {
|
||||
/* BEW - need to complete this */
|
||||
int n;
|
||||
|
||||
T(len = addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
rdata += 8; /* time */
|
||||
n = ns_get16(rdata); rdata += INT16SZ;
|
||||
rdata += n; /* sig */
|
||||
n = ns_get16(rdata); rdata += INT16SZ; /* original id */
|
||||
sprintf(buf, "%d", ns_get16(rdata));
|
||||
rdata += INT16SZ;
|
||||
addlen(strlen(buf), &buf, &buflen);
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_a6: {
|
||||
struct in6_addr a;
|
||||
int pbyte, pbit;
|
||||
|
||||
/* prefix length */
|
||||
if (rdlen == 0U) goto formerr;
|
||||
len = SPRINTF((tmp, "%d ", *rdata));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
pbit = *rdata;
|
||||
if (pbit > 128) goto formerr;
|
||||
pbyte = (pbit & ~7) / 8;
|
||||
rdata++;
|
||||
|
||||
/* address suffix: provided only when prefix len != 128 */
|
||||
if (pbit < 128) {
|
||||
if (rdata + pbyte >= edata) goto formerr;
|
||||
memset(&a, 0, sizeof(a));
|
||||
memcpy(&a.s6_addr[pbyte], rdata, sizeof(a) - pbyte);
|
||||
(void) inet_ntop(AF_INET6, &a, buf, buflen);
|
||||
addlen(strlen(buf), &buf, &buflen);
|
||||
rdata += sizeof(a) - pbyte;
|
||||
}
|
||||
|
||||
/* prefix name: provided only when prefix len > 0 */
|
||||
if (pbit == 0)
|
||||
break;
|
||||
if (rdata >= edata) goto formerr;
|
||||
T(addstr(" ", (size_t)1, &buf, &buflen));
|
||||
T(addname(msg, msglen, &rdata, origin, &buf, &buflen));
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
case ns_t_opt: {
|
||||
len = SPRINTF((tmp, "%u bytes", class));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
comment = "unknown RR type";
|
||||
goto hexify;
|
||||
}
|
||||
return (buf - obuf);
|
||||
formerr:
|
||||
comment = "RR format error";
|
||||
hexify: {
|
||||
int n, m;
|
||||
char *p;
|
||||
|
||||
len = SPRINTF((tmp, "\\# %tu%s\t; %s", edata - rdata,
|
||||
rdlen != 0 ? " (" : "", comment));
|
||||
T(addstr(tmp, (size_t)len, &buf, &buflen));
|
||||
while (rdata < edata) {
|
||||
p = tmp;
|
||||
p += SPRINTF((p, "\n\t"));
|
||||
spaced = 0;
|
||||
n = MIN(16, edata - rdata);
|
||||
for (m = 0; m < n; m++)
|
||||
p += SPRINTF((p, "%02x ", rdata[m]));
|
||||
T(addstr(tmp, (size_t)(p - tmp), &buf, &buflen));
|
||||
if (n < 16) {
|
||||
T(addstr(")", (size_t)1, &buf, &buflen));
|
||||
T(addtab((size_t)(p - tmp + 1), (size_t)48, spaced, &buf, &buflen));
|
||||
}
|
||||
p = tmp;
|
||||
p += SPRINTF((p, "; "));
|
||||
for (m = 0; m < n; m++)
|
||||
*p++ = (isascii(rdata[m]) && isprint(rdata[m]))
|
||||
? rdata[m]
|
||||
: '.';
|
||||
T(addstr(tmp, (size_t)(p - tmp), &buf, &buflen));
|
||||
rdata += n;
|
||||
}
|
||||
return (buf - obuf);
|
||||
}
|
||||
}
|
||||
|
||||
/* Private. */
|
||||
|
||||
/*
|
||||
* size_t
|
||||
* prune_origin(name, origin)
|
||||
* Find out if the name is at or under the current origin.
|
||||
* return:
|
||||
* Number of characters in name before start of origin,
|
||||
* or length of name if origin does not match.
|
||||
* notes:
|
||||
* This function should share code with samedomain().
|
||||
*/
|
||||
static size_t
|
||||
prune_origin(const char *name, const char *origin) {
|
||||
const char *oname = name;
|
||||
|
||||
while (*name != '\0') {
|
||||
if (origin != NULL && ns_samename(name, origin) == 1)
|
||||
return (name - oname - (name > oname));
|
||||
while (*name != '\0') {
|
||||
if (*name == '\\') {
|
||||
name++;
|
||||
/* XXX need to handle \nnn form. */
|
||||
if (*name == '\0')
|
||||
break;
|
||||
} else if (*name == '.') {
|
||||
name++;
|
||||
break;
|
||||
}
|
||||
name++;
|
||||
}
|
||||
}
|
||||
return (name - oname);
|
||||
}
|
||||
|
||||
/*
|
||||
* int
|
||||
* charstr(rdata, edata, buf, buflen)
|
||||
* Format a <character-string> into the presentation buffer.
|
||||
* return:
|
||||
* Number of rdata octets consumed
|
||||
* 0 for protocol format error
|
||||
* -1 for output buffer error
|
||||
* side effects:
|
||||
* buffer is advanced on success.
|
||||
*/
|
||||
static int
|
||||
charstr(const u_char *rdata, const u_char *edata, char **buf, size_t *buflen) {
|
||||
const u_char *odata = rdata;
|
||||
size_t save_buflen = *buflen;
|
||||
char *save_buf = *buf;
|
||||
|
||||
if (addstr("\"", (size_t)1, buf, buflen) < 0)
|
||||
goto enospc;
|
||||
if (rdata < edata) {
|
||||
int n = *rdata;
|
||||
|
||||
if (rdata + 1 + n <= edata) {
|
||||
rdata++;
|
||||
while (n-- > 0) {
|
||||
if (strchr("\n\"\\", *rdata) != NULL)
|
||||
if (addstr("\\", (size_t)1, buf, buflen) < 0)
|
||||
goto enospc;
|
||||
if (addstr((const char *)rdata, (size_t)1,
|
||||
buf, buflen) < 0)
|
||||
goto enospc;
|
||||
rdata++;
|
||||
}
|
||||
}
|
||||
}
|
||||
if (addstr("\"", (size_t)1, buf, buflen) < 0)
|
||||
goto enospc;
|
||||
return (rdata - odata);
|
||||
enospc:
|
||||
errno = ENOSPC;
|
||||
*buf = save_buf;
|
||||
*buflen = save_buflen;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
static int
|
||||
addname(const u_char *msg, size_t msglen,
|
||||
const u_char **pp, const char *origin,
|
||||
char **buf, size_t *buflen)
|
||||
{
|
||||
size_t newlen, save_buflen = *buflen;
|
||||
char *save_buf = *buf;
|
||||
int n;
|
||||
|
||||
n = dn_expand(msg, msg + msglen, *pp, *buf, (int)*buflen);
|
||||
if (n < 0)
|
||||
goto enospc; /* Guess. */
|
||||
newlen = prune_origin(*buf, origin);
|
||||
if (**buf == '\0') {
|
||||
goto root;
|
||||
} else if (newlen == 0U) {
|
||||
/* Use "@" instead of name. */
|
||||
if (newlen + 2 > *buflen)
|
||||
goto enospc; /* No room for "@\0". */
|
||||
(*buf)[newlen++] = '@';
|
||||
(*buf)[newlen] = '\0';
|
||||
} else {
|
||||
if (((origin == NULL || origin[0] == '\0') ||
|
||||
(origin[0] != '.' && origin[1] != '\0' &&
|
||||
(*buf)[newlen] == '\0')) && (*buf)[newlen - 1] != '.') {
|
||||
/* No trailing dot. */
|
||||
root:
|
||||
if (newlen + 2 > *buflen)
|
||||
goto enospc; /* No room for ".\0". */
|
||||
(*buf)[newlen++] = '.';
|
||||
(*buf)[newlen] = '\0';
|
||||
}
|
||||
}
|
||||
*pp += n;
|
||||
addlen(newlen, buf, buflen);
|
||||
**buf = '\0';
|
||||
return (newlen);
|
||||
enospc:
|
||||
errno = ENOSPC;
|
||||
*buf = save_buf;
|
||||
*buflen = save_buflen;
|
||||
return (-1);
|
||||
}
|
||||
|
||||
static void
|
||||
addlen(size_t len, char **buf, size_t *buflen) {
|
||||
assert(len <= *buflen);
|
||||
*buf += len;
|
||||
*buflen -= len;
|
||||
}
|
||||
|
||||
static int
|
||||
addstr(const char *src, size_t len, char **buf, size_t *buflen) {
|
||||
if (len >= *buflen) {
|
||||
errno = ENOSPC;
|
||||
return (-1);
|
||||
}
|
||||
memcpy(*buf, src, len);
|
||||
addlen(len, buf, buflen);
|
||||
**buf = '\0';
|
||||
return (0);
|
||||
}
|
||||
|
||||
static int
|
||||
addtab(size_t len, size_t target, int spaced, char **buf, size_t *buflen) {
|
||||
size_t save_buflen = *buflen;
|
||||
char *save_buf = *buf;
|
||||
int t;
|
||||
|
||||
if (spaced || len >= target - 1) {
|
||||
T(addstr(" ", (size_t)2, buf, buflen));
|
||||
spaced = 1;
|
||||
} else {
|
||||
for (t = (target - len - 1) / 8; t >= 0; t--)
|
||||
if (addstr("\t", (size_t)1, buf, buflen) < 0) {
|
||||
*buflen = save_buflen;
|
||||
*buf = save_buf;
|
||||
return (-1);
|
||||
}
|
||||
spaced = 0;
|
||||
}
|
||||
return (spaced);
|
||||
}
|
|
@ -1,226 +0,0 @@
|
|||
/* $NetBSD: ns_samedomain.c,v 1.2 2004/05/20 20:35:05 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1995,1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_samedomain.c,v 1.1.2.2.4.2 2004/03/16 12:34:17 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_samedomain.c,v 1.2 2004/05/20 20:35:05 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
#include <sys/types.h>
|
||||
#include "arpa_nameser.h"
|
||||
#include <errno.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifndef _LIBC
|
||||
/*
|
||||
* int
|
||||
* ns_samedomain(a, b)
|
||||
* Check whether a name belongs to a domain.
|
||||
* Inputs:
|
||||
* a - the domain whose ancestory is being verified
|
||||
* b - the potential ancestor we're checking against
|
||||
* Return:
|
||||
* boolean - is a at or below b?
|
||||
* Notes:
|
||||
* Trailing dots are first removed from name and domain.
|
||||
* Always compare complete subdomains, not only whether the
|
||||
* domain name is the trailing string of the given name.
|
||||
*
|
||||
* "host.foobar.top" lies in "foobar.top" and in "top" and in ""
|
||||
* but NOT in "bar.top"
|
||||
*/
|
||||
|
||||
int
|
||||
ns_samedomain(const char *a, const char *b) {
|
||||
size_t la, lb;
|
||||
int diff, i, escaped;
|
||||
const char *cp;
|
||||
|
||||
la = strlen(a);
|
||||
lb = strlen(b);
|
||||
|
||||
/* Ignore a trailing label separator (i.e. an unescaped dot) in 'a'. */
|
||||
if (la != 0U && a[la - 1] == '.') {
|
||||
escaped = 0;
|
||||
/* Note this loop doesn't get executed if la==1. */
|
||||
for (i = la - 2; i >= 0; i--)
|
||||
if (a[i] == '\\') {
|
||||
if (escaped)
|
||||
escaped = 0;
|
||||
else
|
||||
escaped = 1;
|
||||
} else
|
||||
break;
|
||||
if (!escaped)
|
||||
la--;
|
||||
}
|
||||
|
||||
/* Ignore a trailing label separator (i.e. an unescaped dot) in 'b'. */
|
||||
if (lb != 0U && b[lb - 1] == '.') {
|
||||
escaped = 0;
|
||||
/* note this loop doesn't get executed if lb==1 */
|
||||
for (i = lb - 2; i >= 0; i--)
|
||||
if (b[i] == '\\') {
|
||||
if (escaped)
|
||||
escaped = 0;
|
||||
else
|
||||
escaped = 1;
|
||||
} else
|
||||
break;
|
||||
if (!escaped)
|
||||
lb--;
|
||||
}
|
||||
|
||||
/* lb == 0 means 'b' is the root domain, so 'a' must be in 'b'. */
|
||||
if (lb == 0U)
|
||||
return (1);
|
||||
|
||||
/* 'b' longer than 'a' means 'a' can't be in 'b'. */
|
||||
if (lb > la)
|
||||
return (0);
|
||||
|
||||
/* 'a' and 'b' being equal at this point indicates sameness. */
|
||||
if (lb == la)
|
||||
return (strncasecmp(a, b, lb) == 0);
|
||||
|
||||
/* Ok, we know la > lb. */
|
||||
|
||||
diff = la - lb;
|
||||
|
||||
/*
|
||||
* If 'a' is only 1 character longer than 'b', then it can't be
|
||||
* a subdomain of 'b' (because of the need for the '.' label
|
||||
* separator).
|
||||
*/
|
||||
if (diff < 2)
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* If the character before the last 'lb' characters of 'b'
|
||||
* isn't '.', then it can't be a match (this lets us avoid
|
||||
* having "foobar.com" match "bar.com").
|
||||
*/
|
||||
if (a[diff - 1] != '.')
|
||||
return (0);
|
||||
|
||||
/*
|
||||
* We're not sure about that '.', however. It could be escaped
|
||||
* and thus not a really a label separator.
|
||||
*/
|
||||
escaped = 0;
|
||||
for (i = diff - 2; i >= 0; i--)
|
||||
if (a[i] == '\\') {
|
||||
if (escaped)
|
||||
escaped = 0;
|
||||
else
|
||||
escaped = 1;
|
||||
} else
|
||||
break;
|
||||
if (escaped)
|
||||
return (0);
|
||||
|
||||
/* Now compare aligned trailing substring. */
|
||||
cp = a + diff;
|
||||
return (strncasecmp(cp, b, lb) == 0);
|
||||
}
|
||||
|
||||
/*
|
||||
* int
|
||||
* ns_subdomain(a, b)
|
||||
* is "a" a subdomain of "b"?
|
||||
*/
|
||||
int
|
||||
ns_subdomain(const char *a, const char *b) {
|
||||
return (ns_samename(a, b) != 1 && ns_samedomain(a, b));
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/*
|
||||
* int
|
||||
* ns_makecanon(src, dst, dstsize)
|
||||
* make a canonical copy of domain name "src"
|
||||
* notes:
|
||||
* foo -> foo.
|
||||
* foo. -> foo.
|
||||
* foo.. -> foo.
|
||||
* foo\. -> foo\..
|
||||
* foo\\. -> foo\\.
|
||||
*/
|
||||
|
||||
int
|
||||
ns_makecanon(const char *src, char *dst, size_t dstsize) {
|
||||
size_t n = strlen(src);
|
||||
|
||||
if (n + sizeof "." > dstsize) { /* Note: sizeof == 2 */
|
||||
errno = EMSGSIZE;
|
||||
return (-1);
|
||||
}
|
||||
strcpy(dst, src);
|
||||
while (n >= 1U && dst[n - 1] == '.') /* Ends in "." */
|
||||
if (n >= 2U && dst[n - 2] == '\\' && /* Ends in "\." */
|
||||
(n < 3U || dst[n - 3] != '\\')) /* But not "\\." */
|
||||
break;
|
||||
else
|
||||
dst[--n] = '\0';
|
||||
dst[n++] = '.';
|
||||
dst[n] = '\0';
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* int
|
||||
* ns_samename(a, b)
|
||||
* determine whether domain name "a" is the same as domain name "b"
|
||||
* return:
|
||||
* -1 on error
|
||||
* 0 if names differ
|
||||
* 1 if names are the same
|
||||
*/
|
||||
|
||||
int
|
||||
ns_samename(const char *a, const char *b) {
|
||||
char ta[NS_MAXDNAME], tb[NS_MAXDNAME];
|
||||
|
||||
if (ns_makecanon(a, ta, sizeof ta) < 0 ||
|
||||
ns_makecanon(b, tb, sizeof tb) < 0)
|
||||
return (-1);
|
||||
if (strcasecmp(ta, tb) == 0)
|
||||
return (1);
|
||||
else
|
||||
return (0);
|
||||
}
|
|
@ -1,179 +0,0 @@
|
|||
/* $NetBSD: ns_ttl.c,v 1.2 2004/05/20 20:35:05 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1996,1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#ifndef lint
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: ns_ttl.c,v 1.1.206.1 2004/03/09 08:33:45 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: ns_ttl.c,v 1.2 2004/05/20 20:35:05 christos Exp $");
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Import. */
|
||||
|
||||
#include "arpa_nameser.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <errno.h>
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
#ifdef SPRINTF_CHAR
|
||||
# define SPRINTF(x) strlen(sprintf/**/x)
|
||||
#else
|
||||
# define SPRINTF(x) ((size_t)sprintf x)
|
||||
#endif
|
||||
|
||||
/* Forward. */
|
||||
|
||||
static int fmt1(int t, char s, char **buf, size_t *buflen);
|
||||
|
||||
/* Macros. */
|
||||
|
||||
#define T(x) do { if ((x) < 0) return (-1); } while(0)
|
||||
|
||||
/* Public. */
|
||||
|
||||
int
|
||||
ns_format_ttl(u_long src, char *dst, size_t dstlen) {
|
||||
char *odst = dst;
|
||||
int secs, mins, hours, days, weeks, x;
|
||||
char *p;
|
||||
|
||||
secs = src % 60; src /= 60;
|
||||
mins = src % 60; src /= 60;
|
||||
hours = src % 24; src /= 24;
|
||||
days = src % 7; src /= 7;
|
||||
weeks = src; src = 0;
|
||||
|
||||
x = 0;
|
||||
if (weeks) {
|
||||
T(fmt1(weeks, 'W', &dst, &dstlen));
|
||||
x++;
|
||||
}
|
||||
if (days) {
|
||||
T(fmt1(days, 'D', &dst, &dstlen));
|
||||
x++;
|
||||
}
|
||||
if (hours) {
|
||||
T(fmt1(hours, 'H', &dst, &dstlen));
|
||||
x++;
|
||||
}
|
||||
if (mins) {
|
||||
T(fmt1(mins, 'M', &dst, &dstlen));
|
||||
x++;
|
||||
}
|
||||
if (secs || !(weeks || days || hours || mins)) {
|
||||
T(fmt1(secs, 'S', &dst, &dstlen));
|
||||
x++;
|
||||
}
|
||||
|
||||
if (x > 1) {
|
||||
int ch;
|
||||
|
||||
for (p = odst; (ch = *p) != '\0'; p++)
|
||||
if (isascii(ch) && isupper(ch))
|
||||
*p = tolower(ch);
|
||||
}
|
||||
|
||||
return (dst - odst);
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifndef _LIBC
|
||||
int
|
||||
ns_parse_ttl(const char *src, u_long *dst) {
|
||||
u_long ttl, tmp;
|
||||
int ch, digits, dirty;
|
||||
|
||||
ttl = 0;
|
||||
tmp = 0;
|
||||
digits = 0;
|
||||
dirty = 0;
|
||||
while ((ch = *src++) != '\0') {
|
||||
if (!isascii(ch) || !isprint(ch))
|
||||
goto einval;
|
||||
if (isdigit(ch)) {
|
||||
tmp *= 10;
|
||||
tmp += (ch - '0');
|
||||
digits++;
|
||||
continue;
|
||||
}
|
||||
if (digits == 0)
|
||||
goto einval;
|
||||
if (islower(ch))
|
||||
ch = toupper(ch);
|
||||
switch (ch) {
|
||||
case 'W': tmp *= 7; /*FALLTHROUGH*/
|
||||
case 'D': tmp *= 24; /*FALLTHROUGH*/
|
||||
case 'H': tmp *= 60; /*FALLTHROUGH*/
|
||||
case 'M': tmp *= 60; /*FALLTHROUGH*/
|
||||
case 'S': break;
|
||||
default: goto einval;
|
||||
}
|
||||
ttl += tmp;
|
||||
tmp = 0;
|
||||
digits = 0;
|
||||
dirty = 1;
|
||||
}
|
||||
if (digits > 0) {
|
||||
if (dirty)
|
||||
goto einval;
|
||||
else
|
||||
ttl += tmp;
|
||||
}
|
||||
*dst = ttl;
|
||||
return (0);
|
||||
|
||||
einval:
|
||||
errno = EINVAL;
|
||||
return (-1);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
/* Private. */
|
||||
|
||||
static int
|
||||
fmt1(int t, char s, char **buf, size_t *buflen) {
|
||||
char tmp[50];
|
||||
size_t len;
|
||||
|
||||
len = SPRINTF((tmp, "%d%c", t, s));
|
||||
if (len + 1 > *buflen)
|
||||
return (-1);
|
||||
strcpy(*buf, tmp);
|
||||
*buf += len;
|
||||
*buflen -= len;
|
||||
return (0);
|
||||
}
|
|
@ -1,282 +0,0 @@
|
|||
/* $NetBSD: res_comp.c,v 1.6 2004/05/22 23:47:09 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1985, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University 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 REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies, and that
|
||||
* the name of Digital Equipment Corporation not be used in advertising or
|
||||
* publicity pertaining to distribution of the document or software without
|
||||
* specific, written prior permission.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
|
||||
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
|
||||
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Portions Copyright (c) 1996-1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#ifdef notdef
|
||||
static const char sccsid[] = "@(#)res_comp.c 8.1 (Berkeley) 6/4/93";
|
||||
static const char rcsid[] = "Id: res_comp.c,v 1.1.2.1.4.1 2004/03/09 08:33:54 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: res_comp.c,v 1.6 2004/05/22 23:47:09 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <netinet/in.h>
|
||||
#include "arpa_nameser.h"
|
||||
#include <ctype.h>
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
/*
|
||||
* Expand compressed domain name 'src' to full domain name.
|
||||
* 'msg' is a pointer to the begining of the message,
|
||||
* 'eom' points to the first location after the message,
|
||||
* 'dst' is a pointer to a buffer of size 'dstsiz' for the result.
|
||||
* Return size of compressed name or -1 if there was an error.
|
||||
*/
|
||||
int
|
||||
dn_expand(const u_char *msg, const u_char *eom, const u_char *src,
|
||||
char *dst, int dstsiz)
|
||||
{
|
||||
int n = ns_name_uncompress(msg, eom, src, dst, (size_t)dstsiz);
|
||||
|
||||
if (n > 0 && dst[0] == '.')
|
||||
dst[0] = '\0';
|
||||
return (n);
|
||||
}
|
||||
|
||||
/*
|
||||
* Pack domain name 'exp_dn' in presentation form into 'comp_dn'.
|
||||
* Return the size of the compressed name or -1.
|
||||
* 'length' is the size of the array pointed to by 'comp_dn'.
|
||||
*/
|
||||
int
|
||||
dn_comp(const char *src, u_char *dst, int dstsiz,
|
||||
u_char **dnptrs, u_char **lastdnptr)
|
||||
{
|
||||
return (ns_name_compress(src, dst, (size_t)dstsiz,
|
||||
(const u_char **)dnptrs,
|
||||
(const u_char **)lastdnptr));
|
||||
}
|
||||
|
||||
/*
|
||||
* Skip over a compressed domain name. Return the size or -1.
|
||||
*/
|
||||
int
|
||||
dn_skipname(const u_char *ptr, const u_char *eom) {
|
||||
const u_char *saveptr = ptr;
|
||||
|
||||
if (ns_name_skip(&ptr, eom) == -1)
|
||||
return (-1);
|
||||
return (ptr - saveptr);
|
||||
}
|
||||
|
||||
/*
|
||||
* Verify that a domain name uses an acceptable character set.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Note the conspicuous absence of ctype macros in these definitions. On
|
||||
* non-ASCII hosts, we can't depend on string literals or ctype macros to
|
||||
* tell us anything about network-format data. The rest of the BIND system
|
||||
* is not careful about this, but for some reason, we're doing it right here.
|
||||
*/
|
||||
|
||||
/* BIONIC: We also accept underscores in the middle of labels.
|
||||
* This extension is needed to make resolution on some VPN networks
|
||||
* work properly.
|
||||
*/
|
||||
|
||||
#define PERIOD 0x2e
|
||||
#define hyphenchar(c) ((c) == 0x2d)
|
||||
#define bslashchar(c) ((c) == 0x5c)
|
||||
#define periodchar(c) ((c) == PERIOD)
|
||||
#define asterchar(c) ((c) == 0x2a)
|
||||
#define alphachar(c) (((c) >= 0x41 && (c) <= 0x5a) \
|
||||
|| ((c) >= 0x61 && (c) <= 0x7a))
|
||||
#define digitchar(c) ((c) >= 0x30 && (c) <= 0x39)
|
||||
#define underscorechar(c) ((c) == 0x5f)
|
||||
|
||||
#define borderchar(c) (alphachar(c) || digitchar(c))
|
||||
#define middlechar(c) (borderchar(c) || hyphenchar(c) || underscorechar(c))
|
||||
#define domainchar(c) ((c) > 0x20 && (c) < 0x7f)
|
||||
|
||||
int
|
||||
res_hnok(const char *dn) {
|
||||
int pch = PERIOD, ch = *dn++;
|
||||
|
||||
while (ch != '\0') {
|
||||
int nch = *dn++;
|
||||
|
||||
if (periodchar(ch)) {
|
||||
;
|
||||
} else if (periodchar(pch)) {
|
||||
if (!borderchar(ch))
|
||||
return (0);
|
||||
} else if (periodchar(nch) || nch == '\0') {
|
||||
if (!borderchar(ch))
|
||||
return (0);
|
||||
} else {
|
||||
if (!middlechar(ch))
|
||||
return (0);
|
||||
}
|
||||
pch = ch, ch = nch;
|
||||
}
|
||||
return (1);
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
/*
|
||||
* hostname-like (A, MX, WKS) owners can have "*" as their first label
|
||||
* but must otherwise be as a host name.
|
||||
*/
|
||||
int
|
||||
res_ownok(const char *dn) {
|
||||
if (asterchar(dn[0])) {
|
||||
if (periodchar(dn[1]))
|
||||
return (res_hnok(dn+2));
|
||||
if (dn[1] == '\0')
|
||||
return (1);
|
||||
}
|
||||
return (res_hnok(dn));
|
||||
}
|
||||
|
||||
/*
|
||||
* SOA RNAMEs and RP RNAMEs can have any printable character in their first
|
||||
* label, but the rest of the name has to look like a host name.
|
||||
*/
|
||||
int
|
||||
res_mailok(const char *dn) {
|
||||
int ch, escaped = 0;
|
||||
|
||||
/* "." is a valid missing representation */
|
||||
if (*dn == '\0')
|
||||
return (1);
|
||||
|
||||
/* otherwise <label>.<hostname> */
|
||||
while ((ch = *dn++) != '\0') {
|
||||
if (!domainchar(ch))
|
||||
return (0);
|
||||
if (!escaped && periodchar(ch))
|
||||
break;
|
||||
if (escaped)
|
||||
escaped = 0;
|
||||
else if (bslashchar(ch))
|
||||
escaped = 1;
|
||||
}
|
||||
if (periodchar(ch))
|
||||
return (res_hnok(dn));
|
||||
return (0);
|
||||
}
|
||||
|
||||
/*
|
||||
* This function is quite liberal, since RFC 1034's character sets are only
|
||||
* recommendations.
|
||||
*/
|
||||
int
|
||||
res_dnok(const char *dn) {
|
||||
int ch;
|
||||
|
||||
while ((ch = *dn++) != '\0')
|
||||
if (!domainchar(ch))
|
||||
return (0);
|
||||
return (1);
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef BIND_4_COMPAT
|
||||
/*
|
||||
* This module must export the following externally-visible symbols:
|
||||
* ___putlong
|
||||
* ___putshort
|
||||
* __getlong
|
||||
* __getshort
|
||||
* Note that one _ comes from C and the others come from us.
|
||||
*/
|
||||
void __putlong(u_int32_t src, u_char *dst) { ns_put32(src, dst); }
|
||||
void __putshort(u_int16_t src, u_char *dst) { ns_put16(src, dst); }
|
||||
#ifndef __ultrix__
|
||||
u_int32_t _getlong(const u_char *src) { return (ns_get32(src)); }
|
||||
u_int16_t _getshort(const u_char *src) { return (ns_get16(src)); }
|
||||
#endif /*__ultrix__*/
|
||||
#endif /*BIND_4_COMPAT*/
|
|
@ -1,348 +0,0 @@
|
|||
/* $NetBSD: res_data.c,v 1.8 2004/06/09 18:07:03 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1995-1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#ifdef notdef
|
||||
static const char rcsid[] = "Id: res_data.c,v 1.1.206.2 2004/03/16 12:34:18 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: res_data.c,v 1.8 2004/06/09 18:07:03 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include "arpa_nameser.h"
|
||||
|
||||
#include <ctype.h>
|
||||
#include <netdb.h>
|
||||
#include "resolv_private.h"
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
|
||||
|
||||
const char * const _res_opcodes[] = {
|
||||
"QUERY",
|
||||
"IQUERY",
|
||||
"CQUERYM",
|
||||
"CQUERYU", /* experimental */
|
||||
"NOTIFY", /* experimental */
|
||||
"UPDATE",
|
||||
"6",
|
||||
"7",
|
||||
"8",
|
||||
"9",
|
||||
"10",
|
||||
"11",
|
||||
"12",
|
||||
"13",
|
||||
"ZONEINIT",
|
||||
"ZONEREF",
|
||||
};
|
||||
|
||||
#ifdef BIND_UPDATE
|
||||
const char * const _res_sectioncodes[] = {
|
||||
"ZONE",
|
||||
"PREREQUISITES",
|
||||
"UPDATE",
|
||||
"ADDITIONAL",
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifndef __BIND_NOSTATIC
|
||||
extern struct __res_state _nres;
|
||||
|
||||
/* Proto. */
|
||||
|
||||
int res_ourserver_p(const res_state, const struct sockaddr *);
|
||||
|
||||
#ifdef ANDROID_CHANGES
|
||||
int res_need_init() {
|
||||
return ((_nres.options & RES_INIT) == 0U) || res_get_dns_changed();
|
||||
}
|
||||
#else
|
||||
#define res_need_init() ((_nres.options & RES_INIT) == 0U)
|
||||
#endif
|
||||
|
||||
int
|
||||
res_init(void) {
|
||||
int rv;
|
||||
extern int __res_vinit(res_state, int);
|
||||
#ifdef COMPAT__RES
|
||||
/*
|
||||
* Compatibility with program that were accessing _res directly
|
||||
* to set options. We keep another struct res that is the same
|
||||
* size as the original res structure, and then copy fields to
|
||||
* it so that we achieve the same initialization
|
||||
*/
|
||||
extern void *__res_get_old_state(void);
|
||||
extern void __res_put_old_state(void *);
|
||||
res_state ores = __res_get_old_state();
|
||||
|
||||
if (ores->options != 0)
|
||||
_nres.options = ores->options;
|
||||
if (ores->retrans != 0)
|
||||
_nres.retrans = ores->retrans;
|
||||
if (ores->retry != 0)
|
||||
_nres.retry = ores->retry;
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These three fields used to be statically initialized. This made
|
||||
* it hard to use this code in a shared library. It is necessary,
|
||||
* now that we're doing dynamic initialization here, that we preserve
|
||||
* the old semantics: if an application modifies one of these three
|
||||
* fields of _res before res_init() is called, res_init() will not
|
||||
* alter them. Of course, if an application is setting them to
|
||||
* _zero_ before calling res_init(), hoping to override what used
|
||||
* to be the static default, we can't detect it and unexpected results
|
||||
* will follow. Zero for any of these fields would make no sense,
|
||||
* so one can safely assume that the applications were already getting
|
||||
* unexpected results.
|
||||
*
|
||||
* _nres.options is tricky since some apps were known to diddle the bits
|
||||
* before res_init() was first called. We can't replicate that semantic
|
||||
* with dynamic initialization (they may have turned bits off that are
|
||||
* set in RES_DEFAULT). Our solution is to declare such applications
|
||||
* "broken". They could fool us by setting RES_INIT but none do (yet).
|
||||
*/
|
||||
if (!_nres.retrans)
|
||||
_nres.retrans = RES_TIMEOUT;
|
||||
if (!_nres.retry)
|
||||
_nres.retry = 4;
|
||||
if (!(_nres.options & RES_INIT))
|
||||
_nres.options = RES_DEFAULT;
|
||||
|
||||
/*
|
||||
* This one used to initialize implicitly to zero, so unless the app
|
||||
* has set it to something in particular, we can randomize it now.
|
||||
*/
|
||||
if (!_nres.id)
|
||||
_nres.id = res_randomid();
|
||||
|
||||
rv = __res_vinit(&_nres, 1);
|
||||
#ifdef COMPAT__RES
|
||||
__res_put_old_state(&_nres);
|
||||
#endif
|
||||
return rv;
|
||||
}
|
||||
|
||||
void
|
||||
p_query(const u_char *msg) {
|
||||
fp_query(msg, stdout);
|
||||
}
|
||||
|
||||
void
|
||||
fp_query(const u_char *msg, FILE *file) {
|
||||
fp_nquery(msg, PACKETSZ, file);
|
||||
}
|
||||
|
||||
void
|
||||
fp_nquery(const u_char *msg, int len, FILE *file) {
|
||||
if (res_need_init() && res_init() == -1)
|
||||
return;
|
||||
|
||||
res_pquery(&_nres, msg, len, file);
|
||||
}
|
||||
|
||||
int
|
||||
res_mkquery(int op, /* opcode of query */
|
||||
const char *dname, /* domain name */
|
||||
int class, int type, /* class and type of query */
|
||||
const u_char *data, /* resource record data */
|
||||
int datalen, /* length of data */
|
||||
const u_char *newrr_in, /* new rr for modify or append */
|
||||
u_char *buf, /* buffer to put query */
|
||||
int buflen) /* size of buffer */
|
||||
{
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
return (res_nmkquery(&_nres, op, dname, class, type,
|
||||
data, datalen,
|
||||
newrr_in, buf, buflen));
|
||||
}
|
||||
|
||||
#ifdef _LIBRESOLV
|
||||
int
|
||||
res_mkupdate(ns_updrec *rrecp_in, u_char *buf, int buflen) {
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nmkupdate(&_nres, rrecp_in, buf, buflen));
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
res_query(const char *name, /* domain name */
|
||||
int class, int type, /* class and type of query */
|
||||
u_char *answer, /* buffer to put answer */
|
||||
int anslen) /* size of answer buffer */
|
||||
{
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
return (res_nquery(&_nres, name, class, type, answer, anslen));
|
||||
}
|
||||
|
||||
void
|
||||
res_send_setqhook(res_send_qhook hook) {
|
||||
_nres.qhook = hook;
|
||||
}
|
||||
|
||||
void
|
||||
res_send_setrhook(res_send_rhook hook) {
|
||||
_nres.rhook = hook;
|
||||
}
|
||||
|
||||
int
|
||||
res_isourserver(const struct sockaddr_in *inp) {
|
||||
return (res_ourserver_p(&_nres, (const struct sockaddr *)(const void *)inp));
|
||||
}
|
||||
|
||||
int
|
||||
res_send(const u_char *buf, int buflen, u_char *ans, int anssiz) {
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
/* errno should have been set by res_init() in this case. */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nsend(&_nres, buf, buflen, ans, anssiz));
|
||||
}
|
||||
|
||||
#ifdef _LIBRESOLV
|
||||
int
|
||||
res_sendsigned(const u_char *buf, int buflen, ns_tsig_key *key,
|
||||
u_char *ans, int anssiz)
|
||||
{
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
/* errno should have been set by res_init() in this case. */
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nsendsigned(&_nres, buf, buflen, key, ans, anssiz));
|
||||
}
|
||||
#endif
|
||||
|
||||
void
|
||||
res_close(void) {
|
||||
res_nclose(&_nres);
|
||||
}
|
||||
|
||||
#ifdef _LIBRESOLV
|
||||
int
|
||||
res_update(ns_updrec *rrecp_in) {
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nupdate(&_nres, rrecp_in, NULL));
|
||||
}
|
||||
#endif
|
||||
|
||||
int
|
||||
res_search(const char *name, /* domain name */
|
||||
int class, int type, /* class and type of query */
|
||||
u_char *answer, /* buffer to put answer */
|
||||
int anslen) /* size of answer */
|
||||
{
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nsearch(&_nres, name, class, type, answer, anslen));
|
||||
}
|
||||
|
||||
int
|
||||
res_querydomain(const char *name,
|
||||
const char *domain,
|
||||
int class, int type, /* class and type of query */
|
||||
u_char *answer, /* buffer to put answer */
|
||||
int anslen) /* size of answer */
|
||||
{
|
||||
if (res_need_init() && res_init() == -1) {
|
||||
RES_SET_H_ERRNO(&_nres, NETDB_INTERNAL);
|
||||
return (-1);
|
||||
}
|
||||
|
||||
return (res_nquerydomain(&_nres, name, domain,
|
||||
class, type,
|
||||
answer, anslen));
|
||||
}
|
||||
|
||||
int
|
||||
res_opt(int a, u_char *b, int c, int d)
|
||||
{
|
||||
return res_nopt(&_nres, a, b, c, d);
|
||||
}
|
||||
#endif
|
||||
#endif
|
||||
|
||||
const char *
|
||||
hostalias(const char *name) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifndef MOZILLA_NECKO_EXCLUDE_CODE
|
||||
#ifdef ultrix
|
||||
int
|
||||
local_hostname_length(const char *hostname) {
|
||||
int len_host, len_domain;
|
||||
|
||||
if (!*_nres.defdname)
|
||||
res_init();
|
||||
len_host = strlen(hostname);
|
||||
len_domain = strlen(_nres.defdname);
|
||||
if (len_host > len_domain &&
|
||||
!strcasecmp(hostname + len_host - len_domain, _nres.defdname) &&
|
||||
hostname[len_host - len_domain - 1] == '.')
|
||||
return (len_host - len_domain - 1);
|
||||
return (0);
|
||||
}
|
||||
#endif /*ultrix*/
|
||||
#endif
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,46 +0,0 @@
|
|||
/* $NetBSD: res_debug.h,v 1.1.1.1 2004/05/20 17:18:55 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Copyright (c) 1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _RES_DEBUG_H_
|
||||
#define _RES_DEBUG_H_
|
||||
|
||||
#ifndef DEBUG
|
||||
# define Dprint(cond, args) /*empty*/
|
||||
# define DprintQ(cond, args, query, size) /*empty*/
|
||||
# define Aerror(statp, file, string, error, address) /*empty*/
|
||||
# define Perror(statp, file, string, error) /*empty*/
|
||||
#else
|
||||
# define Dprint(cond, args) if (cond) {fprintf args;} else {}
|
||||
# define DprintQ(cond, args, query, size) if (cond) {\
|
||||
fprintf args;\
|
||||
res_pquery(statp, query, size, stdout);\
|
||||
} else {}
|
||||
#endif
|
||||
|
||||
#endif /* _RES_DEBUG_H_ */
|
|
@ -1,960 +0,0 @@
|
|||
/* $NetBSD: res_init.c,v 1.8 2006/03/19 03:10:08 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1985, 1989, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University 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 REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies, and that
|
||||
* the name of Digital Equipment Corporation not be used in advertising or
|
||||
* publicity pertaining to distribution of the document or software without
|
||||
* specific, written prior permission.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
|
||||
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
|
||||
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Portions Copyright (c) 1996-1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLE_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#ifdef notdef
|
||||
static const char sccsid[] = "@(#)res_init.c 8.1 (Berkeley) 6/7/93";
|
||||
static const char rcsid[] = "Id: res_init.c,v 1.9.2.5.4.2 2004/03/16 12:34:18 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: res_init.c,v 1.8 2006/03/19 03:10:08 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <sys/socket.h>
|
||||
#include <sys/time.h>
|
||||
|
||||
#include <netinet/in.h>
|
||||
#include <arpa/inet.h>
|
||||
#include "arpa_nameser.h"
|
||||
|
||||
#include <assert.h>
|
||||
#include <ctype.h>
|
||||
#include <stdio.h>
|
||||
#include <stdlib.h>
|
||||
#include <string.h>
|
||||
#include <unistd.h>
|
||||
#include <netdb.h>
|
||||
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include <sys/system_properties.h>
|
||||
#include <errno.h>
|
||||
#include <fcntl.h>
|
||||
#endif /* ANDROID_CHANGES */
|
||||
|
||||
#ifndef MIN
|
||||
#define MIN(x,y) ((x)<(y)?(x):(y))
|
||||
#endif
|
||||
|
||||
/* ensure that sockaddr_in6 and IN6ADDR_ANY_INIT are declared / defined */
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#define MAX_DNS_PROPERTIES 8
|
||||
#define DNS_PROP_NAME_PREFIX "net.dns"
|
||||
#define DNS_CHANGE_PROP_NAME "net.dnschange"
|
||||
#define DNS_SEARCH_PROP_NAME "net.dns.search"
|
||||
const prop_info *dns_change_prop;
|
||||
int dns_last_change_counter;
|
||||
static int _get_dns_change_count();
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
|
||||
#include "res_private.h"
|
||||
|
||||
/* Options. Should all be left alone. */
|
||||
#ifndef DEBUG
|
||||
#define DEBUG
|
||||
#endif
|
||||
|
||||
static void res_setoptions __P((res_state, const char *, const char *));
|
||||
|
||||
static const char sort_mask[] = "/&";
|
||||
#define ISSORTMASK(ch) (strchr(sort_mask, ch) != NULL)
|
||||
static u_int32_t net_mask __P((struct in_addr));
|
||||
|
||||
#if !defined(isascii) /* XXX - could be a function */
|
||||
# define isascii(c) (!(c & 0200))
|
||||
#endif
|
||||
|
||||
/*
|
||||
* Resolver state default settings.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Set up default settings. If the configuration file exist, the values
|
||||
* there will have precedence. Otherwise, the server address is set to
|
||||
* INADDR_ANY and the default domain name comes from the gethostname().
|
||||
*
|
||||
* An interrim version of this code (BIND 4.9, pre-4.4BSD) used 127.0.0.1
|
||||
* rather than INADDR_ANY ("0.0.0.0") as the default name server address
|
||||
* since it was noted that INADDR_ANY actually meant ``the first interface
|
||||
* you "ifconfig"'d at boot time'' and if this was a SLIP or PPP interface,
|
||||
* it had to be "up" in order for you to reach your own name server. It
|
||||
* was later decided that since the recommended practice is to always
|
||||
* install local static routes through 127.0.0.1 for all your network
|
||||
* interfaces, that we could solve this problem without a code change.
|
||||
*
|
||||
* The configuration file should always be used, since it is the only way
|
||||
* to specify a default domain. If you are running a server on your local
|
||||
* machine, you should say "nameserver 0.0.0.0" or "nameserver 127.0.0.1"
|
||||
* in the configuration file.
|
||||
*
|
||||
* Return 0 if completes successfully, -1 on error
|
||||
*/
|
||||
int
|
||||
res_ninit(res_state statp) {
|
||||
extern int __res_vinit(res_state, int);
|
||||
|
||||
return (__res_vinit(statp, 0));
|
||||
}
|
||||
|
||||
#ifdef ANDROID_CHANGES
|
||||
int load_domain_search_list(res_state statp) {
|
||||
char propvalue[PROP_VALUE_MAX];
|
||||
register char *cp, **pp;
|
||||
|
||||
if(__system_property_get(DNS_SEARCH_PROP_NAME, propvalue) >= 1) {
|
||||
strlcpy(statp->defdname, propvalue, sizeof(statp->defdname));
|
||||
if ((cp = strchr(statp->defdname, '\n')) != NULL)
|
||||
*cp = '\0';
|
||||
cp = statp->defdname;
|
||||
pp = statp->dnsrch;
|
||||
while ( pp < statp->dnsrch + MAXDNSRCH ) {
|
||||
while (*cp == ' ' || *cp == '\t') /* skip leading white space */
|
||||
cp++;
|
||||
if (*cp == '\0') /* stop if nothing more */
|
||||
break;
|
||||
*pp++ = cp; /* record this search domain */
|
||||
while (*cp) { /* zero-terminate it */
|
||||
if (*cp == ' ' || *cp == '\t') {
|
||||
*cp++ = '\0';
|
||||
break;
|
||||
}
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
*pp = NULL; /* statp->dnsrch has MAXDNSRCH+1 items */
|
||||
if (pp > statp->dnsrch)
|
||||
return 1;
|
||||
}
|
||||
statp->defdname[0] = '\0'; /* no default domain name on Android */
|
||||
statp->dnsrch[0] = NULL;
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* This function has to be reachable by res_data.c but not publicly. */
|
||||
int
|
||||
__res_vinit(res_state statp, int preinit) {
|
||||
register FILE *fp;
|
||||
register char *cp, **pp;
|
||||
register int n;
|
||||
char buf[BUFSIZ];
|
||||
int nserv = 0; /* number of nameserver records read from file */
|
||||
int haveenv = 0;
|
||||
int havesearch = 0;
|
||||
int nsort = 0;
|
||||
char *net;
|
||||
int dots;
|
||||
union res_sockaddr_union u[2];
|
||||
#ifdef ANDROID_CHANGES
|
||||
pid_t mypid = getpid();
|
||||
int use_proc_props = 0;
|
||||
int found_prop;
|
||||
char dnsProperty[PROP_VALUE_MAX];
|
||||
#endif
|
||||
|
||||
if (!preinit) {
|
||||
statp->retrans = RES_TIMEOUT;
|
||||
statp->retry = RES_DFLRETRY;
|
||||
statp->options = RES_DEFAULT;
|
||||
statp->id = res_randomid();
|
||||
}
|
||||
|
||||
if ((statp->options & RES_INIT) != 0U)
|
||||
res_ndestroy(statp);
|
||||
|
||||
memset(u, 0, sizeof(u));
|
||||
#ifdef USELOOPBACK
|
||||
u[nserv].sin.sin_addr = inet_makeaddr(IN_LOOPBACKNET, 1);
|
||||
#else
|
||||
u[nserv].sin.sin_addr.s_addr = INADDR_ANY;
|
||||
#endif
|
||||
u[nserv].sin.sin_family = AF_INET;
|
||||
u[nserv].sin.sin_port = htons(NAMESERVER_PORT);
|
||||
#ifdef HAVE_SA_LEN
|
||||
u[nserv].sin.sin_len = sizeof(struct sockaddr_in);
|
||||
#endif
|
||||
nserv++;
|
||||
#ifdef HAS_INET6_STRUCTS
|
||||
#ifdef USELOOPBACK
|
||||
u[nserv].sin6.sin6_addr = in6addr_loopback;
|
||||
#else
|
||||
u[nserv].sin6.sin6_addr = in6addr_any;
|
||||
#endif
|
||||
u[nserv].sin6.sin6_family = AF_INET6;
|
||||
u[nserv].sin6.sin6_port = htons(NAMESERVER_PORT);
|
||||
#ifdef HAVE_SA_LEN
|
||||
u[nserv].sin6.sin6_len = sizeof(struct sockaddr_in6);
|
||||
#endif
|
||||
nserv++;
|
||||
#endif
|
||||
statp->nscount = 0;
|
||||
statp->ndots = 1;
|
||||
statp->pfcode = 0;
|
||||
statp->_vcsock = -1;
|
||||
statp->_flags = 0;
|
||||
statp->qhook = NULL;
|
||||
statp->rhook = NULL;
|
||||
statp->_u._ext.nscount = 0;
|
||||
statp->_u._ext.ext = malloc(sizeof(*statp->_u._ext.ext));
|
||||
if (statp->_u._ext.ext != NULL) {
|
||||
memset(statp->_u._ext.ext, 0, sizeof(*statp->_u._ext.ext));
|
||||
statp->_u._ext.ext->nsaddrs[0].sin = statp->nsaddr;
|
||||
strcpy(statp->_u._ext.ext->nsuffix, "ip6.arpa");
|
||||
strcpy(statp->_u._ext.ext->nsuffix2, "ip6.int");
|
||||
}
|
||||
statp->nsort = 0;
|
||||
res_setservers(statp, u, nserv);
|
||||
|
||||
#if 0 /* IGNORE THE ENVIRONMENT */
|
||||
/* Allow user to override the local domain definition */
|
||||
if ((cp = getenv("LOCALDOMAIN")) != NULL) {
|
||||
(void)strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1);
|
||||
statp->defdname[sizeof(statp->defdname) - 1] = '\0';
|
||||
haveenv++;
|
||||
|
||||
/*
|
||||
* Set search list to be blank-separated strings
|
||||
* from rest of env value. Permits users of LOCALDOMAIN
|
||||
* to still have a search list, and anyone to set the
|
||||
* one that they want to use as an individual (even more
|
||||
* important now that the rfc1535 stuff restricts searches)
|
||||
*/
|
||||
cp = statp->defdname;
|
||||
pp = statp->dnsrch;
|
||||
*pp++ = cp;
|
||||
for (n = 0; *cp && pp < statp->dnsrch + MAXDNSRCH; cp++) {
|
||||
if (*cp == '\n') /* silly backwards compat */
|
||||
break;
|
||||
else if (*cp == ' ' || *cp == '\t') {
|
||||
*cp = 0;
|
||||
n = 1;
|
||||
} else if (n) {
|
||||
*pp++ = cp;
|
||||
n = 0;
|
||||
havesearch = 1;
|
||||
}
|
||||
}
|
||||
/* null terminate last domain if there are excess */
|
||||
while (*cp != '\0' && *cp != ' ' && *cp != '\t' && *cp != '\n')
|
||||
cp++;
|
||||
*cp = '\0';
|
||||
*pp++ = 0;
|
||||
}
|
||||
if (nserv > 0)
|
||||
statp->nscount = nserv;
|
||||
#endif
|
||||
#ifdef ANDROID_CHANGES /* READ FROM SYSTEM PROPERTIES */
|
||||
dns_last_change_counter = _get_dns_change_count();
|
||||
|
||||
nserv = 0;
|
||||
for(n = 1; n <= MAX_DNS_PROPERTIES && nserv < MAXNS; n++) {
|
||||
char propname[PROP_NAME_MAX];
|
||||
char propvalue[PROP_VALUE_MAX];
|
||||
|
||||
struct addrinfo hints, *ai;
|
||||
char sbuf[NI_MAXSERV];
|
||||
const size_t minsiz = sizeof(statp->_u._ext.ext->nsaddrs[0]);
|
||||
|
||||
/*
|
||||
* Check first for process-specific properties, and if those don't
|
||||
* exist, try the generic properties.
|
||||
*/
|
||||
found_prop = 0;
|
||||
if (n == 1 || use_proc_props) {
|
||||
snprintf(propname, sizeof(propname), "%s%d.%d", DNS_PROP_NAME_PREFIX, n, mypid);
|
||||
if(__system_property_get(propname, propvalue) < 1) {
|
||||
if (use_proc_props) {
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
found_prop = 1;
|
||||
use_proc_props = 1;
|
||||
}
|
||||
}
|
||||
if (!found_prop) {
|
||||
snprintf(propname, sizeof(propname), "%s%d", DNS_PROP_NAME_PREFIX, n);
|
||||
if(__system_property_get(propname, propvalue) < 1) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
cp = propvalue;
|
||||
|
||||
while (*cp == ' ' || *cp == '\t')
|
||||
cp++;
|
||||
cp[strcspn(cp, ";# \t\n")] = '\0';
|
||||
if ((*cp != '\0') && (*cp != '\n')) {
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = PF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_DGRAM; /*dummy*/
|
||||
hints.ai_flags = AI_NUMERICHOST;
|
||||
sprintf(sbuf, "%u", NAMESERVER_PORT);
|
||||
if (getaddrinfo(cp, sbuf, &hints, &ai) == 0 &&
|
||||
(size_t)ai->ai_addrlen <= minsiz) {
|
||||
if (statp->_u._ext.ext != NULL) {
|
||||
memcpy(&statp->_u._ext.ext->nsaddrs[nserv],
|
||||
ai->ai_addr, ai->ai_addrlen);
|
||||
}
|
||||
if ((size_t)ai->ai_addrlen <=
|
||||
sizeof(statp->nsaddr_list[nserv])) {
|
||||
memcpy(&statp->nsaddr_list[nserv],
|
||||
ai->ai_addr, ai->ai_addrlen);
|
||||
} else {
|
||||
statp->nsaddr_list[nserv].sin_family = 0;
|
||||
}
|
||||
freeaddrinfo(ai);
|
||||
nserv++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Add the domain search list */
|
||||
havesearch = load_domain_search_list(statp);
|
||||
#else /* !ANDROID_CHANGES - IGNORE resolv.conf in Android */
|
||||
#define MATCH(line, name) \
|
||||
(!strncmp(line, name, sizeof(name) - 1) && \
|
||||
(line[sizeof(name) - 1] == ' ' || \
|
||||
line[sizeof(name) - 1] == '\t'))
|
||||
|
||||
nserv = 0;
|
||||
if ((fp = fopen(_PATH_RESCONF, "r")) != NULL) {
|
||||
/* read the config file */
|
||||
while (fgets(buf, sizeof(buf), fp) != NULL) {
|
||||
/* skip comments */
|
||||
if (*buf == ';' || *buf == '#')
|
||||
continue;
|
||||
/* read default domain name */
|
||||
if (MATCH(buf, "domain")) {
|
||||
if (haveenv) /* skip if have from environ */
|
||||
continue;
|
||||
cp = buf + sizeof("domain") - 1;
|
||||
while (*cp == ' ' || *cp == '\t')
|
||||
cp++;
|
||||
if ((*cp == '\0') || (*cp == '\n'))
|
||||
continue;
|
||||
strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1);
|
||||
statp->defdname[sizeof(statp->defdname) - 1] = '\0';
|
||||
if ((cp = strpbrk(statp->defdname, " \t\n")) != NULL)
|
||||
*cp = '\0';
|
||||
havesearch = 0;
|
||||
continue;
|
||||
}
|
||||
/* set search list */
|
||||
if (MATCH(buf, "search")) {
|
||||
if (haveenv) /* skip if have from environ */
|
||||
continue;
|
||||
cp = buf + sizeof("search") - 1;
|
||||
while (*cp == ' ' || *cp == '\t')
|
||||
cp++;
|
||||
if ((*cp == '\0') || (*cp == '\n'))
|
||||
continue;
|
||||
strncpy(statp->defdname, cp, sizeof(statp->defdname) - 1);
|
||||
statp->defdname[sizeof(statp->defdname) - 1] = '\0';
|
||||
if ((cp = strchr(statp->defdname, '\n')) != NULL)
|
||||
*cp = '\0';
|
||||
/*
|
||||
* Set search list to be blank-separated strings
|
||||
* on rest of line.
|
||||
*/
|
||||
cp = statp->defdname;
|
||||
pp = statp->dnsrch;
|
||||
*pp++ = cp;
|
||||
for (n = 0; *cp && pp < statp->dnsrch + MAXDNSRCH; cp++) {
|
||||
if (*cp == ' ' || *cp == '\t') {
|
||||
*cp = 0;
|
||||
n = 1;
|
||||
} else if (n) {
|
||||
*pp++ = cp;
|
||||
n = 0;
|
||||
}
|
||||
}
|
||||
/* null terminate last domain if there are excess */
|
||||
while (*cp != '\0' && *cp != ' ' && *cp != '\t')
|
||||
cp++;
|
||||
*cp = '\0';
|
||||
*pp++ = 0;
|
||||
havesearch = 1;
|
||||
continue;
|
||||
}
|
||||
/* read nameservers to query */
|
||||
if (MATCH(buf, "nameserver") && nserv < MAXNS) {
|
||||
struct addrinfo hints, *ai;
|
||||
char sbuf[NI_MAXSERV];
|
||||
const size_t minsiz =
|
||||
sizeof(statp->_u._ext.ext->nsaddrs[0]);
|
||||
|
||||
cp = buf + sizeof("nameserver") - 1;
|
||||
while (*cp == ' ' || *cp == '\t')
|
||||
cp++;
|
||||
cp[strcspn(cp, ";# \t\n")] = '\0';
|
||||
if ((*cp != '\0') && (*cp != '\n')) {
|
||||
memset(&hints, 0, sizeof(hints));
|
||||
hints.ai_family = PF_UNSPEC;
|
||||
hints.ai_socktype = SOCK_DGRAM; /*dummy*/
|
||||
hints.ai_flags = AI_NUMERICHOST;
|
||||
sprintf(sbuf, "%u", NAMESERVER_PORT);
|
||||
if (getaddrinfo(cp, sbuf, &hints, &ai) == 0 &&
|
||||
ai->ai_addrlen <= minsiz) {
|
||||
if (statp->_u._ext.ext != NULL) {
|
||||
memcpy(&statp->_u._ext.ext->nsaddrs[nserv],
|
||||
ai->ai_addr, ai->ai_addrlen);
|
||||
}
|
||||
if (ai->ai_addrlen <=
|
||||
sizeof(statp->nsaddr_list[nserv])) {
|
||||
memcpy(&statp->nsaddr_list[nserv],
|
||||
ai->ai_addr, ai->ai_addrlen);
|
||||
} else
|
||||
statp->nsaddr_list[nserv].sin_family = 0;
|
||||
freeaddrinfo(ai);
|
||||
nserv++;
|
||||
}
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (MATCH(buf, "sortlist")) {
|
||||
struct in_addr a;
|
||||
|
||||
cp = buf + sizeof("sortlist") - 1;
|
||||
while (nsort < MAXRESOLVSORT) {
|
||||
while (*cp == ' ' || *cp == '\t')
|
||||
cp++;
|
||||
if (*cp == '\0' || *cp == '\n' || *cp == ';')
|
||||
break;
|
||||
net = cp;
|
||||
while (*cp && !ISSORTMASK(*cp) && *cp != ';' &&
|
||||
isascii(*cp) && !isspace((unsigned char)*cp))
|
||||
cp++;
|
||||
n = *cp;
|
||||
*cp = 0;
|
||||
if (inet_aton(net, &a)) {
|
||||
statp->sort_list[nsort].addr = a;
|
||||
if (ISSORTMASK(n)) {
|
||||
*cp++ = n;
|
||||
net = cp;
|
||||
while (*cp && *cp != ';' &&
|
||||
isascii(*cp) &&
|
||||
!isspace((unsigned char)*cp))
|
||||
cp++;
|
||||
n = *cp;
|
||||
*cp = 0;
|
||||
if (inet_aton(net, &a)) {
|
||||
statp->sort_list[nsort].mask = a.s_addr;
|
||||
} else {
|
||||
statp->sort_list[nsort].mask =
|
||||
net_mask(statp->sort_list[nsort].addr);
|
||||
}
|
||||
} else {
|
||||
statp->sort_list[nsort].mask =
|
||||
net_mask(statp->sort_list[nsort].addr);
|
||||
}
|
||||
nsort++;
|
||||
}
|
||||
*cp = n;
|
||||
}
|
||||
continue;
|
||||
}
|
||||
if (MATCH(buf, "options")) {
|
||||
res_setoptions(statp, buf + sizeof("options") - 1, "conf");
|
||||
continue;
|
||||
}
|
||||
}
|
||||
if (nserv > 0)
|
||||
statp->nscount = nserv;
|
||||
statp->nsort = nsort;
|
||||
(void) fclose(fp);
|
||||
}
|
||||
#endif /* !ANDROID_CHANGES */
|
||||
/*
|
||||
* Last chance to get a nameserver. This should not normally
|
||||
* be necessary
|
||||
*/
|
||||
#ifdef NO_RESOLV_CONF
|
||||
if(nserv == 0)
|
||||
nserv = get_nameservers(statp);
|
||||
#endif
|
||||
|
||||
if (statp->defdname[0] == 0 &&
|
||||
gethostname(buf, sizeof(statp->defdname) - 1) == 0 &&
|
||||
(cp = strchr(buf, '.')) != NULL)
|
||||
strcpy(statp->defdname, cp + 1);
|
||||
|
||||
/* find components of local domain that might be searched */
|
||||
if (havesearch == 0) {
|
||||
pp = statp->dnsrch;
|
||||
*pp++ = statp->defdname;
|
||||
*pp = NULL;
|
||||
|
||||
dots = 0;
|
||||
for (cp = statp->defdname; *cp; cp++)
|
||||
dots += (*cp == '.');
|
||||
|
||||
cp = statp->defdname;
|
||||
while (pp < statp->dnsrch + MAXDFLSRCH) {
|
||||
if (dots < LOCALDOMAINPARTS)
|
||||
break;
|
||||
cp = strchr(cp, '.') + 1; /* we know there is one */
|
||||
*pp++ = cp;
|
||||
dots--;
|
||||
}
|
||||
*pp = NULL;
|
||||
#ifdef DEBUG
|
||||
if (statp->options & RES_DEBUG) {
|
||||
printf(";; res_init()... default dnsrch list:\n");
|
||||
for (pp = statp->dnsrch; *pp; pp++)
|
||||
printf(";;\t%s\n", *pp);
|
||||
printf(";;\t..END..\n");
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
if ((cp = getenv("RES_OPTIONS")) != NULL)
|
||||
res_setoptions(statp, cp, "env");
|
||||
if (nserv > 0) {
|
||||
statp->nscount = nserv;
|
||||
statp->options |= RES_INIT;
|
||||
}
|
||||
return (0);
|
||||
}
|
||||
|
||||
static void
|
||||
res_setoptions(res_state statp, const char *options, const char *source)
|
||||
{
|
||||
const char *cp = options;
|
||||
int i;
|
||||
struct __res_state_ext *ext = statp->_u._ext.ext;
|
||||
|
||||
#ifdef DEBUG
|
||||
if (statp->options & RES_DEBUG)
|
||||
printf(";; res_setoptions(\"%s\", \"%s\")...\n",
|
||||
options, source);
|
||||
#endif
|
||||
while (*cp) {
|
||||
/* skip leading and inner runs of spaces */
|
||||
while (*cp == ' ' || *cp == '\t')
|
||||
cp++;
|
||||
/* search for and process individual options */
|
||||
if (!strncmp(cp, "ndots:", sizeof("ndots:") - 1)) {
|
||||
i = atoi(cp + sizeof("ndots:") - 1);
|
||||
if (i <= RES_MAXNDOTS)
|
||||
statp->ndots = i;
|
||||
else
|
||||
statp->ndots = RES_MAXNDOTS;
|
||||
#ifdef DEBUG
|
||||
if (statp->options & RES_DEBUG)
|
||||
printf(";;\tndots=%d\n", statp->ndots);
|
||||
#endif
|
||||
} else if (!strncmp(cp, "timeout:", sizeof("timeout:") - 1)) {
|
||||
i = atoi(cp + sizeof("timeout:") - 1);
|
||||
if (i <= RES_MAXRETRANS)
|
||||
statp->retrans = i;
|
||||
else
|
||||
statp->retrans = RES_MAXRETRANS;
|
||||
#ifdef DEBUG
|
||||
if (statp->options & RES_DEBUG)
|
||||
printf(";;\ttimeout=%d\n", statp->retrans);
|
||||
#endif
|
||||
} else if (!strncmp(cp, "attempts:", sizeof("attempts:") - 1)){
|
||||
i = atoi(cp + sizeof("attempts:") - 1);
|
||||
if (i <= RES_MAXRETRY)
|
||||
statp->retry = i;
|
||||
else
|
||||
statp->retry = RES_MAXRETRY;
|
||||
#ifdef DEBUG
|
||||
if (statp->options & RES_DEBUG)
|
||||
printf(";;\tattempts=%d\n", statp->retry);
|
||||
#endif
|
||||
} else if (!strncmp(cp, "debug", sizeof("debug") - 1)) {
|
||||
#ifdef DEBUG
|
||||
if (!(statp->options & RES_DEBUG)) {
|
||||
printf(";; res_setoptions(\"%s\", \"%s\")..\n",
|
||||
options, source);
|
||||
statp->options |= RES_DEBUG;
|
||||
}
|
||||
printf(";;\tdebug\n");
|
||||
#endif
|
||||
} else if (!strncmp(cp, "no_tld_query",
|
||||
sizeof("no_tld_query") - 1) ||
|
||||
!strncmp(cp, "no-tld-query",
|
||||
sizeof("no-tld-query") - 1)) {
|
||||
statp->options |= RES_NOTLDQUERY;
|
||||
} else if (!strncmp(cp, "inet6", sizeof("inet6") - 1)) {
|
||||
statp->options |= RES_USE_INET6;
|
||||
} else if (!strncmp(cp, "rotate", sizeof("rotate") - 1)) {
|
||||
statp->options |= RES_ROTATE;
|
||||
} else if (!strncmp(cp, "no-check-names",
|
||||
sizeof("no-check-names") - 1)) {
|
||||
statp->options |= RES_NOCHECKNAME;
|
||||
}
|
||||
#ifdef RES_USE_EDNS0
|
||||
else if (!strncmp(cp, "edns0", sizeof("edns0") - 1)) {
|
||||
statp->options |= RES_USE_EDNS0;
|
||||
}
|
||||
#endif
|
||||
else if (!strncmp(cp, "dname", sizeof("dname") - 1)) {
|
||||
statp->options |= RES_USE_DNAME;
|
||||
}
|
||||
else if (!strncmp(cp, "nibble:", sizeof("nibble:") - 1)) {
|
||||
if (ext == NULL)
|
||||
goto skip;
|
||||
cp += sizeof("nibble:") - 1;
|
||||
i = MIN(strcspn(cp, " \t"), sizeof(ext->nsuffix) - 1);
|
||||
strncpy(ext->nsuffix, cp, (size_t)i);
|
||||
ext->nsuffix[i] = '\0';
|
||||
}
|
||||
else if (!strncmp(cp, "nibble2:", sizeof("nibble2:") - 1)) {
|
||||
if (ext == NULL)
|
||||
goto skip;
|
||||
cp += sizeof("nibble2:") - 1;
|
||||
i = MIN(strcspn(cp, " \t"), sizeof(ext->nsuffix2) - 1);
|
||||
strncpy(ext->nsuffix2, cp, (size_t)i);
|
||||
ext->nsuffix2[i] = '\0';
|
||||
}
|
||||
else if (!strncmp(cp, "v6revmode:", sizeof("v6revmode:") - 1)) {
|
||||
cp += sizeof("v6revmode:") - 1;
|
||||
/* "nibble" and "bitstring" used to be valid */
|
||||
if (!strncmp(cp, "single", sizeof("single") - 1)) {
|
||||
statp->options |= RES_NO_NIBBLE2;
|
||||
} else if (!strncmp(cp, "both", sizeof("both") - 1)) {
|
||||
statp->options &=
|
||||
~RES_NO_NIBBLE2;
|
||||
}
|
||||
}
|
||||
else {
|
||||
/* XXX - print a warning here? */
|
||||
}
|
||||
skip:
|
||||
/* skip to next run of spaces */
|
||||
while (*cp && *cp != ' ' && *cp != '\t')
|
||||
cp++;
|
||||
}
|
||||
}
|
||||
|
||||
/* XXX - should really support CIDR which means explicit masks always. */
|
||||
static u_int32_t
|
||||
net_mask(in) /* XXX - should really use system's version of this */
|
||||
struct in_addr in;
|
||||
{
|
||||
register u_int32_t i = ntohl(in.s_addr);
|
||||
|
||||
if (IN_CLASSA(i))
|
||||
return (htonl(IN_CLASSA_NET));
|
||||
else if (IN_CLASSB(i))
|
||||
return (htonl(IN_CLASSB_NET));
|
||||
return (htonl(IN_CLASSC_NET));
|
||||
}
|
||||
|
||||
#ifdef ANDROID_CHANGES
|
||||
/*
|
||||
* Based on following AOSP Bionic changesets released with Android 4.1.1 r1
|
||||
* - b23f193dcc0fa74b5be1978f85cc1c6811493c86 (bug 6535492)
|
||||
* - 1781ed7774671d5a750839650b9582ff0abbcf42
|
||||
*/
|
||||
static int
|
||||
real_randomid(u_int *random_value) {
|
||||
/* open the nonblocking random device, returning -1 on failure */
|
||||
int random_device = open("/dev/urandom", O_RDONLY | O_CLOEXEC);
|
||||
if (random_device < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* read from the random device, returning -1 on failure (or too many retries)*/
|
||||
u_int retry = 5;
|
||||
for (retry; retry > 0; retry--) {
|
||||
int retval = read(random_device, random_value, sizeof(u_int));
|
||||
if (retval == sizeof(u_int)) {
|
||||
*random_value &= 0xffff;
|
||||
close(random_device);
|
||||
return 0;
|
||||
} else if ((retval < 0) && (errno != EINTR)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
close(random_device);
|
||||
return -1;
|
||||
}
|
||||
#endif /* ANDROID_CHANGES */
|
||||
|
||||
u_int
|
||||
res_randomid(void) {
|
||||
#ifdef ANDROID_CHANGES
|
||||
int status = 0;
|
||||
u_int output = 0;
|
||||
status = real_randomid(&output);
|
||||
if (status != -1) {
|
||||
return output;
|
||||
}
|
||||
/* There was an unexpected issue with reading from /dev/urandom. */
|
||||
assert(status != -1);
|
||||
#endif /* ANDROID_CHANGES */
|
||||
struct timeval now;
|
||||
|
||||
gettimeofday(&now, NULL);
|
||||
return (0xffff & (now.tv_sec ^ now.tv_usec ^ getpid()));
|
||||
}
|
||||
|
||||
/*
|
||||
* This routine is for closing the socket if a virtual circuit is used and
|
||||
* the program wants to close it. This provides support for endhostent()
|
||||
* which expects to close the socket.
|
||||
*
|
||||
* This routine is not expected to be user visible.
|
||||
*/
|
||||
void
|
||||
res_nclose(res_state statp) {
|
||||
int ns;
|
||||
|
||||
if (statp->_vcsock >= 0) {
|
||||
(void) close(statp->_vcsock);
|
||||
statp->_vcsock = -1;
|
||||
statp->_flags &= ~(RES_F_VC | RES_F_CONN);
|
||||
}
|
||||
for (ns = 0; ns < statp->_u._ext.nscount; ns++) {
|
||||
if (statp->_u._ext.nssocks[ns] != -1) {
|
||||
(void) close(statp->_u._ext.nssocks[ns]);
|
||||
statp->_u._ext.nssocks[ns] = -1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
res_ndestroy(res_state statp) {
|
||||
res_nclose(statp);
|
||||
if (statp->_u._ext.ext != NULL)
|
||||
free(statp->_u._ext.ext);
|
||||
statp->options &= ~RES_INIT;
|
||||
statp->_u._ext.ext = NULL;
|
||||
}
|
||||
|
||||
const char *
|
||||
res_get_nibblesuffix(res_state statp) {
|
||||
if (statp->_u._ext.ext)
|
||||
return (statp->_u._ext.ext->nsuffix);
|
||||
return ("ip6.arpa");
|
||||
}
|
||||
|
||||
const char *
|
||||
res_get_nibblesuffix2(res_state statp) {
|
||||
if (statp->_u._ext.ext)
|
||||
return (statp->_u._ext.ext->nsuffix2);
|
||||
return ("ip6.int");
|
||||
}
|
||||
|
||||
void
|
||||
res_setservers(res_state statp, const union res_sockaddr_union *set, int cnt) {
|
||||
int i, nserv;
|
||||
size_t size;
|
||||
|
||||
/* close open servers */
|
||||
res_nclose(statp);
|
||||
|
||||
/* cause rtt times to be forgotten */
|
||||
statp->_u._ext.nscount = 0;
|
||||
|
||||
nserv = 0;
|
||||
for (i = 0; i < cnt && nserv < MAXNS; i++) {
|
||||
switch (set->sin.sin_family) {
|
||||
case AF_INET:
|
||||
size = sizeof(set->sin);
|
||||
if (statp->_u._ext.ext)
|
||||
memcpy(&statp->_u._ext.ext->nsaddrs[nserv],
|
||||
&set->sin, size);
|
||||
if (size <= sizeof(statp->nsaddr_list[nserv]))
|
||||
memcpy(&statp->nsaddr_list[nserv],
|
||||
&set->sin, size);
|
||||
#ifdef notdef
|
||||
else
|
||||
statp->nsaddr_list[nserv].sin_family = 0;
|
||||
#endif
|
||||
nserv++;
|
||||
break;
|
||||
|
||||
#ifdef HAS_INET6_STRUCTS
|
||||
case AF_INET6:
|
||||
size = sizeof(set->sin6);
|
||||
if (statp->_u._ext.ext)
|
||||
memcpy(&statp->_u._ext.ext->nsaddrs[nserv],
|
||||
&set->sin6, size);
|
||||
if (size <= sizeof(statp->nsaddr_list[nserv]))
|
||||
memcpy(&statp->nsaddr_list[nserv],
|
||||
&set->sin6, size);
|
||||
else
|
||||
statp->nsaddr_list[nserv].sin_family = 0;
|
||||
nserv++;
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
break;
|
||||
}
|
||||
set++;
|
||||
}
|
||||
statp->nscount = nserv;
|
||||
|
||||
}
|
||||
|
||||
int
|
||||
res_getservers(res_state statp, union res_sockaddr_union *set, int cnt) {
|
||||
int i;
|
||||
size_t size;
|
||||
u_int16_t family;
|
||||
|
||||
for (i = 0; i < statp->nscount && i < cnt; i++) {
|
||||
if (statp->_u._ext.ext)
|
||||
family = statp->_u._ext.ext->nsaddrs[i].sin.sin_family;
|
||||
else
|
||||
family = statp->nsaddr_list[i].sin_family;
|
||||
|
||||
switch (family) {
|
||||
case AF_INET:
|
||||
size = sizeof(set->sin);
|
||||
if (statp->_u._ext.ext)
|
||||
memcpy(&set->sin,
|
||||
&statp->_u._ext.ext->nsaddrs[i],
|
||||
size);
|
||||
else
|
||||
memcpy(&set->sin, &statp->nsaddr_list[i],
|
||||
size);
|
||||
break;
|
||||
|
||||
#ifdef HAS_INET6_STRUCTS
|
||||
case AF_INET6:
|
||||
size = sizeof(set->sin6);
|
||||
if (statp->_u._ext.ext)
|
||||
memcpy(&set->sin6,
|
||||
&statp->_u._ext.ext->nsaddrs[i],
|
||||
size);
|
||||
else
|
||||
memcpy(&set->sin6, &statp->nsaddr_list[i],
|
||||
size);
|
||||
break;
|
||||
#endif
|
||||
|
||||
default:
|
||||
set->sin.sin_family = 0;
|
||||
break;
|
||||
}
|
||||
set++;
|
||||
}
|
||||
return (statp->nscount);
|
||||
}
|
||||
|
||||
#ifdef ANDROID_CHANGES
|
||||
static int _get_dns_change_count()
|
||||
{
|
||||
if (dns_change_prop == NULL) {
|
||||
dns_change_prop = __system_property_find(DNS_CHANGE_PROP_NAME);
|
||||
}
|
||||
if (dns_change_prop != NULL) {
|
||||
char propvalue[PROP_VALUE_MAX];
|
||||
if (__system_property_read(dns_change_prop, NULL, propvalue) >= 1) {
|
||||
return atoi(propvalue);
|
||||
}
|
||||
}
|
||||
return -1;
|
||||
}
|
||||
|
||||
int res_get_dns_changed()
|
||||
{
|
||||
int change_count;
|
||||
|
||||
change_count = _get_dns_change_count();
|
||||
if (change_count != dns_last_change_counter) {
|
||||
if (change_count != -1) {
|
||||
dns_last_change_counter = change_count;
|
||||
}
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
#endif /* ANDROID_CHANGES */
|
|
@ -1,289 +0,0 @@
|
|||
/* $NetBSD: res_mkquery.c,v 1.6 2006/01/24 17:40:32 christos Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 2008 Android Open Source Project (query id randomization)
|
||||
* Copyright (c) 1985, 1993
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
* 3. All advertising materials mentioning features or use of this software
|
||||
* must display the following acknowledgement:
|
||||
* This product includes software developed by the University of
|
||||
* California, Berkeley and its contributors.
|
||||
* 4. Neither the name of the University 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 REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Portions Copyright (c) 1993 by Digital Equipment Corporation.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies, and that
|
||||
* the name of Digital Equipment Corporation not be used in advertising or
|
||||
* publicity pertaining to distribution of the document or software without
|
||||
* specific, written prior permission.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND DIGITAL EQUIPMENT CORP. DISCLAIMS ALL
|
||||
* WARRANTIES WITH REGARD TO THIS SOFTWARE, INCLUDING ALL IMPLIED WARRANTIES
|
||||
* OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL DIGITAL EQUIPMENT
|
||||
* CORPORATION BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL
|
||||
* DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR
|
||||
* PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS
|
||||
* ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS
|
||||
* SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Portions Copyright (c) 1996-1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#if defined(LIBC_SCCS) && !defined(lint)
|
||||
#ifdef notdef
|
||||
static const char sccsid[] = "@(#)res_mkquery.c 8.1 (Berkeley) 6/4/93";
|
||||
static const char rcsid[] = "Id: res_mkquery.c,v 1.1.2.2.4.2 2004/03/16 12:34:18 marka Exp";
|
||||
#else
|
||||
__RCSID("$NetBSD: res_mkquery.c,v 1.6 2006/01/24 17:40:32 christos Exp $");
|
||||
#endif
|
||||
#endif /* LIBC_SCCS and not lint */
|
||||
|
||||
|
||||
|
||||
#include <sys/types.h>
|
||||
#include <sys/param.h>
|
||||
#include <netinet/in.h>
|
||||
#include "arpa_nameser.h"
|
||||
#include <netdb.h>
|
||||
#ifdef ANDROID_CHANGES
|
||||
#include "resolv_private.h"
|
||||
#else
|
||||
#include <resolv.h>
|
||||
#endif
|
||||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
|
||||
/* Options. Leave them on. */
|
||||
#ifndef DEBUG
|
||||
#define DEBUG
|
||||
#endif
|
||||
|
||||
#ifndef lint
|
||||
#define UNUSED(a) (void)&a
|
||||
#else
|
||||
#define UNUSED(a) a = a
|
||||
#endif
|
||||
|
||||
extern const char *_res_opcodes[];
|
||||
|
||||
/*
|
||||
* Form all types of queries.
|
||||
* Returns the size of the result or -1.
|
||||
*/
|
||||
int
|
||||
res_nmkquery(res_state statp,
|
||||
int op, /* opcode of query */
|
||||
const char *dname, /* domain name */
|
||||
int class, int type, /* class and type of query */
|
||||
const u_char *data, /* resource record data */
|
||||
int datalen, /* length of data */
|
||||
const u_char *newrr_in, /* new rr for modify or append */
|
||||
u_char *buf, /* buffer to put query */
|
||||
int buflen) /* size of buffer */
|
||||
{
|
||||
register HEADER *hp;
|
||||
register u_char *cp, *ep;
|
||||
register int n;
|
||||
u_char *dnptrs[20], **dpp, **lastdnptr;
|
||||
|
||||
UNUSED(newrr_in);
|
||||
|
||||
#ifdef DEBUG
|
||||
if (statp->options & RES_DEBUG)
|
||||
printf(";; res_nmkquery(%s, %s, %s, %s)\n",
|
||||
_res_opcodes[op], dname, p_class(class), p_type(type));
|
||||
#endif
|
||||
/*
|
||||
* Initialize header fields.
|
||||
*/
|
||||
if ((buf == NULL) || (buflen < HFIXEDSZ))
|
||||
return (-1);
|
||||
memset(buf, 0, HFIXEDSZ);
|
||||
hp = (HEADER *)(void *)buf;
|
||||
hp->id = htons(res_randomid());
|
||||
hp->opcode = op;
|
||||
hp->rd = (statp->options & RES_RECURSE) != 0U;
|
||||
hp->rcode = NOERROR;
|
||||
cp = buf + HFIXEDSZ;
|
||||
ep = buf + buflen;
|
||||
dpp = dnptrs;
|
||||
*dpp++ = buf;
|
||||
*dpp++ = NULL;
|
||||
lastdnptr = dnptrs + sizeof dnptrs / sizeof dnptrs[0];
|
||||
/*
|
||||
* perform opcode specific processing
|
||||
*/
|
||||
switch (op) {
|
||||
case QUERY: /*FALLTHROUGH*/
|
||||
case NS_NOTIFY_OP:
|
||||
if (ep - cp < QFIXEDSZ)
|
||||
return (-1);
|
||||
if ((n = dn_comp(dname, cp, ep - cp - QFIXEDSZ, dnptrs,
|
||||
lastdnptr)) < 0)
|
||||
return (-1);
|
||||
cp += n;
|
||||
ns_put16(type, cp);
|
||||
cp += INT16SZ;
|
||||
ns_put16(class, cp);
|
||||
cp += INT16SZ;
|
||||
hp->qdcount = htons(1);
|
||||
if (op == QUERY || data == NULL)
|
||||
break;
|
||||
/*
|
||||
* Make an additional record for completion domain.
|
||||
*/
|
||||
if ((ep - cp) < RRFIXEDSZ)
|
||||
return (-1);
|
||||
n = dn_comp((const char *)data, cp, ep - cp - RRFIXEDSZ,
|
||||
dnptrs, lastdnptr);
|
||||
if (n < 0)
|
||||
return (-1);
|
||||
cp += n;
|
||||
ns_put16(T_NULL, cp);
|
||||
cp += INT16SZ;
|
||||
ns_put16(class, cp);
|
||||
cp += INT16SZ;
|
||||
ns_put32(0, cp);
|
||||
cp += INT32SZ;
|
||||
ns_put16(0, cp);
|
||||
cp += INT16SZ;
|
||||
hp->arcount = htons(1);
|
||||
break;
|
||||
|
||||
case IQUERY:
|
||||
/*
|
||||
* Initialize answer section
|
||||
*/
|
||||
if (ep - cp < 1 + RRFIXEDSZ + datalen)
|
||||
return (-1);
|
||||
*cp++ = '\0'; /* no domain name */
|
||||
ns_put16(type, cp);
|
||||
cp += INT16SZ;
|
||||
ns_put16(class, cp);
|
||||
cp += INT16SZ;
|
||||
ns_put32(0, cp);
|
||||
cp += INT32SZ;
|
||||
ns_put16(datalen, cp);
|
||||
cp += INT16SZ;
|
||||
if (datalen) {
|
||||
memcpy(cp, data, (size_t)datalen);
|
||||
cp += datalen;
|
||||
}
|
||||
hp->ancount = htons(1);
|
||||
break;
|
||||
|
||||
default:
|
||||
return (-1);
|
||||
}
|
||||
return (cp - buf);
|
||||
}
|
||||
|
||||
#ifdef RES_USE_EDNS0
|
||||
/* attach OPT pseudo-RR, as documented in RFC2671 (EDNS0). */
|
||||
#ifndef T_OPT
|
||||
#define T_OPT 41
|
||||
#endif
|
||||
|
||||
int
|
||||
res_nopt(res_state statp,
|
||||
int n0, /* current offset in buffer */
|
||||
u_char *buf, /* buffer to put query */
|
||||
int buflen, /* size of buffer */
|
||||
int anslen) /* UDP answer buffer size */
|
||||
{
|
||||
register HEADER *hp;
|
||||
register u_char *cp, *ep;
|
||||
u_int16_t flags = 0;
|
||||
|
||||
#ifdef DEBUG
|
||||
if ((statp->options & RES_DEBUG) != 0U)
|
||||
printf(";; res_nopt()\n");
|
||||
#endif
|
||||
|
||||
hp = (HEADER *)(void *)buf;
|
||||
cp = buf + n0;
|
||||
ep = buf + buflen;
|
||||
|
||||
if ((ep - cp) < 1 + RRFIXEDSZ)
|
||||
return (-1);
|
||||
|
||||
*cp++ = 0; /* "." */
|
||||
|
||||
ns_put16(T_OPT, cp); /* TYPE */
|
||||
cp += INT16SZ;
|
||||
ns_put16(anslen & 0xffff, cp); /* CLASS = UDP payload size */
|
||||
cp += INT16SZ;
|
||||
*cp++ = NOERROR; /* extended RCODE */
|
||||
*cp++ = 0; /* EDNS version */
|
||||
if (statp->options & RES_USE_DNSSEC) {
|
||||
#ifdef DEBUG
|
||||
if (statp->options & RES_DEBUG)
|
||||
printf(";; res_opt()... ENDS0 DNSSEC\n");
|
||||
#endif
|
||||
flags |= NS_OPT_DNSSEC_OK;
|
||||
}
|
||||
ns_put16(flags, cp);
|
||||
cp += INT16SZ;
|
||||
ns_put16(0, cp); /* RDLEN */
|
||||
cp += INT16SZ;
|
||||
hp->arcount = htons(ntohs(hp->arcount) + 1);
|
||||
|
||||
return (cp - buf);
|
||||
}
|
||||
#endif
|
|
@ -1,32 +0,0 @@
|
|||
/* $NetBSD: res_private.h,v 1.1.1.1 2004/05/20 17:18:54 christos Exp $ */
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef res_private_h
|
||||
#define res_private_h
|
||||
|
||||
struct __res_state_ext {
|
||||
union res_sockaddr_union nsaddrs[MAXNS];
|
||||
struct sort_list {
|
||||
int af;
|
||||
union {
|
||||
struct in_addr ina;
|
||||
struct in6_addr in6a;
|
||||
} addr, mask;
|
||||
} sort_list[MAXRESOLVSORT];
|
||||
char nsuffix[64];
|
||||
char nsuffix2[64];
|
||||
};
|
||||
|
||||
extern int
|
||||
res_ourserver_p(const res_state statp, const struct sockaddr *sa);
|
||||
|
||||
#endif
|
Разница между файлами не показана из-за своего большого размера
Загрузить разницу
|
@ -1,211 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2008 The Android Open Source Project
|
||||
* 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.
|
||||
*
|
||||
* 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 AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#define ANDROID_CHANGES 1
|
||||
#define MOZILLA_NECKO_EXCLUDE_CODE 1
|
||||
|
||||
#include <sys/cdefs.h>
|
||||
#include <sys/types.h>
|
||||
#include <arpa/inet.h>
|
||||
#include "arpa_nameser.h"
|
||||
#include <netdb.h>
|
||||
#include "resolv_private.h"
|
||||
#include "resolv_cache.h"
|
||||
#include <pthread.h>
|
||||
#include <stdlib.h>
|
||||
|
||||
#define _REALLY_INCLUDE_SYS__SYSTEM_PROPERTIES_H_
|
||||
#include <sys/_system_properties.h>
|
||||
|
||||
static pthread_key_t _res_key;
|
||||
static pthread_once_t _res_once;
|
||||
|
||||
typedef struct {
|
||||
int _h_errno;
|
||||
struct __res_state _nres[1];
|
||||
unsigned _serial;
|
||||
struct prop_info* _pi;
|
||||
struct res_static _rstatic[1];
|
||||
} _res_thread;
|
||||
|
||||
static _res_thread*
|
||||
_res_thread_alloc(void)
|
||||
{
|
||||
_res_thread* rt = malloc(sizeof(*rt));
|
||||
|
||||
if (rt) {
|
||||
rt->_h_errno = 0;
|
||||
/* Special system property which tracks any changes to 'net.*'. */
|
||||
rt->_serial = 0;
|
||||
rt->_pi = (struct prop_info*) __system_property_find("net.change");
|
||||
if (rt->_pi) {
|
||||
rt->_serial = rt->_pi->serial;
|
||||
}
|
||||
if ( res_ninit( rt->_nres ) < 0 ) {
|
||||
free(rt);
|
||||
rt = NULL;
|
||||
} else {
|
||||
memset(rt->_rstatic, 0, sizeof rt->_rstatic);
|
||||
}
|
||||
}
|
||||
return rt;
|
||||
}
|
||||
|
||||
static void
|
||||
_res_static_done( res_static rs )
|
||||
{
|
||||
/* fortunately, there is nothing to do here, since the
|
||||
* points in h_addr_ptrs and host_aliases should all
|
||||
* point to 'hostbuf'
|
||||
*/
|
||||
if (rs->hostf) { /* should not happen in theory, but just be safe */
|
||||
fclose(rs->hostf);
|
||||
rs->hostf = NULL;
|
||||
}
|
||||
free(rs->servent.s_aliases);
|
||||
}
|
||||
|
||||
static void
|
||||
_res_thread_free( void* _rt )
|
||||
{
|
||||
_res_thread* rt = _rt;
|
||||
|
||||
_res_static_done(rt->_rstatic);
|
||||
res_ndestroy(rt->_nres);
|
||||
free(rt);
|
||||
}
|
||||
|
||||
static void
|
||||
_res_init_key( void )
|
||||
{
|
||||
pthread_key_create( &_res_key, _res_thread_free );
|
||||
}
|
||||
|
||||
static _res_thread*
|
||||
_res_thread_get(void)
|
||||
{
|
||||
_res_thread* rt;
|
||||
pthread_once( &_res_once, _res_init_key );
|
||||
rt = pthread_getspecific( _res_key );
|
||||
if (rt == NULL) {
|
||||
if ((rt = _res_thread_alloc()) == NULL) {
|
||||
return NULL;
|
||||
}
|
||||
rt->_h_errno = 0;
|
||||
rt->_serial = 0;
|
||||
pthread_setspecific( _res_key, rt );
|
||||
}
|
||||
/* Check the serial value for any chanes to net.* properties. */
|
||||
if (rt->_pi == NULL) {
|
||||
rt->_pi = (struct prop_info*) __system_property_find("net.change");
|
||||
}
|
||||
if (rt->_pi == NULL || rt->_serial == rt->_pi->serial) {
|
||||
return rt;
|
||||
}
|
||||
rt->_serial = rt->_pi->serial;
|
||||
/* Reload from system properties. */
|
||||
if ( res_ninit( rt->_nres ) < 0 ) {
|
||||
free(rt);
|
||||
rt = NULL;
|
||||
pthread_setspecific( _res_key, rt );
|
||||
}
|
||||
#ifdef USE_RESOLV_CACHE
|
||||
_resolv_cache_reset(rt->_serial);
|
||||
#endif
|
||||
return rt;
|
||||
}
|
||||
|
||||
struct __res_state _nres;
|
||||
|
||||
#if 0
|
||||
struct resolv_cache*
|
||||
__get_res_cache(void)
|
||||
{
|
||||
_res_thread* rt = _res_thread_get();
|
||||
|
||||
if (!rt)
|
||||
return NULL;
|
||||
|
||||
if (!rt->_cache) {
|
||||
rt->_cache = _resolv_cache_create();
|
||||
}
|
||||
return rt->_cache;
|
||||
}
|
||||
#endif
|
||||
|
||||
int*
|
||||
__get_h_errno(void)
|
||||
{
|
||||
_res_thread* rt = _res_thread_get();
|
||||
static int panic = NETDB_INTERNAL;
|
||||
|
||||
return rt ? &rt->_h_errno : &panic;
|
||||
}
|
||||
|
||||
res_state
|
||||
__res_get_state(void)
|
||||
{
|
||||
_res_thread* rt = _res_thread_get();
|
||||
|
||||
return rt ? rt->_nres : NULL;
|
||||
}
|
||||
|
||||
void
|
||||
__res_put_state(res_state res)
|
||||
{
|
||||
/* nothing to do */
|
||||
res=res;
|
||||
}
|
||||
|
||||
res_static
|
||||
__res_get_static(void)
|
||||
{
|
||||
_res_thread* rt = _res_thread_get();
|
||||
|
||||
return rt ? rt->_rstatic : NULL;
|
||||
}
|
|
@ -1,77 +0,0 @@
|
|||
/*
|
||||
* Copyright (C) 2008 The Android Open Source Project
|
||||
* 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.
|
||||
*
|
||||
* 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 AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _RESOLV_CACHE_H_
|
||||
#define _RESOLV_CACHE_H_
|
||||
|
||||
struct resolv_cache; /* forward */
|
||||
|
||||
/* get cache instance, can be NULL if cache is disabled
|
||||
* (e.g. through an environment variable) */
|
||||
extern struct resolv_cache* __get_res_cache(void);
|
||||
|
||||
/* this gets called everytime we detect some changes in the DNS configuration
|
||||
* and will flush the cache */
|
||||
extern void _resolv_cache_reset( unsigned generation );
|
||||
|
||||
typedef enum {
|
||||
RESOLV_CACHE_UNSUPPORTED, /* the cache can't handle that kind of queries */
|
||||
/* or the answer buffer is too small */
|
||||
RESOLV_CACHE_NOTFOUND, /* the cache doesn't know about this query */
|
||||
RESOLV_CACHE_FOUND /* the cache found the answer */
|
||||
} ResolvCacheStatus;
|
||||
|
||||
extern ResolvCacheStatus
|
||||
_resolv_cache_lookup( struct resolv_cache* cache,
|
||||
const void* query,
|
||||
int querylen,
|
||||
void* answer,
|
||||
int answersize,
|
||||
int *answerlen );
|
||||
|
||||
/* add a (query,answer) to the cache, only call if _resolv_cache_lookup
|
||||
* did return RESOLV_CACHE_NOTFOUND
|
||||
*/
|
||||
extern void
|
||||
_resolv_cache_add( struct resolv_cache* cache,
|
||||
const void* query,
|
||||
int querylen,
|
||||
const void* answer,
|
||||
int answerlen );
|
||||
|
||||
#endif /* _RESOLV_CACHE_H_ */
|
|
@ -1,509 +0,0 @@
|
|||
/* $NetBSD: resolv.h,v 1.31 2005/12/26 19:01:47 perry Exp $ */
|
||||
|
||||
/*
|
||||
* Copyright (c) 1983, 1987, 1989
|
||||
* The Regents of the University of California. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. 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.
|
||||
* 3. Neither the name of the University 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 REGENTS AND CONTRIBUTORS ``AS IS'' AND
|
||||
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS 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.
|
||||
*/
|
||||
|
||||
/*
|
||||
* Copyright (c) 2004 by Internet Systems Consortium, Inc. ("ISC")
|
||||
* Portions Copyright (c) 1996-1999 by Internet Software Consortium.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this software for any
|
||||
* purpose with or without fee is hereby granted, provided that the above
|
||||
* copyright notice and this permission notice appear in all copies.
|
||||
*
|
||||
* THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES
|
||||
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR
|
||||
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT
|
||||
* OF OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
*/
|
||||
|
||||
/*
|
||||
* @(#)resolv.h 8.1 (Berkeley) 6/2/93
|
||||
* Id: resolv.h,v 1.7.2.11.4.2 2004/06/25 00:41:05 marka Exp
|
||||
*/
|
||||
|
||||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _RESOLV_PRIVATE_H_
|
||||
#define _RESOLV_PRIVATE_H_
|
||||
|
||||
#include <resolv.h>
|
||||
#include "resolv_static.h"
|
||||
|
||||
/*
|
||||
* Revision information. This is the release date in YYYYMMDD format.
|
||||
* It can change every day so the right thing to do with it is use it
|
||||
* in preprocessor commands such as "#if (__RES > 19931104)". Do not
|
||||
* compare for equality; rather, use it to determine whether your resolver
|
||||
* is new enough to contain a certain feature.
|
||||
*/
|
||||
|
||||
#define __RES 20030124
|
||||
|
||||
/*
|
||||
* This used to be defined in res_query.c, now it's in herror.c.
|
||||
* [XXX no it's not. It's in irs/irs_data.c]
|
||||
* It was
|
||||
* never extern'd by any *.h file before it was placed here. For thread
|
||||
* aware programs, the last h_errno value set is stored in res->h_errno.
|
||||
*
|
||||
* XXX: There doesn't seem to be a good reason for exposing RES_SET_H_ERRNO
|
||||
* (and __h_errno_set) to the public via <resolv.h>.
|
||||
* XXX: __h_errno_set is really part of IRS, not part of the resolver.
|
||||
* If somebody wants to build and use a resolver that doesn't use IRS,
|
||||
* what do they do? Perhaps something like
|
||||
* #ifdef WANT_IRS
|
||||
* # define RES_SET_H_ERRNO(r,x) __h_errno_set(r,x)
|
||||
* #else
|
||||
* # define RES_SET_H_ERRNO(r,x) (h_errno = (r)->res_h_errno = (x))
|
||||
* #endif
|
||||
*/
|
||||
|
||||
#define RES_SET_H_ERRNO(r,x) (h_errno = (r)->res_h_errno = (x))
|
||||
struct __res_state; /* forward */
|
||||
|
||||
/*
|
||||
* Resolver configuration file.
|
||||
* Normally not present, but may contain the address of the
|
||||
* initial name server(s) to query and the domain search list.
|
||||
*/
|
||||
|
||||
#ifndef _PATH_RESCONF
|
||||
#ifdef ANDROID_CHANGES
|
||||
#define _PATH_RESCONF "/etc/ppp/resolv.conf"
|
||||
#else
|
||||
#define _PATH_RESCONF "/etc/resolv.conf"
|
||||
#endif
|
||||
#endif
|
||||
|
||||
typedef enum { res_goahead, res_nextns, res_modified, res_done, res_error }
|
||||
res_sendhookact;
|
||||
|
||||
typedef res_sendhookact (*res_send_qhook)(struct sockaddr * const *,
|
||||
const u_char **, int *,
|
||||
u_char *, int, int *);
|
||||
|
||||
typedef res_sendhookact (*res_send_rhook)(const struct sockaddr *,
|
||||
const u_char *, int, u_char *,
|
||||
int, int *);
|
||||
|
||||
struct res_sym {
|
||||
int number; /* Identifying number, like T_MX */
|
||||
const char * name; /* Its symbolic name, like "MX" */
|
||||
const char * humanname; /* Its fun name, like "mail exchanger" */
|
||||
};
|
||||
|
||||
/*
|
||||
* Global defines and variables for resolver stub.
|
||||
*/
|
||||
#define MAXNS 3 /* max # name servers we'll track */
|
||||
#define MAXDFLSRCH 3 /* # default domain levels to try */
|
||||
#define MAXDNSRCH 6 /* max # domains in search path */
|
||||
#define LOCALDOMAINPARTS 2 /* min levels in name that is "local" */
|
||||
|
||||
#define RES_TIMEOUT 5 /* min. seconds between retries */
|
||||
#define MAXRESOLVSORT 10 /* number of net to sort on */
|
||||
#define RES_MAXNDOTS 15 /* should reflect bit field size */
|
||||
#define RES_MAXRETRANS 30 /* only for resolv.conf/RES_OPTIONS */
|
||||
#define RES_MAXRETRY 5 /* only for resolv.conf/RES_OPTIONS */
|
||||
#define RES_DFLRETRY 2 /* Default #/tries. */
|
||||
#define RES_MAXTIME 65535 /* Infinity, in milliseconds. */
|
||||
|
||||
struct __res_state_ext;
|
||||
|
||||
struct __res_state {
|
||||
int retrans; /* retransmission time interval */
|
||||
int retry; /* number of times to retransmit */
|
||||
#ifdef sun
|
||||
u_int options; /* option flags - see below. */
|
||||
#else
|
||||
u_long options; /* option flags - see below. */
|
||||
#endif
|
||||
int nscount; /* number of name servers */
|
||||
struct sockaddr_in
|
||||
nsaddr_list[MAXNS]; /* address of name server */
|
||||
#define nsaddr nsaddr_list[0] /* for backward compatibility */
|
||||
u_short id; /* current message id */
|
||||
char *dnsrch[MAXDNSRCH+1]; /* components of domain to search */
|
||||
char defdname[256]; /* default domain (deprecated) */
|
||||
#ifdef sun
|
||||
u_int pfcode; /* RES_PRF_ flags - see below. */
|
||||
#else
|
||||
u_long pfcode; /* RES_PRF_ flags - see below. */
|
||||
#endif
|
||||
unsigned ndots:4; /* threshold for initial abs. query */
|
||||
unsigned nsort:4; /* number of elements in sort_list[] */
|
||||
char unused[3];
|
||||
struct {
|
||||
struct in_addr addr;
|
||||
uint32_t mask;
|
||||
} sort_list[MAXRESOLVSORT];
|
||||
#ifdef __OLD_RES_STATE
|
||||
char lookups[4];
|
||||
#else
|
||||
res_send_qhook qhook; /* query hook */
|
||||
res_send_rhook rhook; /* response hook */
|
||||
int res_h_errno; /* last one set for this context */
|
||||
int _vcsock; /* PRIVATE: for res_send VC i/o */
|
||||
u_int _flags; /* PRIVATE: see below */
|
||||
u_int _pad; /* make _u 64 bit aligned */
|
||||
union {
|
||||
/* On an 32-bit arch this means 512b total. */
|
||||
char pad[72 - 4*sizeof (int) - 2*sizeof (void *)];
|
||||
struct {
|
||||
uint16_t nscount;
|
||||
uint16_t nstimes[MAXNS]; /* ms. */
|
||||
int nssocks[MAXNS];
|
||||
struct __res_state_ext *ext; /* extention for IPv6 */
|
||||
} _ext;
|
||||
} _u;
|
||||
#endif
|
||||
struct res_static rstatic[1];
|
||||
};
|
||||
|
||||
typedef struct __res_state *res_state;
|
||||
|
||||
union res_sockaddr_union {
|
||||
struct sockaddr_in sin;
|
||||
#ifdef IN6ADDR_ANY_INIT
|
||||
struct sockaddr_in6 sin6;
|
||||
#endif
|
||||
#ifdef ISC_ALIGN64
|
||||
int64_t __align64; /* 64bit alignment */
|
||||
#else
|
||||
int32_t __align32; /* 32bit alignment */
|
||||
#endif
|
||||
char __space[128]; /* max size */
|
||||
};
|
||||
|
||||
/*
|
||||
* Resolver flags (used to be discrete per-module statics ints).
|
||||
*/
|
||||
#define RES_F_VC 0x00000001 /* socket is TCP */
|
||||
#define RES_F_CONN 0x00000002 /* socket is connected */
|
||||
#define RES_F_EDNS0ERR 0x00000004 /* EDNS0 caused errors */
|
||||
#define RES_F__UNUSED 0x00000008 /* (unused) */
|
||||
#define RES_F_LASTMASK 0x000000F0 /* ordinal server of last res_nsend */
|
||||
#define RES_F_LASTSHIFT 4 /* bit position of LASTMASK "flag" */
|
||||
#define RES_GETLAST(res) (((res)._flags & RES_F_LASTMASK) >> RES_F_LASTSHIFT)
|
||||
|
||||
/* res_findzonecut2() options */
|
||||
#define RES_EXHAUSTIVE 0x00000001 /* always do all queries */
|
||||
#define RES_IPV4ONLY 0x00000002 /* IPv4 only */
|
||||
#define RES_IPV6ONLY 0x00000004 /* IPv6 only */
|
||||
|
||||
/*
|
||||
* Resolver options (keep these in synch with res_debug.c, please)
|
||||
*/
|
||||
#define RES_INIT 0x00000001 /* address initialized */
|
||||
#define RES_DEBUG 0x00000002 /* print debug messages */
|
||||
#define RES_AAONLY 0x00000004 /* authoritative answers only (!IMPL)*/
|
||||
#define RES_USEVC 0x00000008 /* use virtual circuit */
|
||||
#define RES_PRIMARY 0x00000010 /* query primary server only (!IMPL) */
|
||||
#define RES_IGNTC 0x00000020 /* ignore trucation errors */
|
||||
#define RES_RECURSE 0x00000040 /* recursion desired */
|
||||
#define RES_DEFNAMES 0x00000080 /* use default domain name */
|
||||
#define RES_STAYOPEN 0x00000100 /* Keep TCP socket open */
|
||||
#define RES_DNSRCH 0x00000200 /* search up local domain tree */
|
||||
#define RES_INSECURE1 0x00000400 /* type 1 security disabled */
|
||||
#define RES_INSECURE2 0x00000800 /* type 2 security disabled */
|
||||
#define RES_NOALIASES 0x00001000 /* shuts off HOSTALIASES feature */
|
||||
#define RES_USE_INET6 0x00002000 /* use/map IPv6 in gethostbyname() */
|
||||
#define RES_ROTATE 0x00004000 /* rotate ns list after each query */
|
||||
#define RES_NOCHECKNAME 0x00008000 /* do not check names for sanity. */
|
||||
#define RES_KEEPTSIG 0x00010000 /* do not strip TSIG records */
|
||||
#define RES_BLAST 0x00020000 /* blast all recursive servers */
|
||||
#define RES_NOTLDQUERY 0x00100000 /* don't unqualified name as a tld */
|
||||
#define RES_USE_DNSSEC 0x00200000 /* use DNSSEC using OK bit in OPT */
|
||||
/* #define RES_DEBUG2 0x00400000 */ /* nslookup internal */
|
||||
/* KAME extensions: use higher bit to avoid conflict with ISC use */
|
||||
#define RES_USE_DNAME 0x10000000 /* use DNAME */
|
||||
#define RES_USE_EDNS0 0x40000000 /* use EDNS0 if configured */
|
||||
#define RES_NO_NIBBLE2 0x80000000 /* disable alternate nibble lookup */
|
||||
|
||||
#define RES_DEFAULT (RES_RECURSE | RES_DEFNAMES | \
|
||||
RES_DNSRCH | RES_NO_NIBBLE2)
|
||||
|
||||
/*
|
||||
* Resolver "pfcode" values. Used by dig.
|
||||
*/
|
||||
#define RES_PRF_STATS 0x00000001
|
||||
#define RES_PRF_UPDATE 0x00000002
|
||||
#define RES_PRF_CLASS 0x00000004
|
||||
#define RES_PRF_CMD 0x00000008
|
||||
#define RES_PRF_QUES 0x00000010
|
||||
#define RES_PRF_ANS 0x00000020
|
||||
#define RES_PRF_AUTH 0x00000040
|
||||
#define RES_PRF_ADD 0x00000080
|
||||
#define RES_PRF_HEAD1 0x00000100
|
||||
#define RES_PRF_HEAD2 0x00000200
|
||||
#define RES_PRF_TTLID 0x00000400
|
||||
#define RES_PRF_HEADX 0x00000800
|
||||
#define RES_PRF_QUERY 0x00001000
|
||||
#define RES_PRF_REPLY 0x00002000
|
||||
#define RES_PRF_INIT 0x00004000
|
||||
#define RES_PRF_TRUNC 0x00008000
|
||||
/* 0x00010000 */
|
||||
|
||||
/* Things involving an internal (static) resolver context. */
|
||||
__BEGIN_DECLS
|
||||
extern struct __res_state *__res_get_state(void);
|
||||
extern void __res_put_state(struct __res_state *);
|
||||
|
||||
#ifndef ANDROID_CHANGES
|
||||
/*
|
||||
* Source and Binary compatibility; _res will not work properly
|
||||
* with multi-threaded programs.
|
||||
*/
|
||||
extern struct __res_state *__res_state(void);
|
||||
#define _res (*__res_state())
|
||||
#endif
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#ifndef __BIND_NOSTATIC
|
||||
#define fp_nquery __fp_nquery
|
||||
#define fp_query __fp_query
|
||||
#define hostalias __hostalias
|
||||
#define p_query __p_query
|
||||
#define res_close __res_close
|
||||
#define res_opt __res_opt
|
||||
#define res_isourserver __res_isourserver
|
||||
#define res_querydomain __res_querydomain
|
||||
#define res_send __res_send
|
||||
#define res_sendsigned __res_sendsigned
|
||||
|
||||
#ifdef BIND_RES_POSIX3
|
||||
#define dn_expand __dn_expand
|
||||
#define res_init __res_init
|
||||
#define res_query __res_query
|
||||
#define res_search __res_search
|
||||
#define res_mkquery __res_mkquery
|
||||
#endif
|
||||
|
||||
__BEGIN_DECLS
|
||||
void fp_nquery(const u_char *, int, FILE *);
|
||||
void fp_query(const u_char *, FILE *);
|
||||
const char * hostalias(const char *);
|
||||
void p_query(const u_char *);
|
||||
void res_close(void);
|
||||
int res_init(void);
|
||||
int res_opt(int, u_char *, int, int);
|
||||
int res_isourserver(const struct sockaddr_in *);
|
||||
int res_mkquery(int, const char *, int, int, const u_char *, int, const u_char *, u_char *, int);
|
||||
int res_query(const char *, int, int, u_char *, int);
|
||||
int res_querydomain(const char *, const char *, int, int, u_char *, int);
|
||||
int res_search(const char *, int, int, u_char *, int);
|
||||
int res_send(const u_char *, int, u_char *, int);
|
||||
int res_sendsigned(const u_char *, int, ns_tsig_key *, u_char *, int);
|
||||
__END_DECLS
|
||||
#endif
|
||||
|
||||
#if !defined(SHARED_LIBBIND) || defined(LIB)
|
||||
/*
|
||||
* If libbind is a shared object (well, DLL anyway)
|
||||
* these externs break the linker when resolv.h is
|
||||
* included by a lib client (like named)
|
||||
* Make them go away if a client is including this
|
||||
*
|
||||
*/
|
||||
extern const struct res_sym __p_key_syms[];
|
||||
extern const struct res_sym __p_cert_syms[];
|
||||
extern const struct res_sym __p_class_syms[];
|
||||
extern const struct res_sym __p_type_syms[];
|
||||
extern const struct res_sym __p_rcode_syms[];
|
||||
#endif /* SHARED_LIBBIND */
|
||||
|
||||
#ifndef ADNROID_CHANGES
|
||||
#define b64_ntop __b64_ntop
|
||||
#define b64_pton __b64_pton
|
||||
#endif
|
||||
|
||||
#define dn_comp __dn_comp
|
||||
#define dn_count_labels __dn_count_labels
|
||||
#define dn_skipname __dn_skipname
|
||||
#define fp_resstat __fp_resstat
|
||||
#define loc_aton __loc_aton
|
||||
#define loc_ntoa __loc_ntoa
|
||||
#define p_cdname __p_cdname
|
||||
#define p_cdnname __p_cdnname
|
||||
#define p_class __p_class
|
||||
#define p_fqname __p_fqname
|
||||
#define p_fqnname __p_fqnname
|
||||
#define p_option __p_option
|
||||
#define p_secstodate __p_secstodate
|
||||
#define p_section __p_section
|
||||
#define p_time __p_time
|
||||
#define p_type __p_type
|
||||
#define p_rcode __p_rcode
|
||||
#define p_sockun __p_sockun
|
||||
#define putlong __putlong
|
||||
#define putshort __putshort
|
||||
#define res_dnok __res_dnok
|
||||
#define res_findzonecut __res_findzonecut
|
||||
#define res_findzonecut2 __res_findzonecut2
|
||||
#define res_hnok __res_hnok
|
||||
#define res_hostalias __res_hostalias
|
||||
#define res_mailok __res_mailok
|
||||
#define res_nameinquery __res_nameinquery
|
||||
#define res_nclose __res_nclose
|
||||
#define res_ninit __res_ninit
|
||||
#define res_nmkquery __res_nmkquery
|
||||
#define res_pquery __res_pquery
|
||||
#define res_nquery __res_nquery
|
||||
#define res_nquerydomain __res_nquerydomain
|
||||
#define res_nsearch __res_nsearch
|
||||
#define res_nsend __res_nsend
|
||||
#define res_nsendsigned __res_nsendsigned
|
||||
#define res_nisourserver __res_nisourserver
|
||||
#define res_ownok __res_ownok
|
||||
#define res_queriesmatch __res_queriesmatch
|
||||
#define res_randomid __res_randomid
|
||||
#define sym_ntop __sym_ntop
|
||||
#define sym_ntos __sym_ntos
|
||||
#define sym_ston __sym_ston
|
||||
#define res_nopt __res_nopt
|
||||
#define res_ndestroy __res_ndestroy
|
||||
#define res_nametoclass __res_nametoclass
|
||||
#define res_nametotype __res_nametotype
|
||||
#define res_setservers __res_setservers
|
||||
#define res_getservers __res_getservers
|
||||
#define res_buildprotolist __res_buildprotolist
|
||||
#define res_destroyprotolist __res_destroyprotolist
|
||||
#define res_destroyservicelist __res_destroyservicelist
|
||||
#define res_get_nibblesuffix __res_get_nibblesuffix
|
||||
#define res_get_nibblesuffix2 __res_get_nibblesuffix2
|
||||
#define res_ourserver_p __res_ourserver_p
|
||||
#define res_protocolname __res_protocolname
|
||||
#define res_protocolnumber __res_protocolnumber
|
||||
#define res_send_setqhook __res_send_setqhook
|
||||
#define res_send_setrhook __res_send_setrhook
|
||||
#define res_servicename __res_servicename
|
||||
#define res_servicenumber __res_servicenumber
|
||||
__BEGIN_DECLS
|
||||
int res_hnok(const char *);
|
||||
int res_ownok(const char *);
|
||||
int res_mailok(const char *);
|
||||
int res_dnok(const char *);
|
||||
int sym_ston(const struct res_sym *, const char *, int *);
|
||||
const char * sym_ntos(const struct res_sym *, int, int *);
|
||||
const char * sym_ntop(const struct res_sym *, int, int *);
|
||||
#ifndef ANDROID_CHANGES
|
||||
int b64_ntop(u_char const *, size_t, char *, size_t);
|
||||
int b64_pton(char const *, u_char *, size_t);
|
||||
#endif
|
||||
int loc_aton(const char *, u_char *);
|
||||
const char * loc_ntoa(const u_char *, char *);
|
||||
int dn_skipname(const u_char *, const u_char *);
|
||||
void putlong(uint32_t, u_char *);
|
||||
void putshort(uint16_t, u_char *);
|
||||
#ifndef __ultrix__
|
||||
uint16_t _getshort(const u_char *);
|
||||
uint32_t _getlong(const u_char *);
|
||||
#endif
|
||||
const char * p_class(int);
|
||||
const char * p_time(uint32_t);
|
||||
const char * p_type(int);
|
||||
const char * p_rcode(int);
|
||||
const char * p_sockun(union res_sockaddr_union, char *, size_t);
|
||||
const u_char * p_cdnname(const u_char *, const u_char *, int, FILE *);
|
||||
const u_char * p_cdname(const u_char *, const u_char *, FILE *);
|
||||
const u_char * p_fqnname(const u_char *, const u_char *,
|
||||
int, char *, int);
|
||||
const u_char * p_fqname(const u_char *, const u_char *, FILE *);
|
||||
const char * p_option(u_long);
|
||||
char * p_secstodate(u_long);
|
||||
int dn_count_labels(const char *);
|
||||
int dn_comp(const char *, u_char *, int, u_char **, u_char **);
|
||||
int dn_expand(const u_char *, const u_char *, const u_char *,
|
||||
char *, int);
|
||||
u_int res_randomid(void);
|
||||
int res_nameinquery(const char *, int, int, const u_char *,
|
||||
const u_char *);
|
||||
int res_queriesmatch(const u_char *, const u_char *,
|
||||
const u_char *, const u_char *);
|
||||
const char * p_section(int, int);
|
||||
/* Things involving a resolver context. */
|
||||
int res_ninit(res_state);
|
||||
int res_nisourserver(const res_state, const struct sockaddr_in *);
|
||||
void fp_resstat(const res_state, FILE *);
|
||||
void res_pquery(const res_state, const u_char *, int, FILE *);
|
||||
const char * res_hostalias(const res_state, const char *, char *, size_t);
|
||||
int res_nquery(res_state, const char *, int, int, u_char *, int);
|
||||
int res_nsearch(res_state, const char *, int, int, u_char *, int);
|
||||
int res_nquerydomain(res_state, const char *, const char *,
|
||||
int, int, u_char *, int);
|
||||
int res_nmkquery(res_state, int, const char *, int, int,
|
||||
const u_char *, int, const u_char *,
|
||||
u_char *, int);
|
||||
int res_nsend(res_state, const u_char *, int, u_char *, int);
|
||||
int res_nsendsigned(res_state, const u_char *, int,
|
||||
ns_tsig_key *, u_char *, int);
|
||||
int res_findzonecut(res_state, const char *, ns_class, int,
|
||||
char *, size_t, struct in_addr *, int);
|
||||
int res_findzonecut2(res_state, const char *, ns_class, int,
|
||||
char *, size_t,
|
||||
union res_sockaddr_union *, int);
|
||||
void res_nclose(res_state);
|
||||
int res_nopt(res_state, int, u_char *, int, int);
|
||||
void res_send_setqhook(res_send_qhook);
|
||||
void res_send_setrhook(res_send_rhook);
|
||||
int __res_vinit(res_state, int);
|
||||
void res_destroyservicelist(void);
|
||||
const char * res_servicename(uint16_t, const char *);
|
||||
const char * res_protocolname(int);
|
||||
void res_destroyprotolist(void);
|
||||
void res_buildprotolist(void);
|
||||
const char * res_get_nibblesuffix(res_state);
|
||||
const char * res_get_nibblesuffix2(res_state);
|
||||
void res_ndestroy(res_state);
|
||||
uint16_t res_nametoclass(const char *, int *);
|
||||
uint16_t res_nametotype(const char *, int *);
|
||||
void res_setservers(res_state,
|
||||
const union res_sockaddr_union *, int);
|
||||
int res_getservers(res_state,
|
||||
union res_sockaddr_union *, int);
|
||||
|
||||
int res_get_dns_changed();
|
||||
u_int res_randomid(void);
|
||||
|
||||
__END_DECLS
|
||||
|
||||
#endif /* !_RESOLV_PRIVATE_H_ */
|
|
@ -1,42 +0,0 @@
|
|||
/*
|
||||
* This version of this file is derived from Android 2.3 "Gingerbread",
|
||||
* which contains uncredited changes by Android/Google developers. It has
|
||||
* been modified in 2011 for use in the Android build of Mozilla Firefox by
|
||||
* Mozilla contributors (including Michael Edwards <m.k.edwards@gmail.com>,
|
||||
* and Steve Workman <sjhworkman@gmail.com>).
|
||||
* These changes are offered under the same license as the original NetBSD
|
||||
* file, whose copyright and license are unchanged above.
|
||||
*/
|
||||
|
||||
#ifndef _RESOLV_STATIC_H
|
||||
#define _RESOLV_STATIC_H
|
||||
|
||||
#include <netdb.h>
|
||||
|
||||
/* this structure contains all the variables that were declared
|
||||
* 'static' in the original NetBSD resolver code.
|
||||
*
|
||||
* this caused vast amounts of crashes and memory corruptions
|
||||
* when the resolver was being used by multiple threads.
|
||||
*
|
||||
* (note: the OpenBSD/FreeBSD resolver has similar 'issues')
|
||||
*/
|
||||
|
||||
#define MAXALIASES 35
|
||||
#define MAXADDRS 35
|
||||
|
||||
typedef struct res_static {
|
||||
char* h_addr_ptrs[MAXADDRS + 1];
|
||||
char* host_aliases[MAXALIASES];
|
||||
char hostbuf[8*1024];
|
||||
u_int32_t host_addr[16 / sizeof(u_int32_t)]; /* IPv4 or IPv6 */
|
||||
FILE* hostf;
|
||||
int stayopen;
|
||||
const char* servent_ptr;
|
||||
struct servent servent;
|
||||
struct hostent host;
|
||||
} *res_static;
|
||||
|
||||
extern res_static __res_get_static(void);
|
||||
|
||||
#endif /* _RESOLV_STATIC_H */
|
|
@ -55,11 +55,15 @@ def android_version_code_v1(buildid, cpu_arch=None, min_sdk=0, max_sdk=0):
|
|||
|
||||
The bit labelled 'p' is a placeholder that is always 0 (for now).
|
||||
|
||||
The bit labelled 'g' is 1 if the build is an ARM build targeting API 15+
|
||||
and 0 otherwise, which means the build targets Android API 9-10 (Gingerbread).
|
||||
Firefox no longer supports API 14 or earlier.
|
||||
|
||||
Fennec no longer supports Android API 8 or earlier. After Bug 1155801 it
|
||||
no longer supports API 11-14. API 9 is still supported due to significant usage.
|
||||
This version code computation allows for a split on API levels that allowed
|
||||
us to ship builds specifically for Gingerbread (API 9-10); we preserve
|
||||
that functionality for sanity's sake, and to allow us to reintroduce a
|
||||
split in the future.
|
||||
|
||||
At present, the bit labelled 'g' is 1 if the build is an ARM build
|
||||
targeting API 15+, which will always be the case.
|
||||
|
||||
We throw an explanatory exception when we are within one calendar year of
|
||||
running out of build events. This gives lots of time to update the version
|
||||
|
|
|
@ -23,10 +23,8 @@ class TestAndroidVersionCode(unittest.TestCase):
|
|||
|
||||
def test_android_version_code_v1(self):
|
||||
buildid = '20150825141628'
|
||||
arm_api9 = 0b01111000001000000001001001110000
|
||||
arm_api15 = 0b01111000001000000001001001110001
|
||||
x86_api9 = 0b01111000001000000001001001110100
|
||||
self.assertEqual(android_version_code_v1(buildid, cpu_arch='armeabi', min_sdk=9, max_sdk=None), arm_api9)
|
||||
self.assertEqual(android_version_code_v1(buildid, cpu_arch='armeabi-v7a', min_sdk=15, max_sdk=None), arm_api15)
|
||||
self.assertEqual(android_version_code_v1(buildid, cpu_arch='x86', min_sdk=9, max_sdk=None), x86_api9)
|
||||
|
||||
|
|
|
@ -47,7 +47,10 @@ this.BrowserTestUtils = {
|
|||
* Loads a page in a new tab, executes a Task and closes the tab.
|
||||
*
|
||||
* @param options
|
||||
* An object with the following properties:
|
||||
* An object or string.
|
||||
* If this is a string it is the url to open and will be opened in the
|
||||
* currently active browser window.
|
||||
* If an object it should have the following properties:
|
||||
* {
|
||||
* gBrowser:
|
||||
* Reference to the "tabbrowser" element where the new tab should
|
||||
|
@ -65,6 +68,12 @@ this.BrowserTestUtils = {
|
|||
* @rejects Any exception from taskFn is propagated.
|
||||
*/
|
||||
withNewTab: Task.async(function* (options, taskFn) {
|
||||
if (typeof(options) == "string") {
|
||||
options = {
|
||||
gBrowser: Services.wm.getMostRecentWindow("navigator:browser").gBrowser,
|
||||
url: options
|
||||
}
|
||||
}
|
||||
let tab = yield BrowserTestUtils.openNewForegroundTab(options.gBrowser, options.url);
|
||||
let result = yield taskFn(tab.linkedBrowser);
|
||||
options.gBrowser.removeTab(tab);
|
||||
|
|
|
@ -576,8 +576,6 @@ class AndroidEmulator(object):
|
|||
if self.substs:
|
||||
if not self.substs['TARGET_CPU'].startswith('arm'):
|
||||
return 'x86'
|
||||
if self.substs['MOZ_ANDROID_MIN_SDK_VERSION'] == '9':
|
||||
return '2.3'
|
||||
return '4.3'
|
||||
|
||||
def _find_sdk_exe(substs, exe, tools):
|
||||
|
|
|
@ -215,6 +215,16 @@ const DownloadMap = {
|
|||
this.byDownload.set(download, item);
|
||||
return item;
|
||||
},
|
||||
|
||||
erase(item) {
|
||||
// This will need to get more complicated for bug 1255507 but for now we
|
||||
// only work with downloads in the DownloadList from getAll()
|
||||
return this.getDownloadList().then(list => {
|
||||
list.remove(item.download);
|
||||
this.byId.delete(item.id);
|
||||
this.byDownload.delete(item.download);
|
||||
});
|
||||
},
|
||||
};
|
||||
|
||||
// Create a callable function that filters a DownloadItem based on a
|
||||
|
@ -331,6 +341,59 @@ function downloadQuery(query) {
|
|||
};
|
||||
}
|
||||
|
||||
function queryHelper(query) {
|
||||
let matchFn;
|
||||
try {
|
||||
matchFn = downloadQuery(query);
|
||||
} catch (err) {
|
||||
return Promise.reject({message: err.message});
|
||||
}
|
||||
|
||||
let compareFn;
|
||||
if (query.orderBy != null) {
|
||||
const fields = query.orderBy.map(field => field[0] == "-"
|
||||
? {reverse: true, name: field.slice(1)}
|
||||
: {reverse: false, name: field});
|
||||
|
||||
for (let field of fields) {
|
||||
if (!DOWNLOAD_ITEM_FIELDS.includes(field.name)) {
|
||||
return Promise.reject({message: `Invalid orderBy field ${field.name}`});
|
||||
}
|
||||
}
|
||||
|
||||
compareFn = (dl1, dl2) => {
|
||||
for (let field of fields) {
|
||||
const val1 = dl1[field.name];
|
||||
const val2 = dl2[field.name];
|
||||
|
||||
if (val1 < val2) {
|
||||
return field.reverse ? 1 : -1;
|
||||
} else if (val1 > val2) {
|
||||
return field.reverse ? -1 : 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
return DownloadMap.getAll().then(downloads => {
|
||||
if (compareFn) {
|
||||
downloads = Array.from(downloads);
|
||||
downloads.sort(compareFn);
|
||||
}
|
||||
let results = [];
|
||||
for (let download of downloads) {
|
||||
if (query.limit && results.length >= query.limit) {
|
||||
break;
|
||||
}
|
||||
if (matchFn(download)) {
|
||||
results.push(download);
|
||||
}
|
||||
}
|
||||
return results;
|
||||
});
|
||||
}
|
||||
|
||||
extensions.registerSchemaAPI("downloads", "downloads", (extension, context) => {
|
||||
return {
|
||||
downloads: {
|
||||
|
@ -412,56 +475,8 @@ extensions.registerSchemaAPI("downloads", "downloads", (extension, context) => {
|
|||
},
|
||||
|
||||
search(query) {
|
||||
let matchFn;
|
||||
try {
|
||||
matchFn = downloadQuery(query);
|
||||
} catch (err) {
|
||||
return Promise.reject({message: err.message});
|
||||
}
|
||||
|
||||
let compareFn;
|
||||
if (query.orderBy != null) {
|
||||
const fields = query.orderBy.map(field => field[0] == "-"
|
||||
? {reverse: true, name: field.slice(1)}
|
||||
: {reverse: false, name: field});
|
||||
|
||||
for (let field of fields) {
|
||||
if (!DOWNLOAD_ITEM_FIELDS.includes(field.name)) {
|
||||
return Promise.reject({message: `Invalid orderBy field ${field.name}`});
|
||||
}
|
||||
}
|
||||
|
||||
compareFn = (dl1, dl2) => {
|
||||
for (let field of fields) {
|
||||
const val1 = dl1[field.name];
|
||||
const val2 = dl2[field.name];
|
||||
|
||||
if (val1 < val2) {
|
||||
return field.reverse ? 1 : -1;
|
||||
} else if (val1 > val2) {
|
||||
return field.reverse ? -1 : 1;
|
||||
}
|
||||
}
|
||||
return 0;
|
||||
};
|
||||
}
|
||||
|
||||
return DownloadMap.getAll().then(downloads => {
|
||||
if (compareFn) {
|
||||
downloads = Array.from(downloads);
|
||||
downloads.sort(compareFn);
|
||||
}
|
||||
let results = [];
|
||||
for (let download of downloads) {
|
||||
if (query.limit && results.length >= query.limit) {
|
||||
break;
|
||||
}
|
||||
if (matchFn(download)) {
|
||||
results.push(download.serialize());
|
||||
}
|
||||
}
|
||||
return results;
|
||||
});
|
||||
return queryHelper(query)
|
||||
.then(items => items.map(item => item.serialize()));
|
||||
},
|
||||
|
||||
pause(id) {
|
||||
|
@ -516,6 +531,18 @@ extensions.registerSchemaAPI("downloads", "downloads", (extension, context) => {
|
|||
}).catch(Cu.reportError);
|
||||
},
|
||||
|
||||
erase(query) {
|
||||
return queryHelper(query).then(items => {
|
||||
let results = [];
|
||||
let promises = [];
|
||||
for (let item of items) {
|
||||
promises.push(DownloadMap.erase(item));
|
||||
results.push(item.id);
|
||||
}
|
||||
return Promise.all(promises).then(() => results);
|
||||
});
|
||||
},
|
||||
|
||||
// When we do open(), check for additional downloads.open permission.
|
||||
// i.e.:
|
||||
// open(downloadId) {
|
||||
|
|
|
@ -221,6 +221,136 @@
|
|||
"$ref": "extensionTypes.Date"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "DownloadQuery",
|
||||
"description": "Parameters that combine to specify a predicate that can be used to select a set of downloads. Used for example in search() and erase()",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"query": {
|
||||
"description": "This array of search terms limits results to <a href='#type-DownloadItem'>DownloadItems</a> whose <code>filename</code> or <code>url</code> contain all of the search terms that do not begin with a dash '-' and none of the search terms that do begin with a dash.",
|
||||
"optional": true,
|
||||
"type": "array",
|
||||
"items": { "type": "string" }
|
||||
},
|
||||
"startedBefore": {
|
||||
"description": "Limits results to downloads that started before the given ms since the epoch.",
|
||||
"optional": true,
|
||||
"$ref": "DownloadTime"
|
||||
},
|
||||
"startedAfter": {
|
||||
"description": "Limits results to downloads that started after the given ms since the epoch.",
|
||||
"optional": true,
|
||||
"$ref": "DownloadTime"
|
||||
},
|
||||
"endedBefore": {
|
||||
"description": "Limits results to downloads that ended before the given ms since the epoch.",
|
||||
"optional": true,
|
||||
"$ref": "DownloadTime"
|
||||
},
|
||||
"endedAfter": {
|
||||
"description": "Limits results to downloads that ended after the given ms since the epoch.",
|
||||
"optional": true,
|
||||
"$ref": "DownloadTime"
|
||||
},
|
||||
"totalBytesGreater": {
|
||||
"description": "Limits results to downloads whose totalBytes is greater than the given integer.",
|
||||
"optional": true,
|
||||
"type": "number"
|
||||
},
|
||||
"totalBytesLess": {
|
||||
"description": "Limits results to downloads whose totalBytes is less than the given integer.",
|
||||
"optional": true,
|
||||
"type": "number"
|
||||
},
|
||||
"filenameRegex": {
|
||||
"description": "Limits results to <a href='#type-DownloadItem'>DownloadItems</a> whose <code>filename</code> matches the given regular expression.",
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"urlRegex": {
|
||||
"description": "Limits results to <a href='#type-DownloadItem'>DownloadItems</a> whose <code>url</code> matches the given regular expression.",
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"limit": {
|
||||
"description": "Setting this integer limits the number of results. Otherwise, all matching <a href='#type-DownloadItem'>DownloadItems</a> will be returned.",
|
||||
"optional": true,
|
||||
"type": "integer"
|
||||
},
|
||||
"orderBy": {
|
||||
"description": "Setting elements of this array to <a href='#type-DownloadItem'>DownloadItem</a> properties in order to sort the search results. For example, setting <code>orderBy='startTime'</code> sorts the <a href='#type-DownloadItem'>DownloadItems</a> by their start time in ascending order. To specify descending order, prefix <code>orderBy</code> with a hyphen: '-startTime'.",
|
||||
"optional": true,
|
||||
"type": "array",
|
||||
"items": { "type": "string" }
|
||||
},
|
||||
"id": {
|
||||
"type": "integer",
|
||||
"optional": true
|
||||
},
|
||||
"url": {
|
||||
"description": "Absolute URL.",
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"filename": {
|
||||
"description": "Absolute local path.",
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"danger": {
|
||||
"$ref": "DangerType",
|
||||
"description": "Indication of whether this download is thought to be safe or known to be suspicious.",
|
||||
"optional": true
|
||||
},
|
||||
"mime": {
|
||||
"description": "The file's MIME type.",
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"startTime": {
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"endTime": {
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"state": {
|
||||
"$ref": "State",
|
||||
"description": "Indicates whether the download is progressing, interrupted, or complete.",
|
||||
"optional": true
|
||||
},
|
||||
"paused": {
|
||||
"description": "True if the download has stopped reading data from the host, but kept the connection open.",
|
||||
"optional": true,
|
||||
"type": "boolean"
|
||||
},
|
||||
"error": {
|
||||
"description": "Why a download was interrupted.",
|
||||
"optional": true,
|
||||
"$ref": "InterruptReason"
|
||||
},
|
||||
"bytesReceived": {
|
||||
"description": "Number of bytes received so far from the host, without considering file compression.",
|
||||
"optional": true,
|
||||
"type": "number"
|
||||
},
|
||||
"totalBytes": {
|
||||
"description": "Number of bytes in the whole file, without considering file compression, or -1 if unknown.",
|
||||
"optional": true,
|
||||
"type": "number"
|
||||
},
|
||||
"fileSize": {
|
||||
"description": "Number of bytes in the whole file post-decompression, or -1 if unknown.",
|
||||
"optional": true,
|
||||
"type": "number"
|
||||
},
|
||||
"exists": {
|
||||
"type": "boolean",
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
}
|
||||
],
|
||||
"functions": [
|
||||
|
@ -313,132 +443,7 @@
|
|||
"parameters": [
|
||||
{
|
||||
"name": "query",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"query": {
|
||||
"description": "This array of search terms limits results to <a href='#type-DownloadItem'>DownloadItems</a> whose <code>filename</code> or <code>url</code> contain all of the search terms that do not begin with a dash '-' and none of the search terms that do begin with a dash.",
|
||||
"optional": true,
|
||||
"type": "array",
|
||||
"items": { "type": "string" }
|
||||
},
|
||||
"startedBefore": {
|
||||
"description": "Limits results to downloads that started before the given ms since the epoch.",
|
||||
"optional": true,
|
||||
"$ref": "DownloadTime"
|
||||
},
|
||||
"startedAfter": {
|
||||
"description": "Limits results to downloads that started after the given ms since the epoch.",
|
||||
"optional": true,
|
||||
"$ref": "DownloadTime"
|
||||
},
|
||||
"endedBefore": {
|
||||
"description": "Limits results to downloads that ended before the given ms since the epoch.",
|
||||
"optional": true,
|
||||
"$ref": "DownloadTime"
|
||||
},
|
||||
"endedAfter": {
|
||||
"description": "Limits results to downloads that ended after the given ms since the epoch.",
|
||||
"optional": true,
|
||||
"$ref": "DownloadTime"
|
||||
},
|
||||
"totalBytesGreater": {
|
||||
"description": "Limits results to downloads whose totalBytes is greater than the given integer.",
|
||||
"optional": true,
|
||||
"type": "number"
|
||||
},
|
||||
"totalBytesLess": {
|
||||
"description": "Limits results to downloads whose totalBytes is less than the given integer.",
|
||||
"optional": true,
|
||||
"type": "number"
|
||||
},
|
||||
"filenameRegex": {
|
||||
"description": "Limits results to <a href='#type-DownloadItem'>DownloadItems</a> whose <code>filename</code> matches the given regular expression.",
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"urlRegex": {
|
||||
"description": "Limits results to <a href='#type-DownloadItem'>DownloadItems</a> whose <code>url</code> matches the given regular expression.",
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"limit": {
|
||||
"description": "Setting this integer limits the number of results. Otherwise, all matching <a href='#type-DownloadItem'>DownloadItems</a> will be returned.",
|
||||
"optional": true,
|
||||
"type": "integer"
|
||||
},
|
||||
"orderBy": {
|
||||
"description": "Setting elements of this array to <a href='#type-DownloadItem'>DownloadItem</a> properties in order to sort the search results. For example, setting <code>orderBy='startTime'</code> sorts the <a href='#type-DownloadItem'>DownloadItems</a> by their start time in ascending order. To specify descending order, prefix <code>orderBy</code> with a hyphen: '-startTime'.",
|
||||
"optional": true,
|
||||
"type": "array",
|
||||
"items": { "type": "string" }
|
||||
},
|
||||
"id": {
|
||||
"type": "integer",
|
||||
"optional": true
|
||||
},
|
||||
"url": {
|
||||
"description": "Absolute URL.",
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"filename": {
|
||||
"description": "Absolute local path.",
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"danger": {
|
||||
"$ref": "DangerType",
|
||||
"description": "Indication of whether this download is thought to be safe or known to be suspicious.",
|
||||
"optional": true
|
||||
},
|
||||
"mime": {
|
||||
"description": "The file's MIME type.",
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"startTime": {
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"endTime": {
|
||||
"optional": true,
|
||||
"type": "string"
|
||||
},
|
||||
"state": {
|
||||
"$ref": "State",
|
||||
"description": "Indicates whether the download is progressing, interrupted, or complete.",
|
||||
"optional": true
|
||||
},
|
||||
"paused": {
|
||||
"description": "True if the download has stopped reading data from the host, but kept the connection open.",
|
||||
"optional": true,
|
||||
"type": "boolean"
|
||||
},
|
||||
"error": {
|
||||
"description": "Why a download was interrupted.",
|
||||
"optional": true,
|
||||
"$ref": "InterruptReason"
|
||||
},
|
||||
"bytesReceived": {
|
||||
"description": "Number of bytes received so far from the host, without considering file compression.",
|
||||
"optional": true,
|
||||
"type": "number"
|
||||
},
|
||||
"totalBytes": {
|
||||
"description": "Number of bytes in the whole file, without considering file compression, or -1 if unknown.",
|
||||
"optional": true,
|
||||
"type": "number"
|
||||
},
|
||||
"fileSize": {
|
||||
"description": "Number of bytes in the whole file post-decompression, or -1 if unknown.",
|
||||
"optional": true,
|
||||
"type": "number"
|
||||
},
|
||||
"exists": {
|
||||
"type": "boolean",
|
||||
"optional": true
|
||||
}
|
||||
}
|
||||
"$ref": "DownloadQuery"
|
||||
},
|
||||
{
|
||||
"name": "callback",
|
||||
|
@ -580,18 +585,12 @@
|
|||
{
|
||||
"name": "erase",
|
||||
"type": "function",
|
||||
"unsupported": true,
|
||||
"async": "callback",
|
||||
"description": "Erase matching <a href='#type-DownloadItem'>DownloadItems</a> from history",
|
||||
"parameters": [
|
||||
{
|
||||
"name": "query",
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"TODO": {
|
||||
"type": "string",
|
||||
"description": "complete me..."
|
||||
}
|
||||
}
|
||||
"$ref": "DownloadQuery"
|
||||
},
|
||||
{
|
||||
"name": "callback",
|
||||
|
|
|
@ -90,8 +90,13 @@
|
|||
{
|
||||
"type": "object",
|
||||
"properties": {
|
||||
"page": { "$ref": "ExtensionURL" }
|
||||
}
|
||||
"page": { "$ref": "ExtensionURL" },
|
||||
"persistent": {
|
||||
"optional": true,
|
||||
"$ref": "PersistentBackgroundProperty"
|
||||
}
|
||||
},
|
||||
"additionalProperties": { "$ref": "UnrecognizedProperty" }
|
||||
},
|
||||
{
|
||||
"type": "object",
|
||||
|
@ -99,8 +104,13 @@
|
|||
"scripts": {
|
||||
"type": "array",
|
||||
"items": { "$ref": "ExtensionURL" }
|
||||
},
|
||||
"persistent": {
|
||||
"optional": true,
|
||||
"$ref": "PersistentBackgroundProperty"
|
||||
}
|
||||
}
|
||||
},
|
||||
"additionalProperties": { "$ref": "UnrecognizedProperty" }
|
||||
}
|
||||
],
|
||||
"optional": true
|
||||
|
@ -160,10 +170,7 @@
|
|||
}
|
||||
},
|
||||
|
||||
"additionalProperties": {
|
||||
"type": "any",
|
||||
"deprecated": "An unexpected property was found in the WebExtension manifest"
|
||||
}
|
||||
"additionalProperties": { "$ref": "UnrecognizedProperty" }
|
||||
},
|
||||
{
|
||||
"id": "Permission",
|
||||
|
@ -219,6 +226,7 @@
|
|||
"id": "ContentScript",
|
||||
"type": "object",
|
||||
"description": "Details of the script or CSS to inject. Either the code or the file property must be set, but both may not be set at the same time. Based on InjectDetails, but using underscore rather than camel case naming conventions.",
|
||||
"additionalProperties": { "$ref": "UnrecognizedProperty" },
|
||||
"properties": {
|
||||
"matches": {
|
||||
"type": "array",
|
||||
|
@ -294,6 +302,16 @@
|
|||
"isInstanceOf": "ImageData"
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
"id": "UnrecognizedProperty",
|
||||
"type": "any",
|
||||
"deprecated": "An unexpected property was found in the WebExtension manifest."
|
||||
},
|
||||
{
|
||||
"id": "PersistentBackgroundProperty",
|
||||
"type": "boolean",
|
||||
"deprecated": "Event pages are not currently supported. This will run as a persistent background page."
|
||||
}
|
||||
]
|
||||
}
|
||||
|
|
|
@ -4,7 +4,10 @@ support-files =
|
|||
file_download.html
|
||||
file_download.txt
|
||||
interruptible.sjs
|
||||
file_sample.html
|
||||
|
||||
[test_chrome_ext_downloads_download.html]
|
||||
[test_chrome_ext_downloads_misc.html]
|
||||
[test_chrome_ext_downloads_search.html]
|
||||
[test_chrome_ext_eventpage_warning.html]
|
||||
[test_chrome_ext_contentscript_unrecognizedprop_warning.html]
|
||||
|
|
|
@ -0,0 +1,80 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test for content script unrecognized property on manifest</title>
|
||||
<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script src="chrome://mochikit/content/tests/SimpleTest/SpawnTask.js"></script>
|
||||
<script src="chrome://mochikit/content/tests/SimpleTest/ExtensionTestUtils.js"></script>
|
||||
<script type="text/javascript" src="head.js"></script>
|
||||
<link rel="stylesheet" href="chrome://mochikit/contents/tests/SimpleTest/test.css"/>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<script type="text/javascript">
|
||||
"use strict";
|
||||
|
||||
const BASE = "http://mochi.test:8888/chrome/toolkit/components/extensions/test/mochitest";
|
||||
|
||||
add_task(function* test_contentscript() {
|
||||
function backgroundScript() {
|
||||
browser.runtime.onMessage.addListener((msg) => {
|
||||
if (msg == "loaded") {
|
||||
browser.tabs.query({active: true, currentWindow: true}).then((tabs) => {
|
||||
// NOTE: we're removing the tab from here because doing a win.close()
|
||||
// from the chrome test code is raising a "TypeError: can 't access
|
||||
// dead object" exception.
|
||||
browser.tabs.remove(tabs[0].id);
|
||||
|
||||
browser.test.notifyPass("content-script-loaded");
|
||||
});
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
function contentScript() {
|
||||
chrome.runtime.sendMessage("loaded");
|
||||
}
|
||||
|
||||
let extensionData = {
|
||||
manifest: {
|
||||
content_scripts: [
|
||||
{
|
||||
"matches": ["http://mochi.test/*/file_sample.html"],
|
||||
"js": ["content_script.js"],
|
||||
"run_at": "document_idle",
|
||||
"unrecognized_property": "with-a-random-value",
|
||||
},
|
||||
],
|
||||
},
|
||||
background: "(" + backgroundScript.toString() + ")()",
|
||||
|
||||
files: {
|
||||
"content_script.js": "(" + contentScript.toString() + ")()",
|
||||
},
|
||||
};
|
||||
|
||||
let extension = ExtensionTestUtils.loadExtension(extensionData);
|
||||
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
let waitForConsole = new Promise(resolve => {
|
||||
SimpleTest.monitorConsole(resolve, [{
|
||||
message: /Reading manifest: Error processing content_scripts.*.unrecognized_property: An unexpected property was found/,
|
||||
}]);
|
||||
});
|
||||
|
||||
yield extension.startup();
|
||||
|
||||
window.open(`${BASE}/file_sample.html`);
|
||||
|
||||
yield Promise.all([extension.awaitFinish("content-script-loaded")]);
|
||||
info("test page loaded");
|
||||
|
||||
yield extension.unload();
|
||||
|
||||
SimpleTest.endMonitorConsole();
|
||||
yield waitForConsole;
|
||||
});
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -465,6 +465,45 @@ add_task(function* test_pausecancel() {
|
|||
is(msg.result[0].exists, false, "download.exists is correct");
|
||||
});
|
||||
|
||||
// Test erase(). We don't do elaborate testing of the query handling
|
||||
// since it uses the exact same engine as search() which is tested
|
||||
// more thoroughly in test_chrome_ext_downloads_search.html
|
||||
add_task(function* test_erase() {
|
||||
yield clearDownloads();
|
||||
|
||||
let ids = {};
|
||||
let msg = yield runInExtension("download", {url: TXT_URL});
|
||||
is(msg.status, "success", "download succeeded");
|
||||
ids.dl1 = msg.result;
|
||||
|
||||
msg = yield runInExtension("download", {url: TXT_URL});
|
||||
is(msg.status, "success", "download succeeded");
|
||||
ids.dl2 = msg.result;
|
||||
|
||||
msg = yield runInExtension("download", {url: TXT_URL});
|
||||
is(msg.status, "success", "download succeeded");
|
||||
ids.dl3 = msg.result;
|
||||
|
||||
msg = yield runInExtension("search", {});
|
||||
is(msg.status, "success", "search succeded");
|
||||
is(msg.result.length, 3, "search found 3 downloads");
|
||||
|
||||
msg = yield runInExtension("erase", {id: ids.dl1});
|
||||
if (msg.errmsg) { info(msg.errmsg); }
|
||||
is(msg.status, "success", "erase by id succeeded");
|
||||
|
||||
msg = yield runInExtension("search", {});
|
||||
is(msg.status, "success", "search succeded");
|
||||
is(msg.result.length, 2, "search found 2 downloads");
|
||||
|
||||
msg = yield runInExtension("erase", {});
|
||||
is(msg.status, "success", "erase everything succeeded");
|
||||
|
||||
msg = yield runInExtension("search", {});
|
||||
is(msg.status, "success", "search succeded");
|
||||
is(msg.result.length, 0, "search found 0 downloads");
|
||||
});
|
||||
|
||||
add_task(function* cleanup() {
|
||||
yield extension.unload();
|
||||
});
|
||||
|
|
|
@ -0,0 +1,105 @@
|
|||
<!DOCTYPE HTML>
|
||||
<html>
|
||||
<head>
|
||||
<title>Test for WebExtension EventPage Warning</title>
|
||||
<script src="chrome://mochikit/content/tests/SimpleTest/SimpleTest.js"></script>
|
||||
<script src="chrome://mochikit/content/tests/SimpleTest/SpawnTask.js"></script>
|
||||
<script src="chrome://mochikit/content/tests/SimpleTest/ExtensionTestUtils.js"></script>
|
||||
<script type="text/javascript" src="head.js"></script>
|
||||
<link rel="stylesheet" href="chrome://mochikit/contents/tests/SimpleTest/test.css"/>
|
||||
</head>
|
||||
<body>
|
||||
|
||||
<script type="text/javascript">
|
||||
"use strict";
|
||||
|
||||
function createEventPageExtension(eventPage) {
|
||||
function eventPageScript() {
|
||||
browser.test.log("running event page as background script");
|
||||
browser.test.sendMessage("running", 1);
|
||||
}
|
||||
|
||||
return ExtensionTestUtils.loadExtension({
|
||||
manifest: {
|
||||
"background": eventPage,
|
||||
},
|
||||
files: {
|
||||
"event-page-script.js": `(${eventPageScript})()`,
|
||||
"event-page.html": `<html><head>
|
||||
<meta charset="utf-8">
|
||||
<script src="event-page-script.js"></${"script"}>
|
||||
</head></html>`,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
add_task(function* test_eventpages() {
|
||||
// Used in other tests to prevent the monitorConsole to grip.
|
||||
SimpleTest.waitForExplicitFinish();
|
||||
|
||||
let testCases = [
|
||||
{
|
||||
message: "testing event page running as a background page",
|
||||
eventPage: {
|
||||
"page": "event-page.html",
|
||||
"persistent": false,
|
||||
},
|
||||
},
|
||||
{
|
||||
message: "testing event page scripts running as a background page",
|
||||
eventPage: {
|
||||
"scripts": ["event-page-script.js"],
|
||||
"persistent": false,
|
||||
},
|
||||
},
|
||||
];
|
||||
|
||||
for (let {message, eventPage} of testCases) {
|
||||
info(message);
|
||||
|
||||
// Wait for the expected logged warnings from the manifest validation.
|
||||
let waitForConsole = new Promise(resolve => {
|
||||
SimpleTest.monitorConsole(resolve, [{message: /Event pages are not currently supported./}]);
|
||||
});
|
||||
|
||||
let extension = createEventPageExtension(eventPage);
|
||||
|
||||
info("load complete");
|
||||
let [, x] = yield Promise.all([extension.startup(), extension.awaitMessage("running")]);
|
||||
is(x, 1, "got correct value from extension");
|
||||
info("test complete");
|
||||
yield extension.unload();
|
||||
info("extension unloaded successfully");
|
||||
|
||||
SimpleTest.endMonitorConsole();
|
||||
yield waitForConsole;
|
||||
|
||||
waitForConsole = new Promise(resolve => {
|
||||
SimpleTest.monitorConsole(resolve, [{
|
||||
message: /Reading manifest: Error processing background.nonExistentProp: An unexpected property was found/,
|
||||
}]);
|
||||
});
|
||||
|
||||
info("testing additional unrecognized properties on background page");
|
||||
|
||||
extension = createEventPageExtension({
|
||||
"scripts": ["event-page-script.js"],
|
||||
"nonExistentProp": true,
|
||||
});
|
||||
|
||||
info("load complete");
|
||||
[, x] = yield Promise.all([extension.startup(), extension.awaitMessage("running")]);
|
||||
is(x, 1, "got correct value from extension");
|
||||
info("test complete");
|
||||
yield extension.unload();
|
||||
info("extension unloaded successfully");
|
||||
|
||||
SimpleTest.endMonitorConsole();
|
||||
yield waitForConsole;
|
||||
}
|
||||
});
|
||||
|
||||
</script>
|
||||
|
||||
</body>
|
||||
</html>
|
|
@ -18,7 +18,6 @@ skip-if = e10s # Bug 1064580
|
|||
skip-if = e10s
|
||||
[browser_findbar.js]
|
||||
[browser_input_file_tooltips.js]
|
||||
skip-if = e10s # Bug 1236991 - Update or remove tests that use fillInPageTooltip
|
||||
[browser_isSynthetic.js]
|
||||
support-files =
|
||||
empty.png
|
||||
|
|
|
@ -1,29 +1,53 @@
|
|||
function test()
|
||||
{
|
||||
let data = [
|
||||
{ value: "/tmp", result: "tmp" },
|
||||
{ title: "foo", result: "foo" },
|
||||
{ result: "No file selected." },
|
||||
{ multiple: true, result: "No files selected." },
|
||||
{ required: true, result: "Please select a file." }
|
||||
];
|
||||
|
||||
let doc = gBrowser.contentDocument;
|
||||
let tooltip = document.getElementById("aHTMLTooltip");
|
||||
let tempFile;
|
||||
add_task(function* setup() {
|
||||
yield new Promise(resolve => {
|
||||
SpecialPowers.pushPrefEnv({"set": [["ui.tooltipDelay", 0]]}, resolve);
|
||||
});
|
||||
tempFile = createTempFile();
|
||||
registerCleanupFunction(function() {
|
||||
tempFile.remove(true);
|
||||
});
|
||||
});
|
||||
|
||||
for (let test of data) {
|
||||
let input = doc.createElement('input');
|
||||
add_task(function* test_singlefile_selected() {
|
||||
yield do_test({value: true, result: "testfile_bug1251809"});
|
||||
});
|
||||
|
||||
add_task(function* test_title_set() {
|
||||
yield do_test({title: "foo", result: "foo"});
|
||||
});
|
||||
|
||||
add_task(function* test_nofile_selected() {
|
||||
yield do_test({result: "No file selected."});
|
||||
});
|
||||
|
||||
add_task(function* test_multipleset_nofile_selected() {
|
||||
yield do_test({multiple: true, result: "No files selected."});
|
||||
});
|
||||
|
||||
add_task(function* test_requiredset() {
|
||||
yield do_test({required: true, result: "Please select a file."});
|
||||
});
|
||||
|
||||
function* do_test(test) {
|
||||
info(`starting test ${JSON.stringify(test)}`);
|
||||
|
||||
let tab = yield BrowserTestUtils.openNewForegroundTab(gBrowser);
|
||||
|
||||
yield new Promise(resolve => {
|
||||
EventUtils.synthesizeNativeMouseMove(tab.linkedBrowser, 300, 300, resolve);
|
||||
});
|
||||
|
||||
ContentTask.spawn(tab.linkedBrowser, test, function*(test) {
|
||||
let doc = content.document;
|
||||
let input = doc.createElement("input");
|
||||
doc.body.appendChild(input);
|
||||
input.type = 'file';
|
||||
input.id = "test_input";
|
||||
input.setAttribute("style", "position: absolute; top: 0; left: 0;");
|
||||
input.type = "file";
|
||||
if (test.title) {
|
||||
input.setAttribute('title', test.title);
|
||||
}
|
||||
if (test.value) {
|
||||
if (test.value == "/tmp" && navigator.platform.indexOf('Win') != -1) {
|
||||
test.value = "C:\\Temp";
|
||||
test.result = "Temp";
|
||||
}
|
||||
input.value = test.value;
|
||||
input.setAttribute("title", test.title);
|
||||
}
|
||||
if (test.multiple) {
|
||||
input.multiple = true;
|
||||
|
@ -31,8 +55,57 @@ function test()
|
|||
if (test.required) {
|
||||
input.required = true;
|
||||
}
|
||||
});
|
||||
|
||||
ok(tooltip.fillInPageTooltip(input));
|
||||
is(tooltip.getAttribute('label'), test.result);
|
||||
if (test.value) {
|
||||
let MockFilePicker = SpecialPowers.MockFilePicker;
|
||||
MockFilePicker.init(window);
|
||||
MockFilePicker.returnValue = MockFilePicker.returnOK;
|
||||
MockFilePicker.displayDirectory = FileUtils.getDir("TmpD", [], false);
|
||||
MockFilePicker.returnFiles = [tempFile];
|
||||
|
||||
try {
|
||||
// Open the File Picker dialog (MockFilePicker) to select
|
||||
// the files for the test.
|
||||
yield BrowserTestUtils.synthesizeMouseAtCenter("#test_input", {}, tab.linkedBrowser);
|
||||
yield ContentTask.spawn(tab.linkedBrowser, {}, function*() {
|
||||
let input = content.document.querySelector("#test_input");
|
||||
yield ContentTaskUtils.waitForCondition(() => input.files.length,
|
||||
"The input should have at least one file selected");
|
||||
info(`The input has ${input.files.length} file(s) selected.`);
|
||||
});
|
||||
} finally {
|
||||
MockFilePicker.cleanup();
|
||||
}
|
||||
}
|
||||
|
||||
let awaitTooltipOpen = new Promise(resolve => {
|
||||
let tooltipId = Services.appinfo.browserTabsRemoteAutostart ?
|
||||
"remoteBrowserTooltip" :
|
||||
"aHTMLTooltip";
|
||||
let tooltip = document.getElementById(tooltipId);
|
||||
tooltip.addEventListener("popupshown", function onpopupshown(event) {
|
||||
tooltip.removeEventListener("popupshown", onpopupshown);
|
||||
resolve(event.target);
|
||||
});
|
||||
});
|
||||
yield new Promise(resolve => {
|
||||
EventUtils.synthesizeNativeMouseMove(tab.linkedBrowser, 100, 5, resolve);
|
||||
});
|
||||
yield new Promise(resolve => setTimeout(resolve, 100));
|
||||
yield new Promise(resolve => {
|
||||
EventUtils.synthesizeNativeMouseMove(tab.linkedBrowser, 110, 15, resolve);
|
||||
});
|
||||
let tooltip = yield awaitTooltipOpen;
|
||||
|
||||
is(tooltip.getAttribute("label"), test.result, "tooltip label should match expectation");
|
||||
|
||||
yield BrowserTestUtils.removeTab(tab);
|
||||
}
|
||||
|
||||
function createTempFile() {
|
||||
let file = FileUtils.getDir("TmpD", [], false);
|
||||
file.append("testfile_bug1251809");
|
||||
file.create(Ci.nsIFile.NORMAL_FILE_TYPE, 0o644);
|
||||
return file;
|
||||
}
|
||||
|
|
|
@ -538,8 +538,9 @@
|
|||
<parameter name="tipElement"/>
|
||||
<body>
|
||||
<![CDATA[
|
||||
// Don't show the tooltip if the tooltip node is a document or disconnected.
|
||||
// Don't show the tooltip if the tooltip node is a document, browser, or disconnected.
|
||||
if (!tipElement || !tipElement.ownerDocument ||
|
||||
tipElement.localName == "browser" ||
|
||||
(tipElement.ownerDocument.compareDocumentPosition(tipElement) & document.DOCUMENT_POSITION_DISCONNECTED)) {
|
||||
return false;
|
||||
}
|
||||
|
|
|
@ -384,7 +384,7 @@ PopupNotifications.prototype = {
|
|||
let notifications = this._getNotificationsForBrowser(browser);
|
||||
notifications.push(notification);
|
||||
|
||||
let isActiveBrowser = this._isActiveBrowser(browser);
|
||||
let isActiveBrowser = browser.docShellIsActive;
|
||||
let fm = Cc["@mozilla.org/focus-manager;1"].getService(Ci.nsIFocusManager);
|
||||
let isActiveWindow = fm.activeWindow == this.window;
|
||||
|
||||
|
@ -460,7 +460,7 @@ PopupNotifications.prototype = {
|
|||
|
||||
this._setNotificationsForBrowser(aBrowser, notifications);
|
||||
|
||||
if (this._isActiveBrowser(aBrowser)) {
|
||||
if (aBrowser.docShellIsActive) {
|
||||
// get the anchor element if the browser has defined one so it will
|
||||
// _update will handle both the tabs iconBox and non-tab permission
|
||||
// anchors.
|
||||
|
@ -477,7 +477,7 @@ PopupNotifications.prototype = {
|
|||
remove: function PopupNotifications_remove(notification) {
|
||||
this._remove(notification);
|
||||
|
||||
if (this._isActiveBrowser(notification.browser)) {
|
||||
if (notification.browser.docShellIsActive) {
|
||||
let notifications = this._getNotificationsForBrowser(notification.browser);
|
||||
this._update(notifications);
|
||||
}
|
||||
|
@ -535,7 +535,7 @@ PopupNotifications.prototype = {
|
|||
if (index == -1)
|
||||
return;
|
||||
|
||||
if (this._isActiveBrowser(notification.browser))
|
||||
if (notification.browser.docShellIsActive)
|
||||
notification.anchorElement.removeAttribute(ICON_ATTRIBUTE_SHOWING);
|
||||
|
||||
// remove the notification
|
||||
|
@ -941,14 +941,6 @@ PopupNotifications.prototype = {
|
|||
return anchors;
|
||||
},
|
||||
|
||||
_isActiveBrowser: function (browser) {
|
||||
// Note: This helper only exists, because in e10s builds,
|
||||
// we can't access the docShell of a browser from chrome.
|
||||
return browser.docShell
|
||||
? browser.docShell.isActive
|
||||
: (this.window.gBrowser.selectedBrowser == browser);
|
||||
},
|
||||
|
||||
_onIconBoxCommand: function PopupNotifications_onIconBoxCommand(event) {
|
||||
// Left click, space or enter only
|
||||
let type = event.type;
|
||||
|
|
|
@ -0,0 +1,82 @@
|
|||
/* Any copyright is dedicated to the Public Domain.
|
||||
* http://creativecommons.org/publicdomain/zero/1.0/
|
||||
*/
|
||||
|
||||
// We require signature checks for this test
|
||||
Services.prefs.setBoolPref(PREF_XPI_SIGNATURES_REQUIRED, true);
|
||||
gUseRealCertChecks = true;
|
||||
|
||||
const CERT = `MIIDITCCAgmgAwIBAgIJALAv8fydd6nBMA0GCSqGSIb3DQEBBQUAMCcxJTAjBgNV
|
||||
BAMMHGJvb3RzdHJhcDFAdGVzdHMubW96aWxsYS5vcmcwHhcNMTYwMjAyMjMxNjUy
|
||||
WhcNMjYwMTMwMjMxNjUyWjAnMSUwIwYDVQQDDBxib290c3RyYXAxQHRlc3RzLm1v
|
||||
emlsbGEub3JnMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA5caNuLTu
|
||||
H8dEqNntLlhKi4y09hrgcF3cb6n5Xx9DIHA8CKiZxt9qGXKeeiDwEiiQ8ibJYzdc
|
||||
jLkbzJUyPVUaH9ygrWynSpSTOvv/Ys3+ERrCo9W7Zuzwdmzt6TTEjFMS4lVx06us
|
||||
3uUqkdp3JMgCqCEbOFZiztICiSKrp8QFJkAfApZzBqmJOPOWH0yZ2CRRzvbQZ6af
|
||||
hqQDUalJQjWfsenyUWphhbREqExetxHJFR3OrmJt/shXVyz6dD7TBuE3PPUh1RpE
|
||||
3ejVufcTzjV3XmK79PxsKLM9V2+ww9e9V3OET57kyvn+bpSWdUYm3X4DA8dxNW6+
|
||||
kTFWRnQNZ+zQVQIDAQABo1AwTjAdBgNVHQ4EFgQUac36ccv+99N5HxYa8dCDYRaF
|
||||
HNQwHwYDVR0jBBgwFoAUac36ccv+99N5HxYa8dCDYRaFHNQwDAYDVR0TBAUwAwEB
|
||||
/zANBgkqhkiG9w0BAQUFAAOCAQEAFfu3MN8EtY5wcxOFdGShOmGQPm2MJJVE6MG+
|
||||
p4RqHrukHZSgKOyWjkRk7t6NXzNcnHco9HFv7FQRAXSJ5zObmyu+TMZlu4jHHCav
|
||||
GMcV3C/4SUGtlipZbgNe00UAIm6tM3Wh8dr38W7VYg4KGAwXou5XhQ9gCAnSn90o
|
||||
H/42NqHTjJsR4v18izX2aO25ARQdMby7Lsr5j9RqweHywiSlPusFcKRseqOnIP0d
|
||||
JT3+qh78LeMbNBO2mYD3SP/zu0TAmkAVNcj2KPw0+a0kVZ15rvslPC/K3xn9msMk
|
||||
fQthv3rDAcsWvi9YO7T+vylgZBgJfn1ZqpQqy58xN96uh6nPOw==`;
|
||||
|
||||
function overrideCertDB() {
|
||||
// Unregister the real database.
|
||||
let registrar = Components.manager.QueryInterface(AM_Ci.nsIComponentRegistrar);
|
||||
let factory = registrar.getClassObject(CERTDB_CID, AM_Ci.nsIFactory);
|
||||
registrar.unregisterFactory(CERTDB_CID, factory);
|
||||
|
||||
// Get the real DB
|
||||
let realCertDB = factory.createInstance(null, AM_Ci.nsIX509CertDB);
|
||||
|
||||
let fakeCert = realCertDB.constructX509FromBase64(CERT.replace(/\n/g, ""));
|
||||
|
||||
let fakeCertDB = {
|
||||
openSignedAppFileAsync(root, file, callback) {
|
||||
callback.openSignedAppFileFinished(Components.results.NS_OK, null, fakeCert);
|
||||
},
|
||||
|
||||
verifySignedDirectoryAsync(root, dir, callback) {
|
||||
callback.verifySignedDirectoryFinished(Components.results.NS_OK, fakeCert);
|
||||
},
|
||||
|
||||
QueryInterface: XPCOMUtils.generateQI([AM_Ci.nsIX509CertDB])
|
||||
};
|
||||
|
||||
for (let property of Object.keys(realCertDB)) {
|
||||
if (property in fakeCertDB) {
|
||||
continue;
|
||||
}
|
||||
|
||||
if (typeof realCertDB[property] == "function") {
|
||||
fakeCertDB[property] = realCertDB[property].bind(realCertDB);
|
||||
}
|
||||
}
|
||||
|
||||
let certDBFactory = {
|
||||
createInstance: function(outer, iid) {
|
||||
if (outer != null) {
|
||||
throw Components.results.NS_ERROR_NO_AGGREGATION;
|
||||
}
|
||||
return fakeCertDB.QueryInterface(iid);
|
||||
}
|
||||
};
|
||||
registrar.registerFactory(CERTDB_CID, "CertDB",
|
||||
CERTDB_CONTRACTID, certDBFactory);
|
||||
}
|
||||
|
||||
add_task(function*() {
|
||||
createAppInfo("xpcshell@tests.mozilla.org", "XPCShell", "1", "1.9.2");
|
||||
startupManager();
|
||||
|
||||
// Once the application is started we shouldn't be able to replace the
|
||||
// certificate database
|
||||
overrideCertDB();
|
||||
|
||||
let install = yield new Promise(resolve => AddonManager.getInstallForFile(do_get_addon("test_bootstrap1_1"), resolve));
|
||||
do_check_eq(install.state, AddonManager.STATE_DOWNLOAD_FAILED);
|
||||
});
|
|
@ -11,6 +11,7 @@ support-files =
|
|||
|
||||
[test_addon_path_service.js]
|
||||
[test_asyncBlocklistLoad.js]
|
||||
[test_cache_certdb.js]
|
||||
[test_cacheflush.js]
|
||||
[test_DeferredSave.js]
|
||||
[test_gmpProvider.js]
|
||||
|
@ -34,5 +35,4 @@ skip-if = appname != "firefox"
|
|||
[test_proxy.js]
|
||||
[test_pass_symbol.js]
|
||||
|
||||
|
||||
[include:xpcshell-shared.ini]
|
||||
|
|
Загрузка…
Ссылка в новой задаче