Add the 'checkpt' utility to support the process checkpoint module. This
authorMatthew Dillon <dillon@dragonflybsd.org>
Mon, 20 Oct 2003 04:46:14 +0000 (04:46 +0000)
committerMatthew Dillon <dillon@dragonflybsd.org>
Mon, 20 Oct 2003 04:46:14 +0000 (04:46 +0000)
originated from Kip Macy with cleanups and modifications by Matt Dillon.

Note: currently i386-specific.  The system calls have not been integrated
into libc yet.

Submitted-by: Kip Macy <kmacy@fsmware.com>
usr.bin/checkpt/DEFS.h [new file with mode: 0644]
usr.bin/checkpt/Makefile [new file with mode: 0644]
usr.bin/checkpt/call.h [new file with mode: 0644]
usr.bin/checkpt/checkpt.1 [new file with mode: 0644]
usr.bin/checkpt/checkpt.c [new file with mode: 0644]
usr.bin/checkpt/freeze.S [new file with mode: 0644]

diff --git a/usr.bin/checkpt/DEFS.h b/usr.bin/checkpt/DEFS.h
new file mode 100644 (file)
index 0000000..5008b65
--- /dev/null
@@ -0,0 +1,40 @@
+/*-
+ * Copyright (c) 1990 The Regents of the University of California.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to Berkeley by
+ * William Jolitz.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ *    must display the following acknowledgement:
+ *     This product includes software developed by the University of
+ *     California, Berkeley and its contributors.
+ * 4. Neither the name of the University nor the names of its contributors
+ *    may be used to endorse or promote products derived from this software
+ *    without specific prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ *     from: @(#)DEFS.h        5.1 (Berkeley) 4/23/90
+ * $DragonFly: src/usr.bin/checkpt/DEFS.h,v 1.1 2003/10/20 04:46:14 dillon Exp $
+ */
+
+#include <machine/asm.h>
diff --git a/usr.bin/checkpt/Makefile b/usr.bin/checkpt/Makefile
new file mode 100644 (file)
index 0000000..22b8a7b
--- /dev/null
@@ -0,0 +1,7 @@
+# $DragonFly: src/usr.bin/checkpt/Makefile,v 1.1 2003/10/20 04:46:14 dillon Exp $
+
+PROG=  checkpt
+SRCS=  checkpt.c freeze.S
+NOSHARED?=      YES
+
+.include <bsd.prog.mk>
diff --git a/usr.bin/checkpt/call.h b/usr.bin/checkpt/call.h
new file mode 100644 (file)
index 0000000..1fc9d83
--- /dev/null
@@ -0,0 +1,47 @@
+/*-
+ * Copyright (c) 2003 Kip Macy All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $DragonFly: src/usr.bin/checkpt/Attic/call.h,v 1.1 2003/10/20 04:46:14 dillon Exp $
+ */
+
+#ifndef _CALL_H_
+#define _CALL_H_
+
+#define CKPT_FREEZE    0x1
+#define CKPT_THAW      0x2
+#define CKPT_FREEZEPID 0x3
+#define CKPT_THAWBIN   0x4
+
+#define THAW_RETURN    0x7
+
+#define CKPT_SYSCALL 210
+
+/* the meaning of the universe? let's hope not */
+int ckpt_checkpoint(int fd);
+int ckpt_restore(int fd, int retval);
+int ckpt_register(struct sigaction *c, struct sigaction *r);
+int ckpt_checkpoint_pid(int fd, int pid);
+int ckpt_restore_bin(int fd, char *bin, int binlen);
+
+#endif
diff --git a/usr.bin/checkpt/checkpt.1 b/usr.bin/checkpt/checkpt.1
new file mode 100644 (file)
index 0000000..ca96db6
--- /dev/null
@@ -0,0 +1,59 @@
+.\" 
+.\" Copyright (c) 2003 Matthew Dillon, All Rights Reserved.
+.\" 
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\" 
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\" 
+.\" $DragonFly: src/usr.bin/checkpt/checkpt.1,v 1.1 2003/10/20 04:46:14 dillon Exp $
+.\"
+.Dd October 19, 2003
+.Dt CHECKPT 1
+.Os
+.Sh NAME
+.Nm checkpt
+.Nd resume checkpointed program
+.Sh SYNOPSIS
+.Nm
+.Op Fl r Ar file.ckpt
+.Ar
+.Sh DESCRIPTION
+The
+.Nm
+utility will resume the checkpointed program from the specified checkpoint
+file.  Programs can be checkpointed using ^E.
+.Pp
+The checkpt.ko module must be loaded for checkpointing to work.  By default,
+only members of the wheel group can checkpoint a program.  The group can be
+changed with the sysctl kern.ckptgroup.  The checkpoint file template can be
+changed with the sysctl kern.ckptfile. 
+.Pp
+The checkpointing utility is currently very primitive.  Only programs 
+operating on normal files can be properly restored.  Programs which operate
+on devices, sockets, or pipes (including piped commands) cannot be restored.
+File descriptors 0, 1, and 2, are not saved and the restored program will
+inherit the descriptors from
+.Nm
+.Sh SEE ALSO
+.Xr stty 1
+.Sh HISTORY
+The
+.Nm
+command first appeared in DragonFly .
diff --git a/usr.bin/checkpt/checkpt.c b/usr.bin/checkpt/checkpt.c
new file mode 100644 (file)
index 0000000..9c46e49
--- /dev/null
@@ -0,0 +1,82 @@
+/*-
+ * Copyright (c) 2003 Kip Macy All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $DragonFly: src/usr.bin/checkpt/checkpt.c,v 1.1 2003/10/20 04:46:14 dillon Exp $
+ */
+
+#include <stdio.h>
+#include <stdlib.h>
+#include <unistd.h>
+#include <string.h>
+#include <sys/signal.h>
+#include <sys/syscall.h>
+#include <sys/types.h>
+#include <sys/stat.h>
+#include <sys/module.h>
+#include <signal.h>
+#include <fcntl.h>
+
+#include "call.h"
+
+static
+void
+usage(const char *prg)
+{
+    fprintf(stderr, "%s file.ckpt\n", prg);
+    exit(1);
+}
+
+int
+main(int ac, char **av)
+{
+    int fd;
+    int error;
+    char ch;
+    const char *filename = NULL;
+
+    while ((ch = getopt(ac, av, "r:")) != -1) {
+       switch(ch) {
+       case 'r':
+           filename = optarg;
+           break;
+       default:
+           usage(av[0]);
+       }
+    }
+    if (filename == NULL)
+       usage(av[0]);
+
+    fd = open(filename, O_RDONLY);
+    if (fd < 0) {
+       fprintf(stderr, "unable to open %s\n", av[1]);
+       exit(1);
+    }
+    error = ckpt_restore(fd, THAW_RETURN);
+    if (error)
+       fprintf(stderr, "thaw failed error %d %s\n", error, strerror(error));
+    else
+       fprintf(stderr, "Unknown error restoring checkpoint\n");
+    return(5);
+}
+
diff --git a/usr.bin/checkpt/freeze.S b/usr.bin/checkpt/freeze.S
new file mode 100644 (file)
index 0000000..1c92d55
--- /dev/null
@@ -0,0 +1,61 @@
+/*-
+ * Copyright (c) 2003 Kip Macy All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ * $DragonFly: src/usr.bin/checkpt/Attic/freeze.S,v 1.1 2003/10/20 04:46:14 dillon Exp $
+ */
+
+#include "DEFS.h"
+
+ENTRY(ckpt_checkpoint)
+       pop     %ecx            /* rta */
+       /* fd - on top of stack */      
+       pushl   $0x1            /* CKPT_FREEZE */ ; 
+       push    %ecx
+       movl    $0xd2,%eax      /* ckpt_proc sysent offset */
+       int     $0x80           /* jump to kernel */
+       push    %ecx
+       jb      1f
+       ret
+       mov     %esi,%esi
+1:
+       PIC_PROLOGUE
+       jmp     PIC_PLT(HIDENAME(cerror))
+
+
+ENTRY(ckpt_restore)
+       pop     %ecx            /* rta */
+       /* fd - on top of stack */      
+       pushl   $0x2            /* CKPT_THAW */ ; 
+       push    %ecx
+       movl    $0xd2,%eax      /* ckpt_proc sysent offset */
+       int     $0x80           /* jump to kernel */
+       push    %ecx
+       jb      1f
+       ret
+       mov     %esi,%esi
+1:
+       PIC_PROLOGUE
+       jmp     PIC_PLT(HIDENAME(cerror))
+
+