-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathrestart.c
112 lines (95 loc) · 2.61 KB
/
restart.c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<sys/stat.h>
#include<fcntl.h>
#include<sys/mman.h>
#include<unistd.h>
#include<assert.h>
#include<ucontext.h>
#define NAME_LEN 80
struct proc_maps_line {
char *start;
char *end;
char rwxp[4];
int read, write, execute; // Not used in this versoin of the code
char name[NAME_LEN]; // for debutting only
int is_register_context; //for register context only
int data_size;
};
void read_file(){
char *filename="ckpt.dat";
int fd;
fd=open(filename,O_RDONLY);
if (fd ==-1) {perror("open");}
struct proc_maps_line segment;
int i;
int rc=-2;
int segmentsize=sizeof(struct proc_maps_line);
while ( rc !=0 && rc != EOF){
rc=0;
while ( rc<segmentsize ){
rc+=read(fd,&segment,segmentsize);
//printf("value of rc %d", rc);
if (rc==-1){
perror("read");
exit(1);}
if ( rc == EOF || rc==0 ){
break;
}
if ( segment.is_register_context == 0) {
/*printf("%s (%c%c%c) %d %d\n"
" Address-range: %p - %p\n",
segment.name,
segment.rwxp[0], segment.rwxp[1], segment.rwxp[2],
segment.is_register_context,
segment.data_size,
segment.start, segment.end);
*/
FILE* fp=fdopen(fd,"r");
/* Now I should read data from here */
void *addr=mmap( segment.start , segment.data_size, PROT_READ | PROT_WRITE | PROT_EXEC ,
MAP_FIXED | MAP_ANONYMOUS | MAP_PRIVATE, -1, 0);
int byte_count=0;
//fseek( fp, segment.data_size, SEEK_CUR);
while ( byte_count < segment.data_size ){
byte_count += read( fd, addr + byte_count, segment.data_size - byte_count);
}
int len=ftell(fp);
//printf("Current File location %d\n",len);
}
else if (segment.is_register_context==1){
/*reading register context */
//printf(" %s %d \n",segment.name ,segment.is_register_context);
FILE* fp=fdopen(fd,"r");
int len=ftell(fp);
//printf("Current File location before reading register %d\n",len);
/* Reading Old Register */
//printf("Reading Old Register Values \n");
ucontext_t context;
//read(fd,&old_registers,sizeof(sigjmp_buf));
int byte_count=0;
while ( byte_count < sizeof ( context ) ){
byte_count += read( fd, &context + byte_count, sizeof( context )- byte_count);
}
len=ftell(fp);
//printf("Current File location after reading registers %d\n",len);
setcontext( &context );
}
}}}
void restore(){
struct proc_maps_line segment;
int segmentsize = sizeof (struct proc_maps_line);
int i = 0;
read_file();
}
void recursive(int levels){
if (levels>0){
recursive(levels-1);
}else{
restore();
}
}
int main(int argc, char *argv[]){
recursive(100000);
}