diff options
author | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
---|---|---|
committer | Taru Karttunen <taruti@taruti.net> | 2011-03-30 15:46:40 +0300 |
commit | e5888a1ffdae813d7575f5fb02275c6bb07e5199 (patch) | |
tree | d8d51eac403f07814b9e936eed0c9a79195e2450 /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-x | sys/src/cmd/snap/write.c | 82 |
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]); + } +} |