/* * To test if new kernel features work normally, and if old features still * work normally with new features added. * added by xw, 18/4/27 */ #include "type.h" #include "const.h" #include "protect.h" #include "string.h" #include "proc.h" #include "global.h" #include "proto.h" #include "fs.h" #include "vfs.h" #include "string.h" /** * @struct posix_tar_header * Borrowed from GNU `tar' */ // added by mingxuan 2019-5-18 struct posix_tar_header { /* byte offset */ char name[100]; /* 0 */ char mode[8]; /* 100 */ char uid[8]; /* 108 */ char gid[8]; /* 116 */ char size[12]; /* 124 */ char mtime[12]; /* 136 */ char chksum[8]; /* 148 */ char typeflag; /* 156 */ char linkname[100]; /* 157 */ char magic[6]; /* 257 */ char version[2]; /* 263 */ char uname[32]; /* 265 */ char gname[32]; /* 297 */ char devmajor[8]; /* 329 */ char devminor[8]; /* 337 */ char prefix[155]; /* 345 */ /* 500 */ }; /***************************************************************************** * untar * added by mingxuan 2019-5-18 *****************************************************************************/ /** * Extract the tar file and store them. * * @param filename The tar file. *****************************************************************************/ static void untar(const char *filename) { printf("[extract %s \n", filename); int fd = do_vopen(filename, O_RDWR); // modified by mingxuan 2019-5-20 char buf[512 * 16]; int chunk = sizeof(buf); int i = 0; while (1) { do_vread(fd, buf, 512); // modified by mingxuan 2019-5-21 if (buf[0] == 0) { if (i == 0) printf(" need not unpack the file.\n"); break; } i++; struct posix_tar_header *phdr = (struct posix_tar_header *)buf; /* calculate the file size */ char *p = phdr->size; int f_len = 0; while (*p) f_len = (f_len * 8) + (*p++ - '0'); /* octal */ int bytes_left = f_len; char full_name[30] = "orange/"; strcat(full_name, phdr->name); int fdout = do_vopen(full_name, O_CREAT | O_RDWR); // modified by mingxuan 2019-5-20 if (fdout == -1) { printf(" failed to extract file: %s\n", phdr->name); printf(" aborted]\n"); do_vclose(fd); // modified by mingxuan 2019-5-20 return; } printf(" %s \n", phdr->name); // deleted by mingxuan 2019-5-22 while (bytes_left) { int iobytes = min(chunk, bytes_left); do_vread(fd, buf, ((iobytes - 1) / 512 + 1) * 512); // modified by mingxuan 2019-5-21 do_vwrite(fdout, buf, iobytes); // modified by mingxuan 2019-5-21 bytes_left -= iobytes; } do_vclose(fdout); // modified by mingxuan 2019-5-20 } if (i) { do_vlseek(fd, 0, SEEK_SET); // modified by mingxuan 2019-5-20 buf[0] = 0; do_vwrite(fd, buf, 1); // modified by mingxuan 2019-5-20 } do_vclose(fd); // modified by mingxuan 2019-5-21 printf(" done, %d files extracted]\n", i); } void initial() { int stdin = do_vopen("dev_tty0", O_RDWR); int stdout = do_vopen("dev_tty0", O_RDWR); int stderr = do_vopen("dev_tty0", O_RDWR); // untar(INSTALL_FILENAME); // modified by mingxuan 2019-5-21 char full_name[30] = "orange/"; ; printf("untar:%s\n", full_name); strcat(full_name, INSTALL_FILENAME); untar(full_name); do_vclose(stdin); do_vclose(stdout); do_vclose(stderr); // exec("orange/shell_1.bin"); exec("orange/test.bin"); while (1) ; }