File: dump.c

package info (click to toggle)
cim 3.36-4
  • links: PTS
  • area: main
  • in suites: woody
  • size: 2,964 kB
  • ctags: 2,750
  • sloc: ansic: 25,286; sh: 7,612; yacc: 873; perl: 781; makefile: 155
file content (215 lines) | stat: -rw-r--r-- 5,667 bytes parent folder | download
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
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
/* $Id: $ */

/* Copyright (C) 1997 Sverre Hvammen Johansen,
 * Department of Informatics, University of Oslo.
 *
 * This program is free software; you can redistribute it and/or modify
 * it under the terms of the GNU General Public License as published by
 * the Free Software Foundation; version 2.
 *
 * This program is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 * GNU General Public License for more details.
 *
 * You should have received a copy of the GNU General Public License
 * along with this program; if not, write to the Free Software
 * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
 */

#include "config.h"

#if DUMP
#ifdef FIRST_DATA_LOCATION

#include "cim.h"
#include <stdio.h>

extern __start_data_segment;
#if HAVE_FCNTL_H
#include <fcntl.h>
#else
#include <sys/file.h>
#endif

/******************************************************************************
                                                       DUMP & UNDUMP         */

/*  Disse prosedyrene kan n}es fra simula ved kall p} Dump og Undump.	
 *  Disse gir mulighet for } lagre en tilstand til en simulakj|ring til fil,
 *  for senere } laste tilstanden inn igjen med undump. For at dette skal g}
 *  bra m} man passe p} at alle filer untatt sysin og sysout er lukket.	
 *  ]pne filer er ikke noe problem for dump, men etter undump s}
 *  starter systemet i en tilstand hvor den tror at et antall filer	
 *  er }pne. Det kan kanskje g} bra hvis de samme filene ogs} var	
 *  }pne f|r kall p} undump, men man m} da v{re sv{rt n|ye med rekkef|lgen
 *  disse filene er }pnet, slik at riktig fildeskriptor blir		
 *  assosiert til riktig fil etter undump.				
 *				
 *  Syntaksen p} dump-filen er som f|lger:    				
 *  Filen starter med to linjer der det p} f|rste linje st}r "/\*Cim_dump*\/".
 *  P} andre linje er det skrevet adressen til |vre kanten p} data-segmentet.
 *  Nedre del av datasegmentet finnes					
 *  ved } ta adressen til variabelen __start_data_segment,		
 *  som er en initialisert variabel som er deklarert f|rst i main-modul	
 *  Deretter kommer innholdet av selve data-segmentet byte for byte,	
 *  men slik at null byte er pakket: For hver ^@ p} filen angir neste	
 *  byte antallet null byte pluss en.			
 *  Deretter f|lger sekvensen "\377\376\375" ... "^c^b^a".		
 *  Til slutt er det fylt opp med bytes opp til en full blokkst|rrelse.	
 *  Disse bytene er en n|yaktig kopi av de i forrige blokk.		
 *  Blokkst|rrelsen er satt til 4096 bytes */

#define DUMP_STR "/*Cim_dump*/\n%12d\n"
#define DUMP_STR_LEN 26
#define DUMP_BUFFER_SIZE 4096

__rdump (t, ret, mret)
     __txtvp t;
     int ret;
     void (*mret) ();
{
  char s[DUMP_BUFFER_SIZE];
  long sp,
    p,
    anull = 0;
  char c;
  long f,
    first_loc = FIRST_DATA_LOCATION,
    last_loc = (long) ((char *) sbrk (0) + 4);
  __goto.ent = ret;
  __goto.ment = mret;
  __rgbc ();
  if ((f = open (__rcopytexttoc (t), O_WRONLY | O_CREAT | O_TRUNC, 0700)) 
      == EOF)
    {
      __rwarning ("Dump: Not possible to open dump-file");
      return;
    }
  sprintf (s, DUMP_STR, last_loc);
  sp = DUMP_STR_LEN;
  for (p = first_loc; p < last_loc;)
    {
      c = *(char *) p;
      if (anull)
	if (c != '\0' || anull == 256)
	  {
	    c = (char) (anull - 1);
	    anull = 0;
	  }
	else
	  {
	    anull++;
	    p++;
	    continue;
	  }
      else
	{
	  if (c == '\0')
	    anull++;
	  p++;
	}
      s[sp++] = c;
      if (sp == DUMP_BUFFER_SIZE)
	{
	  if (write (f, s, DUMP_BUFFER_SIZE) == EOF)
	    {
	      __rwarning ("Dump: Error on writing to dump-file");
	      close (f);
	      return;
	    }
	  sp = 0;
	}
    }
  if (anull)
    s[sp++] = (char) (anull - 1);
  for (c = '\377'; c != '\0'; c--)
    {
      if (sp == DUMP_BUFFER_SIZE)
	{
	  if (write (f, s, DUMP_BUFFER_SIZE) == EOF)
	    {
	      __rwarning ("Dump: Error on writing to dump-file");
	      close (f);
	      return;
	    }
	  sp = 0;
	}
      s[sp++] = c;
    }
  if (write (f, s, DUMP_BUFFER_SIZE) == EOF)
    __rwarning ("Dump: Error on writing to dump-file");
  close (f);
}

__rundump (t, ret, mret)
     __txtvp t;
     int ret;
     void (*mret) ();
{

  char s[DUMP_BUFFER_SIZE];
  long sp,
    p,
    skriv_nuller = __FALSE;
  char c;
  long f,
    first_loc = FIRST_DATA_LOCATION,
    last_loc;
  if ((f = open (__rcopytexttoc (t), O_RDONLY, 0)) == EOF)
    __rerror ("Rundump: Not possible to open dump-file");
  if (read (f, s, DUMP_BUFFER_SIZE) < 0)
    __rerror ("Rundump: Error while reading from dump-file");
  if (sscanf (s, DUMP_STR, &last_loc) < 0)
    __rerror ("Rundump: Illegal format on dump-file");
  brk (last_loc);
  sp = DUMP_STR_LEN;
  for (p = first_loc; p < last_loc;)
    {
      if (sp == DUMP_BUFFER_SIZE)
	{
	  if (read (f, s, DUMP_BUFFER_SIZE) == EOF)
	    __rerror ("Rundump: Error while reading from dump-file");
	  sp = 0;
	}
      c = s[sp++];

      if (skriv_nuller)
	{
	  char i;
	  for (i = '\0'; i != c; i++)
	    {
	      *(char *) p = '\0';
	      p++;
	      if (p == last_loc)
		__rerror ("Rundump: Dump-file don't match data-region");
	    }
	  *(char *) p = '\0';
	  p++;
	  skriv_nuller = __FALSE;
	}
      else if (c == '\0')
	skriv_nuller = __TRUE;
      else
	{
	  *(char *) p = c;
	  p++;
	}
    }
  for (c = '\377'; c != '\0'; c--)
    {
      if (sp == DUMP_BUFFER_SIZE)
	{
	  if (read (f, s, DUMP_BUFFER_SIZE) == EOF)
	    __rerror ("Rundump: Error while reading from dump-file");
	  sp = 0;
	}
      if (s[sp++] != c)
	__rerror ("Rundump: Dump-file don't match data-region");
    }

  close (f);
}

#endif
#endif