/* * Copyright 2014 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ #include <dumpstate.h> #include <errno.h> #include <fcntl.h> #include <stdlib.h> #include <stdio.h> #include <string.h> static const char base64[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/"; static const char pad64 = '='; static void base64_output3(const unsigned char *src, int len) { printf("%c", base64[src[0] >> 2]); printf("%c", base64[((src[0] & 0x03) << 4) | (src[1] >> 4)]); if (len == 1) { printf("=="); return; } printf("%c", base64[((src[1] & 0x0F) << 2) | (src[2] >> 6)]); if (len == 2) { printf("="); return; } printf("%c", base64[src[2] & 0x3F]); } static void fugu_dump_base64(const char *path) { printf("------ (%s) ------\n", path); int fd = open(path, O_RDONLY | O_CLOEXEC | O_NOFOLLOW); if (fd < 0) { printf("*** %s: %s\n\n", path, strerror(errno)); return; } /* buffer size multiple of 3 for ease of use */ unsigned char buffer[1200]; int left = 0; int count = 0; for (;;) { int ret = read(fd, &buffer[left], sizeof(buffer) - left); if (ret <= 0) { break; } left += ret; int ofs = 0; while (left > 2) { base64_output3(&buffer[ofs], 3); left -= 3; ofs += 3; count += 4; if (count > 72) { printf("\n"); count = 0; } } if (left) { memmove(buffer, &buffer[ofs], left); } } close(fd); if (!left) { printf("\n------ end ------\n"); return; } /* finish padding */ count = left; while (count < 3) { buffer[count++] = 0; } base64_output3(buffer, left); printf("\n------ end ------\n"); } void dumpstate_board() { dump_file("INTERRUPTS", "/proc/interrupts"); dump_file("last ipanic_console", "/data/dontpanic/ipanic_console"); dump_file("last ipanic_threads", "/data/dontpanic/ipanic_threads"); fugu_dump_base64("/dev/snd_atvr_mSBC"); fugu_dump_base64("/dev/snd_atvr_pcm"); };