void option_case(char *name, int opt) { t_data e; char **buf; if (opt != 2 && opt != 1) put_usage_error("./fdf"); open_check(name); buf = get_data(name); e.opt = opt; if (opt == 1) { e.para = 0; e.iso = 1; } if (opt == 2) { e.para = 1; e.iso = 0; } e.y_max = nb_lines(buf); e.x_max = nb_points(buf, e.y_max); e.data = read_map(buf, e.x_max, e.y_max); e.cal_data = NULL; init_t_m(&e); create_img(&e); free_tab(&e); }
static void rec_file(int msgid, int msglisten, const char *filename, const char *newfile, int wrflag) { int status = sta_chk, ret; struct msg_st msg; pid_t pid; pid = getpid(); msg.msg_pthd = (pthread_t)0; /*避免信号来时,误传给server一个不存在的线程号*/ while (!stop) switch (status) { case sta_chk: if ((msg_fp = open_check(msgid, msglisten, filename, newfile, wrflag, &msg)) == NULL) { status = sta_err; } else { status = sta_rd; } break; case sta_err: fprintf(stderr, "check file %s failed: %s\n", filename, msg.content); status = sta_ter; break; case sta_ter: stop = 1; break; case sta_rd: if (msgrcv(msgid, &msg, sizeof(msg) - sizeof(long), pid, 0) < 0){ status = sta_err; } else if (msg.msg_len == 0) { status = sta_ter; } else { status = sta_wr; } break; case sta_wr: if ((ret = write_data(&msg, msg_fp)) == 0) { status = sta_rd; } else { fprintf(stderr, "fwrite to %s failed, error code: %d\n ", newfile, ret); status = sta_ter; } break; default: status = sta_ter; break; } if (msg_fp != NULL) fclose(msg_fp); if (msg.msg_pthd != (pthread_t)0) { msg.mtype = STP; msg.msg_identify = pid; while (msgsnd(msglisten, &msg, sizeof(msg) - sizeof(long), 0) < 0) if (errno != EINTR) break; } return; }
int main(int argc, char **argv) { int fd; char *p; char buf[256]; signal(SIGUSR1, sighandler); fd = open_check(argv[1], O_RDWR, 0644); p = mmap_check((void *)0x700000000000, 0x202*PS, PROTECTION, MAP_SHARED, fd, 0); buf[0] = p[0]; buf[1] = p[PS]; buf[2] = p[PS*0x10]; buf[3] = p[PS*0x11]; buf[4] = p[PS*0x200]; buf[5] = p[PS*0x201]; pause(); return 0; }
int main (int argc, char **argv) { int ret = 0; int fd; char *filename; char rbuf[PS]; if (argc != 2) { printf("Usage: %s filename\n", argv[0]); exit(EXIT_FAILURE); } filename = argv[1]; signal(SIGUSR1, sighandler); fd = open_check(filename, O_RDWR, 0); pause(); if (pread(fd, rbuf, PS, 0) < 0) { perror("read"); ret = 1; } close_check(fd); return ret; }
int main(int argc, char *argv[]) { int fd; int sem; int nrpages = 1; int ret = 0; int tmp = 0; int offset = 0; char c; char *filename; char *actype; char *onerror; char *p; pid_t pid; int wait_status; uint64_t pflag; struct sembuf sembuf; struct pagestat pgstat; if (argc != 5) { printf("Usage: %s filename nrpages accesstype onerror\n", argv[0]); exit(EXIT_FAILURE); } filename = argv[1]; nrpages = strtol(argv[2], NULL, 10); actype = argv[3]; onerror = argv[4]; DEB("filename = %s, nrpages = %d, actype = %s, onerror = %s\n", filename, nrpages, actype, onerror); if (strcmp(onerror, "onerror") == 0) offset = 0; else offset = PS; sem = create_and_init_semaphore(); fd = open_check(filename, O_RDWR, 0); tmp = pread(fd, rbuf, nrpages*PS, 0); DEB("parent first read %d [%c,%c]\n", tmp, rbuf[0], rbuf[PS]); get_semaphore(sem, &sembuf); if ((pid = fork()) == 0) { get_semaphore(sem, &sembuf); /* wait parent to dirty page */ p = mmap_check((void *)REFADDR, nrpages * PS, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (p != (void *)REFADDR) err("mmap"); if (nrpages == 1) { DEB("child read (after dirty) [%c]\n", p[0]); #ifdef DEBUG get_pagestat(p, &pgstat); #endif } else { DEB("child read (after dirty) [%c,%c]\n", p[0], p[PS]); #ifdef DEBUG get_pagestat(p, &pgstat); get_pagestat(p+PS, &pgstat); #endif } DEB("child hwpoison to vaddr %p\n", p); madvise(&p[0], PS, 100); /* hwpoison */ put_semaphore(sem, &sembuf); get_semaphore(sem, &sembuf); DEB("child terminated\n"); put_semaphore(sem, &sembuf); get_pflags(pgstat.pfn, &pflag, 1); exit(EXIT_SUCCESS); } else { DEB("parent dirty\n"); usleep(1000); memset(wbuf, 49, nrpages * PS); pwrite(fd, wbuf, nrpages * PS, 0); tmp = pread(fd, rbuf, nrpages * PS, 0); DEB("parent second read (after dirty) %d [%c,%c]\n", tmp, rbuf[0], rbuf[PS]); put_semaphore(sem, &sembuf); /* kick child to inject error */ get_semaphore(sem, &sembuf); /* pagecache should be hwpoison */ DEB("parent check\n"); if (strcmp(actype, "read") == 0) { tmp = pread(fd, rbuf, PS, offset); if (tmp < 0) DEB("parent first read failed.\n"); tmp = pread(fd, rbuf, PS, offset); DEB("parent read after hwpoison %d [%c,%c]\n", tmp, rbuf[0], rbuf[PS]); if (tmp < 0) { ret = -1; perror("read"); } else { ret = 0; } } else if (strcmp(actype, "writefull") == 0) { memset(wbuf, 50, nrpages * PS); tmp = pwrite(fd, wbuf, PS, offset); tmp = pwrite(fd, wbuf, PS, offset); DEB("parent write after hwpoison %d\n", tmp); if (tmp < 0) { ret = -1; perror("writefull"); } else { ret = 0; } } else if (strcmp(actype, "writepart") == 0) { memset(wbuf, 50, nrpages * PS); tmp = pwrite(fd, wbuf, PS / 2, offset); tmp = pwrite(fd, wbuf, PS / 2, offset); DEB("parent write after hwpoison %d\n", tmp); if (tmp < 0) { ret = -1; perror("writefull"); } else { ret = 0; } } else if (strcmp(actype, "fsync") == 0) { ret = fsync(fd); ret = fsync(fd); DEB("parent fsync after hwpoison [ret %d]\n", ret); if (ret) perror("fsync"); } else if (strcmp(actype, "sync_range_write") == 0) { ret = sync_file_range(fd, offset, PS, SYNC_FILE_RANGE_WRITE); ret = sync_file_range(fd, offset, PS, SYNC_FILE_RANGE_WRITE); if (ret) perror("sync_range_write"); } else if (strcmp(actype, "sync_range_wait") == 0) { ret = sync_file_range(fd, offset, PS, SYNC_FILE_RANGE_WAIT_BEFORE); ret = sync_file_range(fd, offset, PS, SYNC_FILE_RANGE_WAIT_BEFORE); if (ret) perror("sync_range_wait"); } else if (strcmp(actype, "mmapread") == 0) { /* * If mmap access failed, this program should be * terminated by segmentation fault with non-zero * returned value. So we don't set ret here. */ p = mmap_check((void *)REFADDR, nrpages * PS, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (p != (void *)REFADDR) err("mmap"); c = p[offset]; DEB("parent mmap() read after hwpoison [%c]\n", p[offset]); } else if (strcmp(actype, "mmapwrite") == 0) { p = mmap_check((void *)REFADDR, nrpages * PS, PROT_READ|PROT_WRITE, MAP_SHARED, fd, 0); if (p != (void *)REFADDR) err("mmap"); memset(&p[offset], 50, PS); DEB("parent mmap() write after hwpoison [%c]\n", p[offset]); } } put_semaphore(sem, &sembuf); waitpid(pid, &wait_status, 0); if (!WIFEXITED(wait_status)) err("waitpid"); delete_semaphore(sem); DEB("parent exit %d.\n", ret); return ret; }