return xstrdup(filename_start_ptr);
}
-static int file_doesnt_exist(const char *filename)
-{
- struct stat statbuf;
- return stat(filename, &statbuf);
-}
-
int patch_main(int argc, char **argv) MAIN_EXTERNALLY_VISIBLE;
int patch_main(int argc, char **argv)
{
char *patch_line;
int ret;
FILE *patch_file = NULL;
-
+ struct stat saved_stat;
+
{
char *p, *i;
ret = getopt32(argv, "p:i:", &p, &i);
}
new_filename = extract_filename(patch_line, patch_level);
free(patch_line);
-
- if (file_doesnt_exist(new_filename)) {
+
+ /* Get access rights from the file to be patched, -1 file does not exist */
+ if (stat(new_filename, &saved_stat)) {
char *line_ptr;
/* Create leading directories */
line_ptr = strrchr(new_filename, '/');
backup_filename);
}
dst_stream = xfopen(new_filename, "w");
+ fchmod(fileno(dst_stream), saved_stat.st_mode);
}
- if ((backup_filename == NULL) || file_doesnt_exist(original_filename)) {
+ if ((backup_filename == NULL) || stat(original_filename, &saved_stat)) {
src_stream = NULL;
} else {
if (strcmp(original_filename, new_filename) == 0) {
}
messageD(L_LOG, "console='%s'", s);
} else {
- /* Make sure fd 0,1,2 are not closed */
- bb_sanitize_stdio();
+ /* Make sure fd 0,1,2 are not closed
+ * (so that they won't be used by future opens) */
+
+ /* bb_sanitize_stdio(); - WRONG.
+ * Fail if "/dev/null" doesnt exist, and for init
+ * this is a real possibility! Open code it instead. */
+
+ int fd = open(bb_dev_null, O_RDWR);
+ if (fd < 0) {
+ /* Give me _ANY_ open descriptor! */
+ fd = xopen("/", O_RDONLY); /* we don't believe this can fail */
+ }
+ while ((unsigned)fd < 2)
+ fd = dup(fd);
+ if (fd > 2)
+ close (fd);
}
s = getenv("TERM");
if (cmdedit_x >= num) {
cmdedit_x -= num;
if (num <= 4) {
- printf("\b\b\b\b" + (4-num));
+ /* This is longer by 5 bytes on x86.
+ * Also gets mysteriously
+ * miscompiled for some ARM users.
+ * printf(("\b\b\b\b" + 4) - num);
+ * return;
+ */
+ do {
+ bb_putchar('\b');
+ } while (--num);
return;
}
printf("\033[%uD", num);
if ((STRNCASECMP(iobuf, "Content-length:") == 0)) {
/* extra read only for POST */
if (prequest != request_GET) {
- tptr = iobuf + sizeof("Content-length:") - 1;
+ tptr = tptr = skip_whitespace(iobuf + sizeof("Content-length:") - 1);
if (!tptr[0])
send_headers_and_exit(HTTP_BAD_REQUEST);
errno = 0;
if (!opt)
return 0;
- idx = index_in_strings(opt, dhcp_option_strings); /* NB: was strcasecmp! */
+ idx = index_in_strings(dhcp_option_strings, opt); /* NB: was strcasecmp! */
if (idx < 0)
return 0;
option = &dhcp_options[idx];