Files
QNX/services/kdumper/write_uuencode.c
2025-08-20 19:02:58 +08:00

77 lines
1.4 KiB
C

#include "kdumper.h"
#define ENC(c) (((c) & 077) + ' ')
#define SEQMAX 'z'
#define SEQMIN 'a'
char seqc = SEQMAX;
static unsigned saved_flag;
static unsigned idx;
static char buff[45];
static void
outdec(char *p) {
int c1, c2, c3, c4;
c1 = p[0] >> 2;
c2 = (p[0] << 4) & 060 | (p[1] >> 4) & 017;
c3 = (p[1] << 2) & 074 | (p[2] >> 6) & 03;
c4 = p[2] & 077;
kprintf("%c%c%c%c", ENC(c1), ENC(c2), ENC(c3), ENC(c4));
}
static void
outblock(char *p, unsigned n) {
unsigned i;
kprintf("%c", ENC(n));
for(i = 0; i < n; i += 3) {
outdec(&p[i]);
}
kprintf("%c\n", seqc);
seqc--;
if(seqc < SEQMIN) seqc = SEQMAX;
}
extern struct kdump *dip;
void
write_uuencode(void *p, unsigned len) {
int n;
if(p == WRITE_CMD_ADDR) {
if(len == WRITE_INIT) {
// init
idx = 0;
kprintf("begin %o %s%s\n", 0644, "kdump.elf", dip->compress == 1 ? ".gz":"" );
// Since we're outputting the dump to the kprintf device,
// don't print any debugging messages.
saved_flag = debug_flag;
debug_flag = 0;
} else {
// fini
if(idx != 0) {
outblock(buff, idx);
}
kprintf("end\n");
// Re-enable debugging messages.
debug_flag = saved_flag;
}
return;
}
for(;;) {
n = sizeof(buff) - idx;
if(len < n) n = len;
memcpy(&buff[idx], p, n);
idx += n;
if(idx < sizeof(buff)) break;
outblock(buff, idx);
p = (char *)p + n;
len -= n;
idx = 0;
}
}