88 lines
2.5 KiB
Diff
88 lines
2.5 KiB
Diff
--- procps-3.2.7/sysctl.c.kzak 2007-04-03 01:26:01.000000000 +0200
|
|
+++ procps-3.2.7/sysctl.c 2007-04-03 01:26:13.000000000 +0200
|
|
@@ -63,6 +63,44 @@
|
|
static const char ERR_PRELOAD_FILE[] = "error: unable to open preload file \"%s\"\n";
|
|
static const char WARN_BAD_LINE[] = "warning: %s(%d): invalid syntax, continuing...\n";
|
|
|
|
+/* Ignore deprecated sysctls
|
|
+ * -- we use this list when we scan (DisplayAll) /proc/sys only. We don't use it
|
|
+ * in case when user direcly uses deprecated key. It's better when user can read
|
|
+ * an error message from kernel.
|
|
+ */
|
|
+struct sysctl_ignore {
|
|
+ const char *prefix;
|
|
+ int prefix_len;
|
|
+ const char *option;
|
|
+ int option_len;
|
|
+};
|
|
+
|
|
+#define IGNORE_ENTRY(prefix, option) \
|
|
+ { prefix, sizeof(prefix)-1, option, sizeof(option)-1 }
|
|
+
|
|
+static struct sysctl_ignore Ignore[] =
|
|
+{
|
|
+ IGNORE_ENTRY( "net.ipv6.neigh", "base_reachable_time" ),
|
|
+ IGNORE_ENTRY( "net.ipv6.neigh", "retrans_time" )
|
|
+};
|
|
+
|
|
+static bool IsIgnored(const char *name)
|
|
+{
|
|
+ unsigned int i;
|
|
+ int sz = strlen(name);
|
|
+
|
|
+ for (i = 0; i < sizeof(Ignore)/sizeof(struct sysctl_ignore); i++) {
|
|
+ struct sysctl_ignore *p = &Ignore[i];
|
|
+
|
|
+ if (sz < (p->prefix_len + p->option_len))
|
|
+ continue;
|
|
+
|
|
+ if (strncmp(name, p->prefix, p->prefix_len) == 0 &&
|
|
+ strcmp(name + (sz - p->option_len), p->option) == 0)
|
|
+ return true;
|
|
+ }
|
|
+ return false;
|
|
+}
|
|
|
|
static void slashdot(char *restrict p, char old, char new){
|
|
p = strpbrk(p,"/.");
|
|
@@ -122,7 +160,7 @@
|
|
* Read a sysctl setting
|
|
*
|
|
*/
|
|
-static int ReadSetting(const char *restrict const name) {
|
|
+static int ReadSetting(const char *restrict const name, bool useign) {
|
|
int rc = 0;
|
|
char *restrict tmpname;
|
|
char *restrict outname;
|
|
@@ -145,6 +183,12 @@
|
|
outname = strdup(name);
|
|
slashdot(outname,'/','.'); /* change / to . */
|
|
|
|
+ if (useign && IsIgnored(outname)) {
|
|
+ free(outname);
|
|
+ free(tmpname);
|
|
+ return rc;
|
|
+ }
|
|
+
|
|
if (stat(tmpname, &st)==0) {
|
|
if (st.st_mode & (S_IRUSR|S_IROTH|S_IRGRP))
|
|
fp = fopen(tmpname, "r");
|
|
@@ -257,7 +301,7 @@
|
|
strcat(tmpdir, "/");
|
|
DisplayAll(tmpdir);
|
|
} else {
|
|
- rc |= ReadSetting(tmpdir+strlen(PROC_PATH));
|
|
+ rc |= ReadSetting(tmpdir+strlen(PROC_PATH), true);
|
|
}
|
|
}
|
|
free(tmpdir);
|
|
@@ -519,7 +563,7 @@
|
|
if (WriteMode || index(*argv, '='))
|
|
ReturnCode = WriteSetting(*argv);
|
|
else
|
|
- ReturnCode = ReadSetting(*argv);
|
|
+ ReturnCode = ReadSetting(*argv, false);
|
|
}
|
|
}
|
|
|