diff options
Diffstat (limited to 'openbsd-compat/port-linux.c')
-rw-r--r-- | openbsd-compat/port-linux.c | 57 |
1 files changed, 37 insertions, 20 deletions
diff --git a/openbsd-compat/port-linux.c b/openbsd-compat/port-linux.c index c0ac9065e..86a7146a6 100644 --- a/openbsd-compat/port-linux.c +++ b/openbsd-compat/port-linux.c | |||
@@ -1,4 +1,4 @@ | |||
1 | /* $Id: port-linux.c,v 1.8 2010/03/01 04:52:50 dtucker Exp $ */ | 1 | /* $Id: port-linux.c,v 1.11 2011/01/17 07:50:24 dtucker Exp $ */ |
2 | 2 | ||
3 | /* | 3 | /* |
4 | * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com> | 4 | * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com> |
@@ -53,7 +53,7 @@ ssh_selinux_enabled(void) | |||
53 | static int enabled = -1; | 53 | static int enabled = -1; |
54 | 54 | ||
55 | if (enabled == -1) { | 55 | if (enabled == -1) { |
56 | enabled = is_selinux_enabled(); | 56 | enabled = (is_selinux_enabled() == 1); |
57 | debug("SELinux support %s", enabled ? "enabled" : "disabled"); | 57 | debug("SELinux support %s", enabled ? "enabled" : "disabled"); |
58 | } | 58 | } |
59 | 59 | ||
@@ -225,14 +225,22 @@ ssh_selinux_change_context(const char *newname) | |||
225 | #endif /* WITH_SELINUX */ | 225 | #endif /* WITH_SELINUX */ |
226 | 226 | ||
227 | #ifdef LINUX_OOM_ADJUST | 227 | #ifdef LINUX_OOM_ADJUST |
228 | #define OOM_ADJ_PATH "/proc/self/oom_adj" | ||
229 | /* | 228 | /* |
230 | * The magic "don't kill me", as documented in eg: | 229 | * The magic "don't kill me" values, old and new, as documented in eg: |
231 | * http://lxr.linux.no/#linux+v2.6.32/Documentation/filesystems/proc.txt | 230 | * http://lxr.linux.no/#linux+v2.6.32/Documentation/filesystems/proc.txt |
231 | * http://lxr.linux.no/#linux+v2.6.36/Documentation/filesystems/proc.txt | ||
232 | */ | 232 | */ |
233 | #define OOM_ADJ_NOKILL -17 | ||
234 | 233 | ||
235 | static int oom_adj_save = INT_MIN; | 234 | static int oom_adj_save = INT_MIN; |
235 | static char *oom_adj_path = NULL; | ||
236 | struct { | ||
237 | char *path; | ||
238 | int value; | ||
239 | } oom_adjust[] = { | ||
240 | {"/proc/self/oom_score_adj", -1000}, /* kernels >= 2.6.36 */ | ||
241 | {"/proc/self/oom_adj", -17}, /* kernels <= 2.6.35 */ | ||
242 | {NULL, 0}, | ||
243 | }; | ||
236 | 244 | ||
237 | /* | 245 | /* |
238 | * Tell the kernel's out-of-memory killer to avoid sshd. | 246 | * Tell the kernel's out-of-memory killer to avoid sshd. |
@@ -241,23 +249,31 @@ static int oom_adj_save = INT_MIN; | |||
241 | void | 249 | void |
242 | oom_adjust_setup(void) | 250 | oom_adjust_setup(void) |
243 | { | 251 | { |
252 | int i, value; | ||
244 | FILE *fp; | 253 | FILE *fp; |
245 | 254 | ||
246 | debug3("%s", __func__); | 255 | debug3("%s", __func__); |
247 | if ((fp = fopen(OOM_ADJ_PATH, "r+")) != NULL) { | 256 | for (i = 0; oom_adjust[i].path != NULL; i++) { |
248 | if (fscanf(fp, "%d", &oom_adj_save) != 1) | 257 | oom_adj_path = oom_adjust[i].path; |
249 | verbose("error reading %s: %s", OOM_ADJ_PATH, strerror(errno)); | 258 | value = oom_adjust[i].value; |
250 | else { | 259 | if ((fp = fopen(oom_adj_path, "r+")) != NULL) { |
251 | rewind(fp); | 260 | if (fscanf(fp, "%d", &oom_adj_save) != 1) |
252 | if (fprintf(fp, "%d\n", OOM_ADJ_NOKILL) <= 0) | 261 | verbose("error reading %s: %s", oom_adj_path, |
253 | verbose("error writing %s: %s", | 262 | strerror(errno)); |
254 | OOM_ADJ_PATH, strerror(errno)); | 263 | else { |
255 | else | 264 | rewind(fp); |
256 | verbose("Set %s from %d to %d", | 265 | if (fprintf(fp, "%d\n", value) <= 0) |
257 | OOM_ADJ_PATH, oom_adj_save, OOM_ADJ_NOKILL); | 266 | verbose("error writing %s: %s", |
267 | oom_adj_path, strerror(errno)); | ||
268 | else | ||
269 | verbose("Set %s from %d to %d", | ||
270 | oom_adj_path, oom_adj_save, value); | ||
271 | } | ||
272 | fclose(fp); | ||
273 | return; | ||
258 | } | 274 | } |
259 | fclose(fp); | ||
260 | } | 275 | } |
276 | oom_adj_path = NULL; | ||
261 | } | 277 | } |
262 | 278 | ||
263 | /* Restore the saved OOM adjustment */ | 279 | /* Restore the saved OOM adjustment */ |
@@ -267,13 +283,14 @@ oom_adjust_restore(void) | |||
267 | FILE *fp; | 283 | FILE *fp; |
268 | 284 | ||
269 | debug3("%s", __func__); | 285 | debug3("%s", __func__); |
270 | if (oom_adj_save == INT_MIN || (fp = fopen(OOM_ADJ_PATH, "w")) == NULL) | 286 | if (oom_adj_save == INT_MIN || oom_adj_path == NULL || |
287 | (fp = fopen(oom_adj_path, "w")) == NULL) | ||
271 | return; | 288 | return; |
272 | 289 | ||
273 | if (fprintf(fp, "%d\n", oom_adj_save) <= 0) | 290 | if (fprintf(fp, "%d\n", oom_adj_save) <= 0) |
274 | verbose("error writing %s: %s", OOM_ADJ_PATH, strerror(errno)); | 291 | verbose("error writing %s: %s", oom_adj_path, strerror(errno)); |
275 | else | 292 | else |
276 | verbose("Set %s to %d", OOM_ADJ_PATH, oom_adj_save); | 293 | verbose("Set %s to %d", oom_adj_path, oom_adj_save); |
277 | 294 | ||
278 | fclose(fp); | 295 | fclose(fp); |
279 | return; | 296 | return; |