NEURON
audit.cpp
Go to the documentation of this file.
1 #include <../../nrnconf.h>
2 #include <stdio.h>
3 #include <stdlib.h>
4 #include <string.h>
5 #include <hocdec.h>
6 #include "hocassrt.h"
7 
8 
9 static int doaudit;
10 static FILE* faudit;
11 static FILE* audit_pipe;
12 
13 typedef struct RetrieveAudit {
14  int mode;
15  int id;
16  FILE* pipe;
18 
20 
21 static void pipesend(int type, const char *s);
22 
23 /*
24 Notes:
25 
26 The goal is to support easy reconstruction of a simulation while realizing
27 that the user may not know whether to save the information til she sees
28 something that she feels is worth saving. If he does want to save then
29 a saveaudit() command is issued.
30 
31 RCS checking of files
32 In order to not delay the main process while managing rcs files (deciding
33 whether a file needs to be checked in with rcsdiff and ci) we merely
34 send the file name through a pipe to another process which will asynchronously
35 maintain a list of xopen statements with the proper rcs version number.
36 */
37 
38 #define AUDIT_SCRIPT_DIR "$NEURONHOME/lib/auditscripts"
39 #define AUDIT_DIR "AUDIT"
40 
41 
42 static void hoc_audit_init(void) {
43 #if !OCSMALL
44  if (retrieve_audit.mode) {
45  /* clean up. there must have been an execerror */
46  retrieve_audit.mode = 0;
47  retrieve_audit.id = 0;
48  if (retrieve_audit.pipe) {
49  pclose(retrieve_audit.pipe);
50  retrieve_audit.pipe = (FILE*)0;
51  }
52  }
53 #endif
54 }
55 
56 void hoc_audit_from_hoc_main1(int argc, const char **argv, const char **envp)
57 {
58 #if !OCSMALL
59  /*ARGSUSED*/
60  int i;
61  char buf[200];
62 
64 
65 #if 0
66  if (getenv("HOCAUDIT")) {
67  doaudit = 1;
68  printf("auditing\n");
69  }else{
70  doaudit = 0;
71  printf("no auditing\n");
72  }
73 #endif
74 
75  if (!doaudit) {
76  return;
77  }
78  /* since file open for entire session will have to make the name unique*/
79  sprintf(buf, "if [ ! -d %s ] ; then mkdir %s ; fi", AUDIT_DIR, AUDIT_DIR);
80  nrn_assert(system(buf) >= 0);
81  sprintf(buf, "mkdir %s/%d", AUDIT_DIR, hoc_pid());
82  nrn_assert(system(buf) >= 0);
83  sprintf(buf, "%s/hocaudit.sh %d %s", AUDIT_SCRIPT_DIR, hoc_pid(), AUDIT_DIR);
84  if ((audit_pipe = popen(buf, "w")) == (FILE*)0) {
85  hoc_warning("Could not connect to hocaudit.sh via pipe:", buf);
86  doaudit = 0;
87  return;
88  }
89  if (hoc_saveaudit() == 0) {
90  return;
91  }
92  fprintf(faudit, "/*\n");
93  for (i=0; i < argc; ++i) {
94  fprintf(faudit, " %s", argv[i]);
95  }
96  fprintf(faudit, "\n*/\n");
97  fflush(faudit);
98  for (i=1; i < argc; ++i) {
99  if ( argv[i][0] != '-') {
100  fprintf(faudit, "xopen(\"%s\")\n", argv[i]);
101  hoc_audit_from_xopen1(argv[i], (char*)0);
102  }
103  }
104  fprintf(faudit, "\n");
105 #endif
106 }
107 
108 #if !OCSMALL
109 static void pipesend(int type, const char *s)
110 {
111  int err;
112  if (audit_pipe) {
113  err = fprintf(audit_pipe, "%d %s\n", type, s);
114  if (err == EOF) {
115  hoc_warning("auditing failed in pipesend", "turning off");
116  doaudit = 0;
117  audit_pipe = 0;
118  return;
119  }
120  fflush(audit_pipe);
121  }
122 }
123 #endif
124 void hoc_audit_command(const char *buf)
125 {
126 #if !OCSMALL
127  if(doaudit) {
128  fprintf(faudit, "%s", buf);
129  }
130 #endif
131 }
132 
133 void hoc_audit_from_xopen1(const char *fname, const char *rcs)
134 {
135 #if !OCSMALL
136  if (!hoc_retrieving_audit() && doaudit && !rcs) {
137  pipesend(1, fname);
138  }
139 #endif
140 }
141 
143 #if !OCSMALL
144  if (faudit) {
145  fclose(faudit);
146  faudit = 0;
147  }
148  if (audit_pipe) {
150  audit_pipe = 0;
151  }
152  doaudit = 0;
153 #endif
154 }
155 
156 void hoc_Saveaudit(void) {
157  int err;
158 #if !OCSMALL
159  err = hoc_saveaudit();
160 #endif
161  hoc_ret();
162  hoc_pushx((double)err);
163 }
164 
165 int hoc_saveaudit(void) {
166 #if !OCSMALL
167  static int n=0;
168  char buf[200];
169  if (hoc_retrieving_audit() || !doaudit) {
170  return 0;
171  }
172  if (faudit) {
173  fclose(faudit);
174  faudit = 0;
175  sprintf(buf, "hocaudit%d", n);
176  pipesend(3, buf);
177  ++n;
178  }
179  sprintf(buf, "%s/%d/hocaudit%d", AUDIT_DIR, hoc_pid(), n);
180  if ((faudit = fopen(buf, "w")) == (FILE*)0) {
181  hoc_warning("NO audit. fopen failed for:", buf);
182  doaudit = 0;
183  return 0;
184  }
185 #endif
186  return 1;
187 }
188 
190 #if !OCSMALL
191  return retrieve_audit.mode;
192 #else
193  return 0;
194 #endif
195 }
196 
197 void hoc_Retrieveaudit(void) {
198  int err, id;
199 #if !OCSMALL
200  if (ifarg(1)) {
201  id = (int)chkarg(1, 0., 1e7);
202  }else{
203  id = 0;
204  }
205 #endif
206  err = hoc_retrieve_audit(id);
207  hoc_ret();
208  hoc_pushx((double)err);
209 }
210 
211 static void xopen_audit(void) {
212 #if !OCSMALL
213  char buf[200], *bp;
214  strcpy(buf, "rm ");
215  bp = buf + strlen(buf);
216  /* get the temporary file name */
217  nrn_assert(fgets(bp, 200, retrieve_audit.pipe));
218 /*printf("xopen_audit: %s", bp);*/
219  bp[strlen(bp) - 1] = '\0';
220  hoc_xopen1(bp, "");
221 #if 1
222  nrn_assert(system(buf) >= 0);
223 #endif
224 #endif
225 }
226 
227 #ifdef NeXT
228 int hoc_retrieve_audit(int id) /* I have no idea why... CMC */
229 #else
231 
232 #endif
233 {
234 #if !OCSMALL
236  char buf[200];
237  char retdir[200];
238  save = retrieve_audit;
239 /*printf("retrieve audit id=%d\n", id);*/
240  retrieve_audit.mode = 1;
241  retrieve_audit.id = id;
242 
243  sprintf(buf, "%s/retrieve.sh %d %s", AUDIT_SCRIPT_DIR, id, AUDIT_DIR);
244  if ((retrieve_audit.pipe = popen(buf, "r")) == (FILE*)0) {
245  hoc_execerror("Could not connect via pipe:", buf);
246  }
247  nrn_assert(fgets(retdir, 200, retrieve_audit.pipe));
248  xopen_audit();
249  nrn_assert(!fgets(buf, 200, retrieve_audit.pipe));
250 /* pclose(retrieve_audit.pipe);*/
251  retrieve_audit = save;
252  fprintf(stderr, "should now delete %s", retdir);
253 #endif
254  return 1;
255 }
256 
257 void hoc_xopen_from_audit(const char *fname)
258 {
259 #if !OCSMALL
260  char buf[200];
261  /* check the synchronization */
262  nrn_assert(fgets(buf, 200, retrieve_audit.pipe));
263  buf[strlen(buf)-1] = '\0';
264  if(strncmp(buf, fname, strlen(fname)) != 0) {
265 fprintf(stderr, "Warning: xopen_from_audit files have different names %s %s\n", fname, buf);
266  }
267  xopen_audit();
268 #endif
269 }
270 
#define nrn_assert(ex)
Definition: nrnassrt.h:35
short type
Definition: cabvars.h:10
pclose(FILE *p)
Definition: macprt.cpp:107
sprintf(buf," if (secondorder) {\ " int _i;\" " for(_i=0;_i< %d;++_i) {\" " _p[_slist%d[_i]]+=dt *_p[_dlist%d[_i]];\" " }}\", numeqn, listnum, listnum)
int system(const char *s)
Definition: mswinprt.cpp:281
static void xopen_audit(void)
Definition: audit.cpp:211
struct RetrieveAudit RetrieveAudit
static RetrieveAudit retrieve_audit
Definition: audit.cpp:19
void hoc_ret()
void hoc_Retrieveaudit(void)
Definition: audit.cpp:197
int hoc_saveaudit(void)
Definition: audit.cpp:165
void hoc_audit_from_xopen1(const char *fname, const char *rcs)
Definition: audit.cpp:133
FILE * pipe
Definition: audit.cpp:16
int const size_t const size_t n
Definition: nrngsl.h:12
_CONST char * s
Definition: system.cpp:74
FILE * popen(char *s1, char *s2)
Definition: macprt.cpp:102
#define printf
Definition: mwprefix.h:26
int hoc_xopen1(const char *filename, const char *rcs)
Definition: fileio.cpp:229
int
Definition: nrnmusic.cpp:71
void hoc_warning(const char *, const char *)
static const char * fname(const char *name)
Definition: nrnbbs.cpp:108
void hoc_execerror(const char *, const char *)
Definition: hoc.cpp:741
char * getenv(const char *s)
Definition: macprt.cpp:67
fprintf(stderr, "Don't know the location of params at %p\, pp)
int hoc_pid(void)
Definition: hoc.cpp:867
static int doaudit
Definition: audit.cpp:9
int ifarg(int)
Definition: code.cpp:1562
void hoc_on_init_register(Pfrv pf)
Definition: code.cpp:386
void hoc_pushx(double)
void hoc_Saveaudit(void)
Definition: audit.cpp:156
static FILE * faudit
Definition: audit.cpp:10
static double save(void *v)
Definition: ocbox.cpp:340
void hoc_audit_from_hoc_main1(int argc, const char **argv, const char **envp)
Definition: audit.cpp:56
#define AUDIT_SCRIPT_DIR
Definition: audit.cpp:38
static void hoc_audit_init(void)
Definition: audit.cpp:42
#define AUDIT_DIR
Definition: audit.cpp:39
int hoc_retrieve_audit(int id)
Definition: audit.cpp:230
#define i
Definition: md1redef.h:12
void hoc_audit_from_final_exit(void)
Definition: audit.cpp:142
char buf[512]
Definition: init.cpp:13
void hoc_audit_command(const char *buf)
Definition: audit.cpp:124
static int argc
Definition: inithoc.cpp:53
int hoc_retrieving_audit(void)
Definition: audit.cpp:189
FILE * fopen()
void hoc_xopen_from_audit(const char *fname)
Definition: audit.cpp:257
double chkarg(int, double low, double high)
Definition: code2.cpp:608
static char ** argv
Definition: inithoc.cpp:54
static FILE * audit_pipe
Definition: audit.cpp:11
static void pipesend(int type, const char *s)
Definition: audit.cpp:109