passenger 3.0.9 → 3.0.10

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of passenger might be problematic. Click here for more details.

Files changed (67) hide show
  1. data/NEWS +32 -0
  2. data/Rakefile +1 -1
  3. data/build/common_library.rb +6 -1
  4. data/build/config.rb +3 -1
  5. data/doc/Users guide Apache.html +120 -39
  6. data/doc/Users guide Apache.txt +64 -0
  7. data/doc/Users guide Nginx.html +50 -2
  8. data/doc/Users guide Nginx.txt +29 -0
  9. data/ext/apache2/Bucket.cpp +7 -5
  10. data/ext/apache2/Bucket.h +2 -1
  11. data/ext/apache2/Configuration.cpp +8 -0
  12. data/ext/apache2/Configuration.hpp +9 -5
  13. data/ext/apache2/HelperAgent.cpp +4 -5
  14. data/ext/apache2/Hooks.cpp +1 -6
  15. data/ext/boost/thread/exceptions.hpp +7 -1
  16. data/ext/boost/thread/locks.hpp +11 -11
  17. data/ext/common/AgentBase.cpp +21 -1
  18. data/ext/common/AgentsStarter.hpp +22 -21
  19. data/ext/common/ApplicationPool/Client.h +0 -8
  20. data/ext/common/ApplicationPool/Server.h +22 -21
  21. data/ext/common/Constants.h +1 -1
  22. data/ext/common/EventedMessageServer.h +6 -2
  23. data/ext/common/IniFile.h +4 -4
  24. data/ext/common/Logging.h +1 -1
  25. data/ext/common/LoggingAgent/LoggingServer.h +2 -2
  26. data/ext/common/LoggingAgent/Main.cpp +2 -2
  27. data/ext/common/MessageChannel.h +20 -62
  28. data/ext/common/MessageReadersWriters.h +4 -4
  29. data/ext/common/MessageServer.h +18 -18
  30. data/ext/common/Process.h +4 -5
  31. data/ext/common/Session.h +6 -40
  32. data/ext/common/SpawnManager.h +20 -25
  33. data/ext/common/Utils.cpp +1 -1
  34. data/ext/common/Utils/Dechunker.h +1 -1
  35. data/ext/common/Utils/MessageIO.h +109 -14
  36. data/ext/common/Utils/StreamBoyerMooreHorspool.h +20 -14
  37. data/ext/common/Utils/VariantMap.h +9 -27
  38. data/ext/common/Watchdog.cpp +53 -42
  39. data/ext/libev/config.h +122 -0
  40. data/ext/nginx/Configuration.c +62 -0
  41. data/ext/nginx/Configuration.h +5 -0
  42. data/ext/nginx/ContentHandler.c +46 -19
  43. data/ext/nginx/HelperAgent.cpp +6 -5
  44. data/ext/nginx/config +12 -12
  45. data/ext/oxt/system_calls.cpp +10 -1
  46. data/ext/ruby/extconf.rb +0 -1
  47. data/ext/ruby/passenger_native_support.c +2 -2
  48. data/helper-scripts/prespawn +1 -1
  49. data/lib/phusion_passenger.rb +4 -4
  50. data/lib/phusion_passenger/classic_rails/application_spawner.rb +2 -2
  51. data/lib/phusion_passenger/dependencies.rb +6 -1
  52. data/lib/phusion_passenger/platform_info.rb +9 -0
  53. data/lib/phusion_passenger/platform_info/compiler.rb +5 -0
  54. data/lib/phusion_passenger/platform_info/operating_system.rb +1 -1
  55. data/lib/phusion_passenger/platform_info/ruby.rb +5 -5
  56. data/lib/phusion_passenger/rack/application_spawner.rb +6 -3
  57. data/lib/phusion_passenger/utils.rb +2 -2
  58. data/lib/phusion_passenger/wsgi/application_spawner.rb +1 -1
  59. data/resources/mime.types +2 -0
  60. data/test/cxx/LoggingTest.cpp +10 -12
  61. data/test/cxx/MessageIOTest.cpp +53 -3
  62. data/test/cxx/MessageReadersWritersTest.cpp +5 -2
  63. data/test/cxx/MessageServerTest.cpp +3 -1
  64. data/test/integration_tests/nginx_tests.rb +14 -1
  65. data/test/stub/rack/config.ru +2 -0
  66. data/test/tut/tut.h +9 -3
  67. metadata +5 -4
