|
Lines 133-138
Link Here
|
| 133 |
return false; |
133 |
return false; |
| 134 |
} |
134 |
} |
| 135 |
|
135 |
|
|
|
136 |
static int parse_proc_cmdline_resume() { |
| 137 |
_cleanup_free_ char *line = NULL; |
| 138 |
char *w, *state; |
| 139 |
size_t l; |
| 140 |
int r; |
| 141 |
|
| 142 |
r = proc_cmdline(&line); |
| 143 |
if (r < 0) |
| 144 |
log_warning("Failed to read /proc/cmdline, ignoring: %s", strerror(-r)); |
| 145 |
if (r <= 0) |
| 146 |
return 0; |
| 147 |
|
| 148 |
if (strstr(line, "resume=")) { |
| 149 |
FOREACH_WORD_QUOTED(w, l, line, state) { |
| 150 |
_cleanup_free_ char *word; |
| 151 |
word = strndup(w, l); |
| 152 |
|
| 153 |
if (startswith(word, "resume=")) { |
| 154 |
struct stat s; |
| 155 |
const char *path = word + 7; |
| 156 |
|
| 157 |
if (stat(path,&s) == 0) { |
| 158 |
if (S_ISBLK(s.st_mode)) { |
| 159 |
return 0; |
| 160 |
} else if (S_ISREG(s.st_mode)) { |
| 161 |
if (strstr(line, "resume_offset=")) |
| 162 |
return 0; |
| 163 |
else |
| 164 |
return -1; |
| 165 |
} else { |
| 166 |
return -1; |
| 167 |
} |
| 168 |
} |
| 169 |
} |
| 170 |
} |
| 171 |
return 0; |
| 172 |
} else { |
| 173 |
return -1; |
| 174 |
} |
| 175 |
} |
| 176 |
|
| 136 |
int can_sleep_disk(char **types) { |
177 |
int can_sleep_disk(char **types) { |
| 137 |
char *w, *state, **type; |
178 |
char *w, *state, **type; |
| 138 |
int r; |
179 |
int r; |
|
Lines 145-150
Link Here
|
| 145 |
if (access("/sys/power/disk", W_OK) < 0) |
186 |
if (access("/sys/power/disk", W_OK) < 0) |
| 146 |
return false; |
187 |
return false; |
| 147 |
|
188 |
|
|
|
189 |
/* check for resume parameters on command line */ |
| 190 |
if (parse_proc_cmdline_resume() < 0) |
| 191 |
return false; |
| 192 |
|
| 148 |
r = read_one_line_file("/sys/power/disk", &p); |
193 |
r = read_one_line_file("/sys/power/disk", &p); |
| 149 |
if (r < 0) |
194 |
if (r < 0) |
| 150 |
return false; |
195 |
return false; |