static char *debug_help (const char *subcmd, int argc, char *const *const argv);
static char *debug_fds (const char *subcmd, int argc, char *const *const argv);
-static char *debug_mem (const char *subcmd, int argc, char *const *const argv);
static char *debug_sh (const char *subcmd, int argc, char *const *const argv);
static struct cmd cmds[] = {
{ "help", debug_help },
{ "fds", debug_fds },
- { "mem", debug_mem },
{ "sh", debug_sh },
{ NULL, NULL }
};
debug_fds (const char *subcmd, int argc, char *const *const argv)
{
int r;
- char *out = NULL;
+ char *out;
+ size_t size;
+ FILE *fp;
DIR *dir;
struct dirent *d;
char fname[256], link[256];
struct stat statbuf;
+ fp = open_memstream (&out, &size);
+ if (!fp) {
+ reply_with_perror ("open_memstream");
+ return NULL;
+ }
+
dir = opendir ("/proc/self/fd");
if (!dir) {
reply_with_perror ("opendir: /proc/self/fd");
+ fclose (fp);
return NULL;
}
r = lstat (fname, &statbuf);
if (r == -1) {
reply_with_perror ("stat: %s", fname);
+ fclose (fp);
free (out);
closedir (dir);
return NULL;
r = readlink (fname, link, sizeof link - 1);
if (r == -1) {
reply_with_perror ("readline: %s", fname);
+ fclose (fp);
free (out);
closedir (dir);
return NULL;
}
link[r] = '\0';
- r = catprintf (&out, "%2s %s\n", d->d_name, link);
+ fprintf (fp, "%2s %s\n", d->d_name, link);
} else
- r = catprintf (&out, "%2s 0%o\n", d->d_name, statbuf.st_mode);
-
- if (r == -1) {
- reply_with_perror ("catprintf");
- free (out);
- closedir (dir);
- return NULL;
- }
+ fprintf (fp, "%2s 0%o\n", d->d_name, statbuf.st_mode);
}
+ fclose (fp);
+
if (closedir (dir) == -1) {
reply_with_perror ("closedir");
free (out);
return out;
}
-/* Report how much memory we can blindly allocate before
- * we get an error.
- */
-static char *
-debug_mem (const char *subcmd, int argc, char *const *const argv)
-{
- char *mem = NULL, *p;
- int size = 0;
- char *buf;
-
- for (;;) {
- size += 128 * 1024;
- p = realloc (mem, size);
- if (p == NULL) {
- free (mem);
- break;
- }
- mem = p;
- }
-
- if (asprintf (&buf, "%.1f MBytes", size / 1024.0 / 1024.0) == -1) {
- reply_with_perror ("asprintf");
- return NULL;
- }
-
- return buf; /* caller frees */
-}
-
/* Run an arbitrary shell command. */
static char *
debug_sh (const char *subcmd, int argc, char *const *const argv)