CGR Localization
 All Classes Namespaces Files Functions Variables Macros Pages
proghelp.cc
1 #include <sys/resource.h>
2 #include <sys/time.h>
3 #include <sys/types.h>
4 #include <signal.h>
5 #include <stdio.h>
6 #include <stdlib.h>
7 #include <string.h>
8 #include <unistd.h>
9 
10 #include "timer.h"
11 
12 #include "proghelp.h"
13 
14 
15 static bool *enable_run;
16 static int grace_time;
17 
18 
19 size_t CopyFile(FILE *source,FILE *dest)
20 {
21  char buf[256];
22  size_t len, total=0;
23 
24  while((len = fread(buf,sizeof(char),256,source)) > 0){
25  fwrite(buf,sizeof(char),len,dest);
26  total += len;
27  }
28 
29  return(total);
30 }
31 
32 void HandleStop(int i)
33 // Signal handler for breaks (Ctrl-C)
34 {
35  // clear running flag, and set up alarm in case we've hung
36  alarm(grace_time);
37  if(enable_run) *enable_run = false;
38 }
39 
40 void HandleAlarm(int i)
41 // Signal handler that forces an exit when the code hangs on Ctrl-C
42 {
43  exit(0);
44 }
45 
46 void InitHandleStop(bool *_enable_run,int _grace_time)
47 {
48  enable_run = _enable_run;
49  grace_time = (_grace_time > 0)? _grace_time : 1;
50 
51  // Connect the stop signals
52  signal(SIGINT,HandleStop);
53  signal(SIGALRM,HandleAlarm);
54 }
55 
56 bool Renice(int nice,bool verbose)
57 {
58  int old_prio = getpriority(PRIO_PROCESS,0);
59  setpriority(PRIO_PROCESS,0,nice);
60  int new_prio = getpriority(PRIO_PROCESS,0);
61 
62  if(verbose && new_prio!=old_prio){
63  printf("renice: %d -> %d\n",old_prio,new_prio);
64  }
65  return(new_prio == nice);
66 }
67 
68 void GetDateStr(CharString &date)
69 {
70  struct tm cur;
71  GetDate(cur);
72  date.printf("%04d%02d%02d-%02d%02d",
73  1900+cur.tm_year, cur.tm_mon+1, cur.tm_mday,
74  cur.tm_hour, cur.tm_min);
75 }
76 
77 bool SetTimerInterrupt(unsigned int interval, void (*callback)(int))
78 {
79  struct itimerval value, ovalue, pvalue;
80  struct sigaction sact;
81 
82  value.it_interval.tv_sec = 0;
83  value.it_interval.tv_usec = interval;
84  value.it_value.tv_sec = 0;
85  value.it_value.tv_usec = interval;
86 
87  sigemptyset( &sact.sa_mask );
88  sact.sa_flags = 0;
89  sact.sa_handler = callback;
90  sigaction( SIGALRM, &sact, NULL );
91 
92  getitimer( ITIMER_REAL, &pvalue );
93  setitimer( ITIMER_REAL, &value, &ovalue );
94 
95  if( ovalue.it_interval.tv_sec != pvalue.it_interval.tv_sec ||
96  ovalue.it_interval.tv_usec != pvalue.it_interval.tv_usec ||
97  ovalue.it_value.tv_sec != pvalue.it_value.tv_sec ||
98  ovalue.it_value.tv_usec != pvalue.it_value.tv_usec ){
99  return false;
100  }
101  return true;
102 }
103 
104 void CancelTimerInterrupts()
105 {
106  struct itimerval value;
107  int whichTimer = ITIMER_REAL;
108  getitimer( whichTimer, &value );
109  value.it_value.tv_sec = 0;
110  value.it_value.tv_usec = 0;
111  setitimer( whichTimer, &value, NULL );
112 }