summaryrefslogtreecommitdiff
path: root/tools/hi-test.c
blob: e2626cca9a0d665cadf897dbde3c7d30443ec98e (plain)
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

#include <iostream>
#include <stdlib.h>
#include <string>
#include <signal.h>

#include <stdio.h>              /* perror() */

using namespace std;

// exit codes, compatible with spamassassin (not with qmail-queue)
const int sa_good(0);
const int sa_spam(1);
const int sa_usage(64);

////////////////
// little utility to help with argument parsing:
//
int prefix(const string shorter, const string longer){
  return shorter == longer.substr(0, shorter.length());
}

void exeunt(const int sts){
  if (sts == sa_good) exit(sts);

  const char* foo = getenv("HI_Q_GROUP");
  if (!foo) exit(sts);

// No point in signalling ourself:
  sighandler_t rslt = signal(SIGUSR1, SIG_IGN);
  if (rslt == SIG_ERR) {
    cerr << "error setting signal" << endl;
  }
  int k = kill(-atoi(foo), SIGUSR1);
  if (k) {
    cerr << "kill failed on group " << atoi(foo) << " ... ";
    perror(0);
  }
  exit(sts);
}

using namespace std;

string progname;

void dump(const string var){
  char* str = getenv(var.c_str());
  cerr << progname << ": " << var;
  if (str) cerr << " is set to '" << str << "'" << endl;
  else  cerr << " is not set." << endl;
}

void countsome(const int unit){
    char buf[3000];
    int total(0);
    for (;;) {
      int rslt = read(unit, buf, sizeof(buf));
      if (rslt <= 0) break;
      total += rslt;
    }
    cerr << "read " << total << " bytes from unit " << unit << endl;
}

int main(int _argc, const char** _argv){
  int snooze(0);
  int status(0);
  int killmode(0);
  int countmode(0);
  int argc(_argc);
  const char **argv(_argv);
  progname = *argv; argv++; argc--;

  while (argc) {
    string arg(*argv); argv++; argc--;
    if (arg.substr(0,2) == "--") arg = arg.substr(1);
    if (prefix(arg, "-help")) {
//      usage(0);
    }
    if (prefix(arg, "-snooze")) {
      if (!argc) {
        cerr << "Option -snooze requires an argument" << endl;
        exit(sa_usage);
      }
      snooze = atoi(*argv); argv++; argc--;
      continue;
    }
    if (prefix(arg, "-exit")) {
      if (!argc) {
        cerr << "Option -exit requires an argument" << endl;
        exit(sa_usage);
      }
      status = atoi(*argv); argv++; argc--;
      continue;
    }
    if (prefix(arg, "-kill")) {
      killmode++;
      continue;
    }
    if (prefix(arg, "-count")) {
      countmode++;
      continue;
    }
    if (arg.substr(0,1) == "x") {
      continue;
    }
    if (arg.substr(0,1) == "-") {
      cerr << "Unrecognized option '" << arg << "'" << endl;
      cerr << "For help, try:  " << progname << " -help" << endl;
      exit(sa_usage);
    } else {
      cerr << "Extraneous verbiage '" << arg << "'" << endl;
      cerr << "For help, try:  " << progname << " -help" << endl;
      exit(sa_usage);
    }
  }
  
  cerr << "++++ hi-test pid: " << getpid() << "  group: " << getpgid(0);
  char* foo = getenv("HI_Q_GROUP");
  if (foo) cerr << " HI_Q_GROUP: " << foo;
  cerr << endl;
  sleep(snooze);
  if (countmode) {
    countsome(0);
    countsome(1);
  }
  if (killmode) exeunt(status);
  exit(status);
}