summaryrefslogtreecommitdiff
path: root/sys/src/cmd/snap/write.c
diff options
context:
space:
mode:
authorTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
committerTaru Karttunen <taruti@taruti.net>2011-03-30 15:46:40 +0300
commite5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch)
treed8d51eac403f07814b9e936eed0c9a79195e2450 /sys/src/cmd/snap/write.c
Import sources from 2011-03-30 iso image
Diffstat (limited to 'sys/src/cmd/snap/write.c')
-rwxr-xr-xsys/src/cmd/snap/write.c82
1 files changed, 82 insertions, 0 deletions
diff --git a/sys/src/cmd/snap/write.c b/sys/src/cmd/snap/write.c
new file mode 100755
index 000000000..2cbb1e5c0
--- /dev/null
+++ b/sys/src/cmd/snap/write.c
@@ -0,0 +1,82 @@
+#include <u.h>
+#include <libc.h>
+#include <bio.h>
+#include "snap.h"
+
+char *pfile[Npfile] = {
+ [Psegment] "segment",
+ [Pfd] "fd",
+ [Pfpregs] "fpregs",
+ [Pnoteid] "noteid",
+ [Pkregs] "kregs",
+ [Pns] "ns",
+ [Pproc] "proc",
+ [Pregs] "regs",
+ [Pstatus] "status",
+};
+
+static void
+writeseg(Biobuf *b, Proc *proc, Seg *s)
+{
+ int i, npg;
+ Page **pp, *p;
+ int type;
+
+ if(s == nil){
+ Bprint(b, "%-11ud %-11ud ", 0, 0);
+ return;
+ }
+
+ type = proc->text == s ? 't' : 'm';
+ npg = (s->len+Pagesize-1)/Pagesize;
+ if(npg != s->npg)
+ abort();
+
+ Bprint(b, "%-11llud %-11llud ", s->offset, s->len);
+ if(s->len == 0)
+ return;
+
+ for(i=0, pp=s->pg, p=*pp; i<npg; i++, pp++, p=*pp) {
+ if(p->written) {
+ if(p->type == 'z') {
+ Bprint(b, "z");
+ continue;
+ }
+ Bprint(b, "%c%-11ld %-11llud ", p->type, p->pid, p->offset);
+ } else {
+ Bprint(b, "r");
+ Bwrite(b, p->data, p->len);
+ if(p->len != Pagesize && i != npg-1)
+ abort();
+ p->written = 1;
+ p->type = type;
+ p->offset = s->offset + i*Pagesize;
+ p->pid = proc->pid;
+ }
+ }
+}
+
+
+void
+writesnap(Biobuf *b, Proc *p)
+{
+ int i, n;
+ Data *d;
+
+ for(i=0; i<Npfile; i++)
+ if(d = p->d[i]) {
+ Bprint(b, "%-11ld %s\n%-11lud ", p->pid, pfile[i], d->len);
+ Bwrite(b, d->data, d->len);
+ }
+
+ if(p->text) {
+ Bprint(b, "%-11ld text\n", p->pid);
+ writeseg(b, p, p->text);
+ }
+
+ if(n = p->nseg) {
+ Bprint(b, "%-11ld mem\n%-11d ", p->pid, n);
+ for(i=0; i<n; i++)
+ writeseg(b, p, p->seg[i]);
+ }
+}