#include "guestfs_protocol.h"
static void default_error_cb (guestfs_h *g, void *data, const char *msg);
-static void remove_tmpdir (guestfs_h *g);
static void close_handles (void);
gl_lock_define_initialized (static, handles_lock);
*/
g->msg_next_serial = 0x00123400;
+ /* Default is uniprocessor appliance. */
+ g->smp = 1;
+
/* Link the handles onto a global list. */
gl_lock_lock (handles_lock);
g->next = handles;
g->events = NULL;
guestfs___free_inspect_info (g);
+ guestfs___free_drives (&g->drives);
/* Close sockets. */
if (g->fd[0] >= 0)
if (g->recoverypid > 0) waitpid (g->recoverypid, NULL, 0);
/* Remove whole temporary directory. */
- remove_tmpdir (g);
+ guestfs___remove_tmpdir (g->tmpdir);
+ free (g->tmpdir);
if (g->cmdline) {
size_t i;
free (g);
}
-/* g->tmpdir can contain any files (but not subdirectories). Remove
- * those and the directory itself. Note that errors in this function
- * aren't really that important: if we end up not deleting temporary
- * files it's only annoying.
- */
-static void
-remove_tmpdir (guestfs_h *g)
-{
- DIR *dir;
- struct dirent *d;
-
- if (!g->tmpdir)
- return;
-
- dir = opendir (g->tmpdir);
- if (dir == NULL) {
- perror (g->tmpdir);
- return;
- }
-
- while ((d = readdir (dir)) != NULL) {
- if (STRNEQ (d->d_name, ".") && STRNEQ (d->d_name, "..")) {
- if (unlinkat (dirfd (dir), d->d_name, 0) == -1)
- perror (d->d_name);
- }
- }
-
- if (closedir (dir) == -1)
- perror (g->tmpdir);
-
- if (rmdir (g->tmpdir) == -1)
- perror (g->tmpdir);
-
- free (g->tmpdir);
- g->tmpdir = NULL;
-}
-
/* Close all open handles (called from atexit(3)). */
static void
close_handles (void)
if (len < 0) return;
guestfs___call_callbacks_message (g, GUESTFS_EVENT_LIBRARY, msg, len);
+
+ free (msg);
}
/* Call trace messages. These are enabled by setting g->trace, and
if (err < 0) return;
-#if !defined(_GNU_SOURCE) || defined(__APPLE__)
char buf[256];
strerror_r (errnum, buf, sizeof buf);
-#else
- char _buf[256];
- char *buf;
- buf = strerror_r (errnum, _buf, sizeof _buf);
-#endif
msg = safe_realloc (g, msg, strlen (msg) + 2 + strlen (buf) + 1);
strcat (msg, ": ");
return g->error_cb;
}
+void
+guestfs_user_cancel (guestfs_h *g)
+{
+ g->user_cancel = 1;
+}
+
int
guestfs__set_verbose (guestfs_h *g, int v)
{
return ret;
}
+int
+guestfs__set_pgroup (guestfs_h *g, int v)
+{
+ g->pgroup = !!v;
+ return 0;
+}
+
+int
+guestfs__get_pgroup (guestfs_h *g)
+{
+ return g->pgroup;
+}
+
+int
+guestfs__set_smp (guestfs_h *g, int v)
+{
+ if (v >= 1) {
+ g->smp = v;
+ return 0;
+ } else {
+ error (g, "invalid smp parameter: %d", v);
+ return -1;
+ }
+}
+
+int
+guestfs__get_smp (guestfs_h *g)
+{
+ return g->smp;
+}
+
/* Note the private data area is allocated lazily, since the vast
* majority of callers will never use it. This means g->pda is
* likely to be NULL.
free (argv[i]);
free (argv);
}
+
+void
+guestfs___free_drives (struct drive **drives)
+{
+ struct drive *i = *drives;
+ *drives = NULL;
+
+ while (i != NULL) {
+ struct drive *next = i->next;
+
+ free (i->path);
+ free (i->format);
+ free (i->iface);
+ free (i->name);
+ free (i);
+
+ i = next;
+ }
+}