+// SPDX-License-Identifier: GPL-2.0+
/*
* Copyright (c) 2011 The Chromium OS Authors.
- * SPDX-License-Identifier: GPL-2.0+
*/
#include <dirent.h>
#include <errno.h>
#include <fcntl.h>
#include <getopt.h>
+#include <setjmp.h>
#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
DIR *dir;
int ret;
char *fname;
+ char *old_fname;
int len;
int dirlen;
break;
}
next = malloc(sizeof(*node) + strlen(entry->d_name) + 1);
- if (dirlen + strlen(entry->d_name) > len) {
- len = dirlen + strlen(entry->d_name);
- fname = realloc(fname, len);
- }
- if (!next || !fname) {
- free(next);
+ if (!next) {
os_dirent_free(head);
ret = -ENOMEM;
goto done;
}
+ if (dirlen + strlen(entry->d_name) > len) {
+ len = dirlen + strlen(entry->d_name);
+ old_fname = fname;
+ fname = realloc(fname, len);
+ if (!fname) {
+ free(old_fname);
+ free(next);
+ os_dirent_free(head);
+ ret = -ENOMEM;
+ goto done;
+ }
+ }
next->next = NULL;
strcpy(next->name, entry->d_name);
switch (entry->d_type) {
return 0;
}
+void os_putc(int ch)
+{
+ putchar(ch);
+}
+
+void os_puts(const char *str)
+{
+ while (*str)
+ os_putc(*str++);
+}
+
int os_write_ram_buf(const char *fname)
{
struct sandbox_state *state = state_get_current();
rt->tm_yday = tm->tm_yday;
rt->tm_isdst = tm->tm_isdst;
}
+
+int os_setjmp(ulong *jmp, int size)
+{
+ jmp_buf dummy;
+
+ /*
+ * We cannot rely on the struct name that jmp_buf uses, so use a
+ * local variable here
+ */
+ if (size < sizeof(dummy)) {
+ printf("setjmp: jmpbuf is too small (%d bytes, need %d)\n",
+ size, sizeof(jmp_buf));
+ return -ENOSPC;
+ }
+
+ return setjmp((struct __jmp_buf_tag *)jmp);
+}
+
+void os_longjmp(ulong *jmp, int ret)
+{
+ longjmp((struct __jmp_buf_tag *)jmp, ret);
+}