@@ -67,7 +67,7 @@
67
67
  * information. The section 'Reuse' explains why this is important.
68
68
  *
69
69
  * 2. Allocate a StreamBMH_Occ structure somewhere.
70
- * This structure contains the Boyer-Moore-Horspool occurrance table. The secion
70
+ * This structure contains the Boyer-Moore-Horspool occurrance table. The section
71
71
  * 'Reuse' explains why this is important.
72
72
  *
73
73
  * 3. Initialize both structures with sbmh_init(). The structures are now usable for
@@ -231,8 +231,10 @@ struct StreamBMH {
231
231
 
232
232
  /***** Internal fields, do not access. *****/
233
233
  sbmh_size_t lookbehind_size;
234
- // Algorithm uses at most needle_len - 1 bytes of space in lookbehind buffer.
235
- unsigned char lookbehind[];
234
+ /* After this field comes a 'lookbehind' field whose size is determined
235
+ * by the allocator (e.g. SBMH_ALLOC_AND_INIT).
236
+ * Algorithm uses at most needle_len - 1 bytes of space in lookbehind buffer.
237
+ */
236
238
  };
237
239
 
238
240
  #define SBMH_SIZE(needle_len) (sizeof(struct StreamBMH) + (needle_len) - 1)
@@ -256,6 +258,9 @@ struct StreamBMH {
256
258
  #define SBMH_DEBUG2(format, arg1, arg2) do { /* nothing */ } while (false)
257
259
  #endif
258
260
 
261
+ /* Accessor for the lookbehind field. */
262
+ #define _SBMH_LOOKBEHIND(ctx) ((unsigned char *) ctx + sizeof(struct StreamBMH))
263
+
259
264
 
260
265
  inline void
261
266
  sbmh_reset(struct StreamBMH *restrict ctx) {
@@ -300,7 +305,7 @@ sbmh_lookup_char(const struct StreamBMH *restrict ctx,
300
305
  const unsigned char *restrict data, ssize_t pos)
301
306
  {
302
307
  if (pos < 0) {
303
- return ctx->lookbehind[ctx->lookbehind_size + pos];
308
+ return _SBMH_LOOKBEHIND(ctx)[ctx->lookbehind_size + pos];
304
309
  } else {
305
310
  return data[pos];
306
311
  }
@@ -346,10 +351,11 @@ sbmh_feed(struct StreamBMH *restrict ctx, const struct StreamBMH_Occ *restrict o
346
351
  ssize_t pos = -ctx->lookbehind_size;
347
352
  unsigned char last_needle_char = needle[needle_len - 1];
348
353
  const sbmh_size_t *occ = occtable->occ;
354
+ unsigned char *lookbehind = _SBMH_LOOKBEHIND(ctx);
349
355
 
350
356
  if (pos < 0) {
351
357
  SBMH_DEBUG2("[sbmh] considering lookbehind: (%s)(%s)\n",
352
- std::string((const char *) ctx->lookbehind, ctx->lookbehind_size).c_str(),
358
+ std::string((const char *) lookbehind, ctx->lookbehind_size).c_str(),
353
359
  std::string((const char *) data, len).c_str());
354
360
 
355
361
  /* Lookbehind buffer is not empty. Perform Boyer-Moore-Horspool
@@ -374,7 +380,7 @@ sbmh_feed(struct StreamBMH *restrict ctx, const struct StreamBMH_Occ *restrict o
374
380
  ctx->found = true;
375
381
  ctx->lookbehind_size = 0;
376
382
  if (pos > -ctx->lookbehind_size && ctx->callback != NULL) {
377
- ctx->callback(ctx, ctx->lookbehind,
383
+ ctx->callback(ctx, lookbehind,
378
384
  ctx->lookbehind_size + pos);
379
385
  }
380
386
  SBMH_DEBUG1("[sbmh] found using lookbehind; end = %d\n",
@@ -408,7 +414,7 @@ sbmh_feed(struct StreamBMH *restrict ctx, const struct StreamBMH_Occ *restrict o
408
414
  /* Discard lookbehind buffer. */
409
415
  SBMH_DEBUG("[sbmh] no match; discarding lookbehind\n");
410
416
  if (ctx->callback != NULL) {
411
- ctx->callback(ctx, ctx->lookbehind, ctx->lookbehind_size);
417
+ ctx->callback(ctx, lookbehind, ctx->lookbehind_size);
412
418
  }
413
419
  ctx->lookbehind_size = 0;
414
420
  } else {
@@ -420,21 +426,21 @@ sbmh_feed(struct StreamBMH *restrict ctx, const struct StreamBMH_Occ *restrict o
420
426
 
421
427
  if (bytesToCutOff > 0 && ctx->callback != NULL) {
422
428
  // The cut off data is guaranteed not to contain the needle.
423
- ctx->callback(ctx, ctx->lookbehind, bytesToCutOff);
429
+ ctx->callback(ctx, lookbehind, bytesToCutOff);
424
430
  }
425
431
 
426
- memmove(ctx->lookbehind,
427
- ctx->lookbehind + bytesToCutOff,
432
+ memmove(lookbehind,
433
+ lookbehind + bytesToCutOff,
428
434
  ctx->lookbehind_size - bytesToCutOff);
429
435
  ctx->lookbehind_size -= bytesToCutOff;
430
436
 
431
437
  assert(ssize_t(ctx->lookbehind_size + len) < ssize_t(needle_len));
432
- memcpy(ctx->lookbehind + ctx->lookbehind_size,
438
+ memcpy(lookbehind + ctx->lookbehind_size,
433
439
  data, len);
434
440
  ctx->lookbehind_size += len;
435
441
 
436
442
  SBMH_DEBUG1("[sbmh] update lookbehind -> (%s)\n",
437
- std::string((const char *) ctx->lookbehind, ctx->lookbehind_size).c_str());
443
+ std::string((const char *) lookbehind, ctx->lookbehind_size).c_str());
438
444
  return len;
439
445
  }
440
446
  }
@@ -484,11 +490,11 @@ sbmh_feed(struct StreamBMH *restrict ctx, const struct StreamBMH_Occ *restrict o
484
490
  pos++;
485
491
  }
486
492
  if (size_t(pos) < len) {
487
- memcpy(ctx->lookbehind, data + pos, len - pos);
493
+ memcpy(lookbehind, data + pos, len - pos);
488
494
  ctx->lookbehind_size = len - pos;
489
495
  SBMH_DEBUG2("[sbmh] adding %d trailing bytes to lookbehind -> (%s)\n",
490
496
  int(len - pos),
491
- std::string((const char *) ctx->lookbehind,
497
+ std::string((const char *) lookbehind,
492
498
  ctx->lookbehind_size).c_str());
493
499
  }
494
500
  }
@@ -30,9 +30,9 @@
30
30
  #include <sys/types.h>
31
31
  #include <map>
32
32
  #include <string>
33
- #include "MessageChannel.h"
34
- #include "Exceptions.h"
35
- #include "Utils/StrIntUtils.h"
33
+ #include <Exceptions.h>
34
+ #include <Utils/StrIntUtils.h>
35
+ #include <Utils/MessageIO.h>
36
36
 
37
37
  namespace Passenger {
38
38
 
@@ -130,30 +130,17 @@ public:
130
130
  }
131
131
 
132
132
  /**
133
- * Populates a VariantMap from the data in <em>fd</em>. MessageChannel
133
+ * Populates a VariantMap from the data in <em>fd</em>. MessageIO
134
134
  * is used to read from the file descriptor.
135
135
  *
136
136
  * @throws SystemException
137
137
  * @throws IOException
138
- * @see <tt>readFrom(MessageChannel &)</tt>
139
138
  */
140
139
  void readFrom(int fd) {
141
- MessageChannel channel(fd);
142
- readFrom(channel);
143
- }
144
-
145
- /**
146
- * Populates a VariantMap from the data in <em>channel</em>. The first
147
- * message in the channel must be a message as sent by writeToChannel().
148
- *
149
- * @throws SystemException
150
- * @throws IOException
151
- */
152
- void readFrom(MessageChannel &channel) {
153
140
  TRACE_POINT();
154
141
  vector<string> args;
155
142
 
156
- if (!channel.read(args)) {
143
+ if (!readArrayMessage(fd, args)) {
157
144
  throw IOException("Unexpected end-of-file encountered");
158
145
  }
159
146
  if (args.size() == 0) {
@@ -308,19 +295,14 @@ public:
308
295
  return store.size();
309
296
  }
310
297
 
311
- void writeToFd(int fd) const {
312
- MessageChannel channel(fd);
313
- writeToChannel(channel);
314
- }
315
-
316
298
  /**
317
299
  * Writes a representation of the contents in this VariantMap to
318
- * the given channel. The data can be unserialized with
319
- * <tt>readFrom(MessageChannel &)</tt>.
300
+ * the given file descriptor with MessageIO. The data can be
301
+ * unserialized with <tt>readFrom(fd)</tt>.
320
302
  *
321
303
  * @throws SystemException
322
304
  */
323
- void writeToChannel(MessageChannel &channel) const {
305
+ void writeToFd(int fd) const {
324
306
  map<string, string>::const_iterator it;
325
307
  map<string, string>::const_iterator end = store.end();
326
308
  vector<string> args;
@@ -331,7 +313,7 @@ public:
331
313
  args.push_back(it->first);
332
314
  args.push_back(it->second);
333
315
  }
334
- channel.write(args);
316
+ writeArrayMessage(fd, args);
335
317
  }
336
318
 
337
319
  string inspect() const {
@@ -38,23 +38,23 @@
38
38
  #include <cstring>
39
39
  #include <cerrno>
40
40
 
41
- #include "Constants.h"
42
- #include "AgentBase.h"
43
- #include "ServerInstanceDir.h"
44
- #include "FileDescriptor.h"
45
- #include "MessageChannel.h"
46
- #include "Constants.h"
47
- #include "RandomGenerator.h"
48
- #include "Logging.h"
49
- #include "Exceptions.h"
50
- #include "StaticString.h"
51
- #include "ResourceLocator.h"
52
- #include "Utils.h"
53
- #include "Utils/Base64.h"
54
- #include "Utils/Timer.h"
55
- #include "Utils/ScopeGuard.h"
56
- #include "Utils/IOUtils.h"
57
- #include "Utils/VariantMap.h"
41
+ #include <Constants.h>
42
+ #include <AgentBase.h>
43
+ #include <ServerInstanceDir.h>
44
+ #include <FileDescriptor.h>
45
+ #include <Constants.h>
46
+ #include <RandomGenerator.h>
47
+ #include <Logging.h>
48
+ #include <Exceptions.h>
49
+ #include <StaticString.h>
50
+ #include <ResourceLocator.h>
51
+ #include <Utils.h>
52
+ #include <Utils/Base64.h>
53
+ #include <Utils/Timer.h>
54
+ #include <Utils/ScopeGuard.h>
55
+ #include <Utils/IOUtils.h>
56
+ #include <Utils/MessageIO.h>
57
+ #include <Utils/VariantMap.h>
58
58
 
59
59
  using namespace std;
60
60
  using namespace boost;
@@ -107,9 +107,10 @@ private:
107
107
  int status, e;
108
108
 
109
109
  while (!this_thread::interruption_requested()) {
110
- lock.lock();
111
- pid = this->pid;
112
- lock.unlock();
110
+ {
111
+ lock_guard<boost::mutex> l(lock);
112
+ pid = this->pid;
113
+ }
113
114
 
114
115
  // Process can be started before the watcher thread is launched.
115
116
  if (pid == 0) {
@@ -132,9 +133,10 @@ private:
132
133
  e = errno;
133
134
  }
134
135
 
135
- lock.lock();
136
- this->pid = 0;
137
- lock.unlock();
136
+ {
137
+ lock_guard<boost::mutex> l(lock);
138
+ this->pid = 0;
139
+ }
138
140
 
139
141
  this_thread::disable_interruption di;
140
142
  this_thread::disable_syscall_interruption dsi;
@@ -287,12 +289,12 @@ public:
287
289
  }
288
290
 
289
291
  /**
290
- * Send the started agent process's startup information over the given channel,
291
- * to the starter process. May throw arbitrary exceptions.
292
+ * Send the started agent process's startup information over the given
293
+ * file descriptor, to the starter process. May throw arbitrary exceptions.
292
294
  *
293
295
  * @pre start() has been called and succeeded.
294
296
  */
295
- virtual void sendStartupInfo(MessageChannel &channel) = 0;
297
+ virtual void sendStartupInfo(int fd) = 0;
296
298
 
297
299
  /** Returns the name of the agent that this class is watching. */
298
300
  virtual const char *name() const = 0;
@@ -332,7 +334,8 @@ public:
332
334
  /* Something went wrong, report error through feedback fd. */
333
335
  e = errno;
334
336
  try {
335
- MessageChannel(fds[1]).write("system error before exec",
337
+ writeArrayMessage(fds[1],
338
+ "system error before exec",
336
339
  "dup2() failed",
337
340
  toString(e).c_str(),
338
341
  NULL);
@@ -362,8 +365,10 @@ public:
362
365
  }
363
366
  e = errno;
364
367
  try {
365
- MessageChannel(FEEDBACK_FD).write("exec error",
366
- toString(e).c_str(), NULL);
368
+ writeArrayMessage(FEEDBACK_FD,
369
+ "exec error",
370
+ toString(e).c_str(),
371
+ NULL);
367
372
  } catch (...) {
368
373
  fprintf(stderr, "Passenger Watchdog: could not execute %s: %s (%d)\n",
369
374
  exeFilename.c_str(), strerror(e), e);
@@ -400,7 +405,7 @@ public:
400
405
 
401
406
  // Now read its feedback.
402
407
  try {
403
- ret = MessageChannel(feedbackFd).read(args);
408
+ ret = readArrayMessage(feedbackFd, args);
404
409
  } catch (const SystemException &e) {
405
410
  if (e.code() == ECONNRESET) {
406
411
  ret = false;
@@ -612,8 +617,9 @@ public:
612
617
  messageSocketPassword = randomGenerator->generateByteString(MESSAGE_SERVER_MAX_PASSWORD_SIZE);
613
618
  }
614
619
 
615
- virtual void sendStartupInfo(MessageChannel &channel) {
616
- channel.write("HelperAgent info",
620
+ virtual void sendStartupInfo(int fd) {
621
+ writeArrayMessage(fd,
622
+ "HelperAgent info",
617
623
  requestSocketFilename.c_str(),
618
624
  Base64::encode(requestSocketPassword).c_str(),
619
625
  messageSocketFilename.c_str(),
@@ -660,8 +666,9 @@ public:
660
666
  agentFilename = resourceLocator.getAgentsDir() + "/PassengerLoggingAgent";
661
667
  }
662
668
 
663
- virtual void sendStartupInfo(MessageChannel &channel) {
664
- channel.write("LoggingServer info",
669
+ virtual void sendStartupInfo(int fd) {
670
+ writeArrayMessage(fd,
671
+ "LoggingServer info",
665
672
  loggingAgentAddress.c_str(),
666
673
  loggingAgentPassword.c_str(),
667
674
  NULL);
@@ -980,7 +987,6 @@ main(int argc, char *argv[]) {
980
987
  randomGenerator = new RandomGenerator();
981
988
  errorEvent = new EventFd();
982
989
 
983
- MessageChannel feedbackChannel(FEEDBACK_FD);
984
990
  serverInstanceDir.reset(new ServerInstanceDir(webServerPid, tempDir));
985
991
  generation = serverInstanceDir->newGeneration(userSwitching, defaultUser,
986
992
  defaultGroup, webServerWorkerUid, webServerWorkerGid);
@@ -1012,8 +1018,10 @@ main(int argc, char *argv[]) {
1012
1018
  try {
1013
1019
  (*it)->start();
1014
1020
  } catch (const std::exception &e) {
1015
- feedbackChannel.write("Watchdog startup error",
1016
- e.what(), NULL);
1021
+ writeArrayMessage(FEEDBACK_FD,
1022
+ "Watchdog startup error",
1023
+ e.what(),
1024
+ NULL);
1017
1025
  forceAllAgentsShutdown(watchers);
1018
1026
  return 1;
1019
1027
  }
@@ -1023,24 +1031,27 @@ main(int argc, char *argv[]) {
1023
1031
  try {
1024
1032
  (*it)->startWatching();
1025
1033
  } catch (const std::exception &e) {
1026
- feedbackChannel.write("Watchdog startup error",
1027
- e.what(), NULL);
1034
+ writeArrayMessage(FEEDBACK_FD,
1035
+ "Watchdog startup error",
1036
+ e.what(),
1037
+ NULL);
1028
1038
  forceAllAgentsShutdown(watchers);
1029
1039
  return 1;
1030
1040
  }
1031
1041
  // Allow other exceptions to propagate and crash the watchdog.
1032
1042
  }
1033
1043
 
1034
- feedbackChannel.write("Basic startup info",
1044
+ writeArrayMessage(FEEDBACK_FD,
1045
+ "Basic startup info",
1035
1046
  serverInstanceDir->getPath().c_str(),
1036
1047
  toString(generation->getNumber()).c_str(),
1037
1048
  NULL);
1038
1049
 
1039
1050
  for (it = watchers.begin(); it != watchers.end(); it++) {
1040
- (*it)->sendStartupInfo(feedbackChannel);
1051
+ (*it)->sendStartupInfo(FEEDBACK_FD);
1041
1052
  }
1042
1053
 
1043
- feedbackChannel.write("All agents started", NULL);
1054
+ writeArrayMessage(FEEDBACK_FD, "All agents started", NULL);
1044
1055
 
1045
1056
  this_thread::disable_interruption di;
1046
1057
  this_thread::disable_syscall_interruption dsi;
@@ -0,0 +1,122 @@
1
+ /* config.h. Generated from config.h.in by configure. */
2
+ /* config.h.in. Generated from configure.ac by autoheader. */
3
+
4
+ /* Define to 1 if you have the `clock_gettime' function. */
5
+ /* #undef HAVE_CLOCK_GETTIME */
6
+
7
+ /* "use syscall interface for clock_gettime" */
8
+ /* #undef HAVE_CLOCK_SYSCALL */
9
+
10
+ /* Define to 1 if you have the <dlfcn.h> header file. */
11
+ #define HAVE_DLFCN_H 1
12
+
13
+ /* Define to 1 if you have the `epoll_ctl' function. */
14
+ /* #undef HAVE_EPOLL_CTL */
15
+
16
+ /* Define to 1 if you have the `eventfd' function. */
17
+ /* #undef HAVE_EVENTFD */
18
+
19
+ /* Define to 1 if you have the `inotify_init' function. */
20
+ /* #undef HAVE_INOTIFY_INIT */
21
+
22
+ /* Define to 1 if you have the <inttypes.h> header file. */
23
+ #define HAVE_INTTYPES_H 1
24
+
25
+ /* Define to 1 if you have the `kqueue' function. */
26
+ #define HAVE_KQUEUE 1
27
+
28
+ /* Define to 1 if you have the `m' library (-lm). */
29
+ #define HAVE_LIBM 1
30
+
31
+ /* Define to 1 if you have the `rt' library (-lrt). */
32
+ /* #undef HAVE_LIBRT */
33
+
34
+ /* Define to 1 if you have the <memory.h> header file. */
35
+ #define HAVE_MEMORY_H 1
36
+
37
+ /* Define to 1 if you have the `nanosleep' function. */
38
+ /* #undef HAVE_NANOSLEEP */
39
+
40
+ /* Define to 1 if you have the `poll' function. */
41
+ #define HAVE_POLL 1
42
+
43
+ /* Define to 1 if you have the <poll.h> header file. */
44
+ #define HAVE_POLL_H 1
45
+
46
+ /* Define to 1 if you have the `port_create' function. */
47
+ /* #undef HAVE_PORT_CREATE */
48
+
49
+ /* Define to 1 if you have the <port.h> header file. */
50
+ /* #undef HAVE_PORT_H */
51
+
52
+ /* Define to 1 if you have the `select' function. */
53
+ #define HAVE_SELECT 1
54
+
55
+ /* Define to 1 if you have the `signalfd' function. */
56
+ /* #undef HAVE_SIGNALFD */
57
+
58
+ /* Define to 1 if you have the <stdint.h> header file. */
59
+ #define HAVE_STDINT_H 1
60
+
61
+ /* Define to 1 if you have the <stdlib.h> header file. */
62
+ #define HAVE_STDLIB_H 1
63
+
64
+ /* Define to 1 if you have the <strings.h> header file. */
65
+ #define HAVE_STRINGS_H 1
66
+
67
+ /* Define to 1 if you have the <string.h> header file. */
68
+ #define HAVE_STRING_H 1
69
+
70
+ /* Define to 1 if you have the <sys/epoll.h> header file. */
71
+ /* #undef HAVE_SYS_EPOLL_H */
72
+
73
+ /* Define to 1 if you have the <sys/eventfd.h> header file. */
74
+ /* #undef HAVE_SYS_EVENTFD_H */
75
+
76
+ /* Define to 1 if you have the <sys/event.h> header file. */
77
+ #define HAVE_SYS_EVENT_H 1
78
+
79
+ /* Define to 1 if you have the <sys/inotify.h> header file. */
80
+ /* #undef HAVE_SYS_INOTIFY_H */
81
+
82
+ /* Define to 1 if you have the <sys/queue.h> header file. */
83
+ #define HAVE_SYS_QUEUE_H 1
84
+
85
+ /* Define to 1 if you have the <sys/select.h> header file. */
86
+ #define HAVE_SYS_SELECT_H 1
87
+
88
+ /* Define to 1 if you have the <sys/signalfd.h> header file. */
89
+ /* #undef HAVE_SYS_SIGNALFD_H */
90
+
91
+ /* Define to 1 if you have the <sys/stat.h> header file. */
92
+ #define HAVE_SYS_STAT_H 1
93
+
94
+ /* Define to 1 if you have the <sys/types.h> header file. */
95
+ #define HAVE_SYS_TYPES_H 1
96
+
97
+ /* Define to 1 if you have the <unistd.h> header file. */
98
+ #define HAVE_UNISTD_H 1
99
+
100
+ /* Name of package */
101
+ #define PACKAGE "libev"
102
+
103
+ /* Define to the address where bug reports for this package should be sent. */
104
+ #define PACKAGE_BUGREPORT ""
105
+
106
+ /* Define to the full name of this package. */
107
+ #define PACKAGE_NAME ""
108
+
109
+ /* Define to the full name and version of this package. */
110
+ #define PACKAGE_STRING ""
111
+
112
+ /* Define to the one symbol short name of this package. */
113
+ #define PACKAGE_TARNAME ""
114
+
115
+ /* Define to the version of this package. */
116
+ #define PACKAGE_VERSION ""
117
+
118
+ /* Define to 1 if you have the ANSI C header files. */
119
+ #define STDC_HEADERS 1
120
+
121
+ /* Version number of package */
122
+ #define VERSION "3.9"