mirror of
https://github.com/nodejs/node-v0.x-archive.git
synced 2026-04-28 03:01:10 -04:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1f4e0c02b5 | ||
|
|
7fd1c08b16 |
1
.gitattributes
vendored
1
.gitattributes
vendored
@@ -1 +0,0 @@
|
||||
test/fixtures/* -text
|
||||
35
.gitignore
vendored
35
.gitignore
vendored
@@ -1,10 +1,10 @@
|
||||
core
|
||||
vgcore.*
|
||||
build
|
||||
.waf*
|
||||
tags
|
||||
.lock-wscript
|
||||
*.pyc
|
||||
doc/api.xml
|
||||
tools/nodejs.pc
|
||||
tmp/
|
||||
node
|
||||
node_g
|
||||
@@ -12,34 +12,3 @@ node_g
|
||||
.benchmark_reports
|
||||
/.project
|
||||
/.cproject
|
||||
|
||||
/out
|
||||
|
||||
# various stuff that VC++ produces/uses
|
||||
Debug/
|
||||
Release/
|
||||
!doc/blog/**
|
||||
*.sln
|
||||
!nodemsi.sln
|
||||
*.suo
|
||||
*.vcproj
|
||||
*.vcxproj
|
||||
*.vcxproj.user
|
||||
*.vcxproj.filters
|
||||
UpgradeLog*.XML
|
||||
_UpgradeReport_Files/
|
||||
ipch/
|
||||
*.sdf
|
||||
*.opensdf
|
||||
|
||||
/config.mk
|
||||
/config.gypi
|
||||
*-nodegyp*
|
||||
/gyp-mac-tool
|
||||
/dist-osx
|
||||
/npm.wxs
|
||||
/tools/msvs/npm.wixobj
|
||||
email.md
|
||||
deps/v8-*
|
||||
./node_modules
|
||||
.svn/
|
||||
104
.mailmap
104
.mailmap
@@ -1,104 +0,0 @@
|
||||
Aaron Heckmann <aaron.heckmann@gmail.com> <aaron.heckmann+github@gmail.com>
|
||||
Abe Fettig <abefettig@gmail.com> <abe@fettig.net>
|
||||
Alex Kocharin <rlidwka@kocharin.ru>
|
||||
Alex Kocharin <rlidwka@kocharin.ru> <alex@kocharin.ru>
|
||||
Alexis Sellier <self@cloudhead.net>
|
||||
Alexis Sellier <self@cloudhead.net> <alexis@cloudhead.io>
|
||||
Arlo Breault <arlolra@gmail.com>
|
||||
Artem Zaytsev <a.arepo@gmail.com>
|
||||
Atsuo Fukaya <fukayatsu@gmail.com>
|
||||
Ben Noordhuis <info@bnoordhuis.nl> <bnoordhuis@bender.(none)>
|
||||
Bert Belder <bertbelder@gmail.com> <bert@piscisaureus2.(none)>
|
||||
Bert Belder <bertbelder@gmail.com> <piscisaureus@Berts-MacBook-Pro.local>
|
||||
Brandon Benvie <brandon@bbenvie.com> <brandon@brandonbenvie.com>
|
||||
Brian White <mscdex@mscdex.net>
|
||||
Brian White <mscdex@mscdex.net> <mscdex@gmail.com>
|
||||
Chew Choon Keat <choonkeat@gmail.com>
|
||||
Christopher Lenz <cmlenz@gmail.com> <chris@lamech.local>
|
||||
Daniel Berger <code+node@dpbis.net>
|
||||
Daniel Chcouri <333222@gmail.com>
|
||||
Daniel Gröber <darklord@darkboxed.org>
|
||||
Daniel Gröber <darklord@darkboxed.org> <dxld@darkboxed.org>
|
||||
Daniel Pihlström <sciolist.se@gmail.com>
|
||||
David Siegel <david@artcom.de> <david.siegel@artcom.de>
|
||||
Domenic Denicola <domenic@domenicdenicola.com>
|
||||
Eduard Burtescu <eddy_me08@yahoo.com>
|
||||
Einar Otto Stangvik <einaros@gmail.com>
|
||||
Elliott Cable <me@ell.io>
|
||||
EungJun Yi <semtlenori@gmail.com>
|
||||
Evan Larkin <evan.larkin.il.com> <evan.larkin.iit@gmail.com>
|
||||
Farid Neshat <FaridN_SOAD@yahoo.com>
|
||||
Felix Geisendörfer <felix@debuggable.com>
|
||||
Felix Geisendörfer <felix@debuggable.com>
|
||||
Friedemann Altrock <frodenius@gmail.com>
|
||||
Fuji Goro <gfuji@cpan.org>
|
||||
Gabriel de Perthuis <g2p.code@gmail.com>
|
||||
Herbert Vojčík <herby@mailbox.sk>
|
||||
Igor Zinkovsky <igorzi@microsoft.com>
|
||||
Isaac Z. Schlueter <i@izs.me>
|
||||
Isaac Z. Schlueter <i@izs.me> <i@foohack.com>
|
||||
Jérémy Lal <kapouer@melix.org>
|
||||
Jérémy Lal <kapouer@melix.org> <holisme@gmail.com>
|
||||
Jered Schmidt <tr@nslator.jp>
|
||||
Joe Shaw <joe@joeshaw.org> <joeshaw@litl.com>
|
||||
Johan Bergström <bugs@bergstroem.nu>
|
||||
Johan Dahlberg <jfd@distrop.com> <dahlberg.johan@gmail.com>
|
||||
Jonas Pfenniger <jonas@pfenniger.name> <jonas@stvs.ch>
|
||||
Jonathan Rentzsch <jwr.git@redshed.net>
|
||||
Joshua S. Weinstein <josher19@users.sf.net>
|
||||
Koichi Kobayashi <koichik@improvement.jp>
|
||||
Kris Kowal <kris.kowal@cixar.com>
|
||||
Kyle Robinson Young <kyle@dontkry.com>
|
||||
Mathias Pettersson <mape@mape.me>
|
||||
Michael Bernstein <michaelrbernstein@gmail.com>
|
||||
Michael Wilber <gcr@sneakygcr.net>
|
||||
Micheil Smith <micheil@brandedcode.com> <micheil@yettobebranded.net>
|
||||
Mikael Bourges-Sevenier <mikeseven@gmail.com> <msevenier@motorola.com>
|
||||
Nebu Pookins<nebu@nebupookins.net>
|
||||
Nicholas Kinsey <pyrotechnick@feistystudios.com>
|
||||
Onne Gorter <onne@onnlucky.com>
|
||||
Paul Querna <pquerna@apache.org> <paul@querna.org>
|
||||
Ray Morgan <rmorgan@zappos.com>
|
||||
Ray Solomon <raybsolomon@gmail.com>
|
||||
Rick Olson <technoweenie@gmail.com>
|
||||
Ryan Dahl <ry@tinyclouds.org>
|
||||
Ryan Emery <seebees@gmail.com>
|
||||
Sam Shull <brickysam26@gmail.com> <brickysam26@samuel-shulls-computer.local>
|
||||
Sam Shull <brickysam26@gmail.com> <sshull@squaremouth.com>
|
||||
Sambasiva Suda <sambasivarao@gmail.com>
|
||||
San-Tai Hsu <v@fatpipi.com>
|
||||
Sergey Kryzhanovsky <skryzhanovsky@gmail.com> <another@dhcp199-223-red.yandex.net>
|
||||
Shannen Saez <shannenlaptop@gmail.com>
|
||||
Shigeki Ohtsu <ohtsu@d.jp> <ohtsu@iij.ad.jp>
|
||||
Siddharth Mahendraker <siddharth_mahen@hotmail.com> <siddharth_mahen@me.com>
|
||||
Simon Willison <simon@simonwillison.net>
|
||||
Stanislav Opichal <opichals@gmail.com>
|
||||
Stefan Bühler <stbuehler@web.de>
|
||||
Tadashi SAWADA <cesare@mayverse.jp>
|
||||
Takahiro ANDO <takahiro.ando@gmail.com>
|
||||
Ted Young <ted@radicaldesigns.org>
|
||||
Thomas Lee <thomas.lee@shinetech.com> <tom@tom-debian.sensis.com.au>
|
||||
Tim Caswell <tim@creationix.com> <tim@0-26-8-e9-4c-e1.dyn.utdallas.edu>
|
||||
Tim Smart <timehandgod@gmail.com> <tim@fostle.com>
|
||||
Tim Smart <timehandgod@gmail.com> <timehandgod@gmail.com>
|
||||
TJ Holowaychuk <tj@vision-media.ca>
|
||||
TJ Holowaychuk <tj@vision-media.ca> <tjholowayhuk@gmail.com>
|
||||
Trevor Burnham <trevor@databraid.com> <trevorburnham@gmail.com>
|
||||
Tyler Larson <talltyler@gmail.com>
|
||||
Vincent Voyer <v@fasterize.com>
|
||||
Yoshihiro KIKUCHI <yknetg@gmail.com>
|
||||
Yuichiro MASUI <masui@masuidrive.jp>
|
||||
Zachary Scott <zachary@zacharyscott.net> <zachary.s.scott@gmail.com>
|
||||
Zoran Tomicic <ztomicic@gmail.com>
|
||||
|
||||
# These people didn't contribute patches to node directly,
|
||||
# but we've landed their v8 patches in the node repository:
|
||||
Daniel Clifford <danno@chromium.org>
|
||||
Erik Corry <erik.corry@gmail.com>
|
||||
Jakob Kummerow <jkummerow@chromium.org>
|
||||
Kevin Millikin <kmillikin@chromium.org>
|
||||
Lasse R.H. Nielsen <lrn@chromium.org>
|
||||
Michael Starzinger <mstarzinger@chromium.org>
|
||||
Toon Verwaest <verwaest@chromium.org>
|
||||
Vyacheslav Egorov <vegorov@chromium.org>
|
||||
Yang Guo <yangguo@chromium.org>
|
||||
14
.travis.yml
14
.travis.yml
@@ -1,14 +0,0 @@
|
||||
language: node_js
|
||||
|
||||
before_script:
|
||||
- "./configure"
|
||||
- "make"
|
||||
|
||||
script:
|
||||
- "make test"
|
||||
|
||||
notifications:
|
||||
email: false
|
||||
irc:
|
||||
- "irc.freenode.net#libuv"
|
||||
|
||||
212
AUTHORS
212
AUTHORS
@@ -59,7 +59,7 @@ Arlo Breault <arlolra@gmail.com>
|
||||
Kris Kowal <kris.kowal@cixar.com>
|
||||
Jacek Becela <jacek.becela@gmail.com>
|
||||
Rob Ellis <kazoomer@gmail.com>
|
||||
Tim Smart <timehandgod@gmail.com>
|
||||
Tim Smart <timehAndGod@gmail.com>
|
||||
Herbert Vojčík <herby@mailbox.sk>
|
||||
Krishna Rajendran <krishna@emptybox.org>
|
||||
Nicholas Kinsey <pyrotechnick@feistystudios.com>
|
||||
@@ -98,7 +98,8 @@ Jerome Etienne <jerome.etienne@gmail.com>
|
||||
Dmitriy Shalashov <skaurus@gmail.com>
|
||||
Adam Wiggins <adam@heroku.com>
|
||||
Rick Olson <technoweenie@gmail.com>
|
||||
Sergey Kryzhanovsky <skryzhanovsky@gmail.com>
|
||||
David Siegel <david.siegel@artcom.de>
|
||||
Sergey Kzyzhanovsky <skryzhanovsky@gmail.com>
|
||||
Marco Rogers <marco.rogers@gmail.com>
|
||||
Benjamin Fritsch <beanie@benle.de>
|
||||
Jan Kassens <jan@kassens.net>
|
||||
@@ -143,13 +144,13 @@ Daniel Gröber <darklord@darkboxed.org>
|
||||
Travis Swicegood <development@domain51.com>
|
||||
Oleg Slobodskoi <oleg008@gmail.com>
|
||||
Jeremy Martin <jmar777@gmail.com>
|
||||
Michael Wilber <gcr@sneakygcr.net>
|
||||
Michael W <gcr@sneakygcr.net>
|
||||
Sean Braithwaite <brapse@gmail.com>
|
||||
Anders Conbere <aconbere@gmail.com>
|
||||
Devin Torres <devin@devintorres.com>
|
||||
Theo Schlossnagle <jesus@omniti.com>
|
||||
Kai Chen <kaichenxyz@gmail.com>
|
||||
Daniel Chcouri <333222@gmail.com>
|
||||
Daniel C <333222@gmail.com>
|
||||
Mihai Călin Bazon <mihai@bazon.net>
|
||||
Ali Farhadi <a.farhadi@gmail.com>
|
||||
Daniel Ennis <aikar@aikar.co>
|
||||
@@ -158,231 +159,38 @@ Greg Hughes <greg@ghughes.com>
|
||||
David Trejo <david.daniel.trejo@gmail.com>
|
||||
Joe Walnes <joe@walnes.com>
|
||||
Koichi Kobayashi <koichik@improvement.jp>
|
||||
Daniel Gröber <dxld@darkboxed.org>
|
||||
Konstantin Käfer <github@kkaefer.com>
|
||||
Richard Rodger <richard@ricebridge.com>
|
||||
Andreas Reich <andreas@reich.name>
|
||||
Tony Huang <cnwzhjs@gmail.com>
|
||||
Dean McNamee <dean@gmail.com>
|
||||
Trevor Burnham <trevor@databraid.com>
|
||||
Zachary Scott <zachary@zacharyscott.net>
|
||||
Zachary Scott <zachary.s.scott@gmail.com>
|
||||
Arnout Kazemier <info@3rd-Eden.com>
|
||||
George Stagas <gstagas@gmail.com>
|
||||
Ben Weaver <ben@orangesoda.net>
|
||||
Scott McWhirter <scott.mcwhirter@joyent.com>
|
||||
Jakub Lekstan <jakub.lekstan@dreamlab.pl>
|
||||
Nick Campbell <nicholas.j.campbell@gmail.com>
|
||||
Nebu Pookins <nebu@nebupookins.net>
|
||||
Tim Baumann <tim@timbaumann.info>
|
||||
Robert Mustacchi <rm@joyent.com>
|
||||
George Miroshnykov <george.miroshnykov@gmail.com>
|
||||
Mark Cavage <mark.cavage@joyent.com>
|
||||
Håvard Stranden <havard.stranden@gmail.com>
|
||||
Marcel Laverdet <marcel@laverdet.com>
|
||||
Alexandre Marangone <a.marangone@gmail.com>
|
||||
Mark Cavage <mark.cavage@joyent.com>
|
||||
Ryan Petrello <lists@ryanpetrello.com>
|
||||
Fuji Goro <gfuji@cpan.org>
|
||||
Siddharth Mahendraker <siddharth_mahen@hotmail.com>
|
||||
Dave Pacheco <dap@joyent.com>
|
||||
Mathias Buus <m@ge.tt>
|
||||
Henry Rawas <henryr@schakra.com>
|
||||
Yoshihiro KIKUCHI <yknetg@gmail.com>
|
||||
Brett Kiefer <kiefer@gmail.com>
|
||||
Mariano Iglesias <mariano@cricava.com>
|
||||
Jörn Horstmann <git@jhorstmann.net>
|
||||
Joe Shaw <joe@joeshaw.org>
|
||||
Niklas Fiekas <niklas.fiekas@googlemail.com>
|
||||
Adam Luikart <me@adamluikart.com>
|
||||
Artem Zaytsev <a.arepo@gmail.com>
|
||||
Joe Shaw <joeshaw@litl.com>
|
||||
Alex Xu <alex_y_xu@yahoo.ca>
|
||||
Jeremy Selier <jeremy@jolicloud.com>
|
||||
Igor Zinkovsky <igorzi@microsoft.com>
|
||||
Kip Gebhardt <kip.gebhardt@voxer.com>
|
||||
Stefan Rusu <saltwaterc@gmail.com>
|
||||
Shigeki Ohtsu <ohtsu@d.jp>
|
||||
Wojciech Wnętrzak <w.wnetrzak@gmail.com>
|
||||
Devon Govett <devongovett@gmail.com>
|
||||
Steve Engledow <steve.engledow@proxama.com>
|
||||
Pierre-Alexandre St-Jean <pierrealexandre.stjean@gmail.com>
|
||||
Reid Burke <me@reidburke.com>
|
||||
Vicente Jimenez Aguilar <googuy@gmail.com>
|
||||
Tadashi SAWADA <cesare@mayverse.jp>
|
||||
Jeroen Janssen <jeroen.janssen@gmail.com>
|
||||
Daniel Pihlström <sciolist.se@gmail.com>
|
||||
Stefan Bühler <stbuehler@web.de>
|
||||
Alexander Uvarov <alexander.uvarov@gmail.com>
|
||||
Aku Kotkavuo <aku@hibana.net>
|
||||
Peter Bright <drpizza@quiscalusmexicanus.org>
|
||||
SAWADA Tadashi <cesare@mayverse.jp>
|
||||
Logan Smyth <loganfsmyth@gmail.com>
|
||||
Christopher Wright <christopherwright@gmail.com>
|
||||
Glen Low <glen.low@pixelglow.com>
|
||||
Thomas Shinnick <tshinnic@gmail.com>
|
||||
Mickaël Delahaye <mickael.delahaye@gmail.com>
|
||||
Antranig Basman <antranig.basman@colorado.edu>
|
||||
Maciej Małecki <maciej.malecki@notimplemented.org>
|
||||
Evan Martin <martine@danga.com>
|
||||
Peter Lyons <pete@peterlyons.com>
|
||||
Jann Horn <jannhorn@googlemail.com>
|
||||
Abimanyu Raja <abimanyuraja@gmail.com>
|
||||
Karl Skomski <karl@skomski.com>
|
||||
Niclas Hoyer <niclas@verbugt.de>
|
||||
Michael Jackson <mjijackson@gmail.com>
|
||||
Ashok Mudukutore <ashok@lineratesystems.com>
|
||||
Sean Cunningham <sean.cunningham@mandiant.com>
|
||||
Vitor Balocco <vitorbal@gmail.com>
|
||||
Ben Leslie <benno@benno.id.au>
|
||||
Eric Lovett <etlovett@gmail.com>
|
||||
Christian Tellnes <christian@tellnes.no>
|
||||
Colton Baker <github@netrefuge.net>
|
||||
Tyler Larson <talltyler@gmail.com>
|
||||
Tomasz Janczuk <tomasz@janczuk.org>
|
||||
Ilya Dmitrichenko <errordeveloper@gmail.com>
|
||||
Simen Brekken <simen.brekken@gmail.com>
|
||||
Guglielmo Ferri <44gatti@gmail.com>
|
||||
Thomas Parslow <tom@almostobsolete.net>
|
||||
Ryan Emery <seebees@gmail.com>
|
||||
Jordan Sissel <jls@semicomplete.com>
|
||||
Matt Robenolt <matt@ydekproductions.com>
|
||||
Jacob H.C. Kragh <jhckragh@gmail.com>
|
||||
Benjamin Pasero <benjamin.pasero@gmail.com>
|
||||
Scott Anderson <sanderson7@gmail.com>
|
||||
Yoji SHIDARA <dara@shidara.net>
|
||||
Mathias Bynens <mathias@qiwi.be>
|
||||
Łukasz Walukiewicz <lukasz@walukiewicz.eu>
|
||||
Artur Adib <arturadib@gmail.com>
|
||||
E. Azer Koçulu <azer@kodfabrik.com>
|
||||
Paddy Byers <paddy.byers@gmail.com>
|
||||
Roman Shtylman <shtylman@gmail.com>
|
||||
Kyle Robinson Young <kyle@dontkry.com>
|
||||
Tim Oxley <secoif@gmail.com>
|
||||
Eduard Burtescu <eddy_me08@yahoo.com>
|
||||
Ingmar Runge <ingmar@irsoft.de>
|
||||
Russ Bradberry <rbradberry@gmail.com>
|
||||
Andreas Madsen <amwebdk@gmail.com>
|
||||
Adam Malcontenti-Wilson <adman.com@gmail.com>
|
||||
Avi Flax <avi@aviflax.com>
|
||||
Pedro Teixeira <pedro.teixeira@gmail.com>
|
||||
Johan Bergström <bugs@bergstroem.nu>
|
||||
James Hartig <james.hartig@grooveshark.com>
|
||||
Shannen Saez <shannenlaptop@gmail.com>
|
||||
Seong-Rak Choi <ragiragi@hanmail.net>
|
||||
Dave Irvine <davman99@gmail.com>
|
||||
Ju-yeong Park <interruptz@gmail.com>
|
||||
Phil Sung <psung@dnanexus.com>
|
||||
Damon Oehlman <damon.oehlman@sidelab.com>
|
||||
Mikael Bourges-Sevenier <mikeseven@gmail.com>
|
||||
Emerson Macedo <emerleite@gmail.com>
|
||||
Ryunosuke SATO <tricknotes.rs@gmail.com>
|
||||
Michael Bernstein <michaelrbernstein@gmail.com>
|
||||
Guillermo Rauch <rauchg@gmail.com>
|
||||
Dan Williams <dan@igniter.com>
|
||||
Brandon Benvie <brandon@bbenvie.com>
|
||||
Nicolas LaCasse <nlacasse@borderstylo.com>
|
||||
Dan VerWeire <dverweire@gmail.com>
|
||||
Matthew Fitzsimmons <matt@joyent.com>
|
||||
Philip Tellis <philip.tellis@gmail.com>
|
||||
Christopher Jeffrey <chjjeffrey@gmail.com>
|
||||
Seth Fitzsimmons <seth@mojodna.net>
|
||||
Einar Otto Stangvik <einaros@gmail.com>
|
||||
Paul Vorbach <paul@vorb.de>
|
||||
Luke Gallagher <notfornoone@gmail.com>
|
||||
Tomasz Buchert <tomek.buchert@gmail.com>
|
||||
Myles Byrne <myles@myles.id.au>
|
||||
T.C. Hollingsworth <tchollingsworth@gmail.com>
|
||||
Cam Pedersen <diffference@gmail.com>
|
||||
Roly Fentanes <roly426@gmail.com>
|
||||
Ted Young <ted@radicaldesigns.org>
|
||||
Joshua Holbrook <josh.holbrook@gmail.com>
|
||||
Blake Miner <miner.blake@gmail.com>
|
||||
Vincent Ollivier <contact@vincentollivier.com>
|
||||
Jimb Esser <jimb@railgun3d.com>
|
||||
Sambasiva Suda <sambasivarao@gmail.com>
|
||||
Sadique Ali <sadiqalikm@gmail.com>
|
||||
Dmitry Nizovtsev <dmitry@ukrteam.com>
|
||||
Alex Kocharin <rlidwka@kocharin.ru>
|
||||
Ming Liu <vmliu1@gmail.com>
|
||||
Shea Levy <shea@shealevy.com>
|
||||
Nao Iizuka <iizuka@kyu-mu.net>
|
||||
Christian Ress <christian@ressonline.de>
|
||||
Rod Vagg <rod@vagg.org>
|
||||
Matt Ezell <ezell.matt@gmail.com>
|
||||
Charlie McConnell <charlie@charlieistheman.com>
|
||||
Farid Neshat <FaridN_SOAD@yahoo.com>
|
||||
Johannes Wüller <johanneswueller@gmail.com>
|
||||
Erik Lundin <mjor.himself@gmail.com>
|
||||
Bryan Cantrill <bryan@joyent.com>
|
||||
Yosef Dinerstein <yosefd@microsoft.com>
|
||||
Nathan Friedly <nathan@nfriedly.com>
|
||||
Aaron Jacobs <jacobsa@google.com>
|
||||
Mustansir Golawala <mgolawala@gmail.com>
|
||||
Atsuo Fukaya <fukayatsu@gmail.com>
|
||||
Domenic Denicola <domenic@domenicdenicola.com>
|
||||
Joshua S. Weinstein <josher19@users.sf.net>
|
||||
Dane Springmeyer <dane@dbsgeo.com>
|
||||
Erik Dubbelboer <erik@dubbelboer.com>
|
||||
Malte-Thorben Bruns <skenqbx@googlemail.com>
|
||||
Michael Thomas <aelmalinka@gmail.com>
|
||||
Garen Torikian <gjtorikian@gmail.com>
|
||||
EungJun Yi <semtlenori@gmail.com>
|
||||
Vincent Voyer <v@fasterize.com>
|
||||
Takahiro ANDO <takahiro.ando@gmail.com>
|
||||
Erwin van der Koogh <github@koogh.com>
|
||||
Brian Schroeder <bts@gmail.com>
|
||||
J. Lee Coltrane <lee@projectmastermind.com>
|
||||
Javier Hernández <jhernandez@emergya.com>
|
||||
James Koval <james.ross.koval@gmail.com>
|
||||
Kevin Gadd <kevin.gadd@gmail.com>
|
||||
Ray Solomon <raybsolomon@gmail.com>
|
||||
Kevin Bowman <github@magicmonkey.org>
|
||||
Matt Gollob <mattgollob@gmail.com>
|
||||
Simon Sturmer <sstur@me.com>
|
||||
Joel Brandt <joelrbrandt@gmail.com>
|
||||
Marc Harter <wavded@gmail.com>
|
||||
Nuno Job <nunojobpinto@gmail.com>
|
||||
Ben Kelly <ben@wanderview.com>
|
||||
Felix Böhm <felixboehm55@googlemail.com>
|
||||
Gabriel de Perthuis <g2p.code@gmail.com>
|
||||
Tim Macfarlane <timmacfarlane@gmail.com>
|
||||
Jonas Westerlund <jonas.westerlund@me.com>
|
||||
Dominic Tarr <dominic.tarr@gmail.com>
|
||||
Justin Plock <jplock@gmail.com>
|
||||
Toshihiro Nakamura <toshihiro.nakamura@gmail.com>
|
||||
Ivan Torres <mexpolk@gmail.com>
|
||||
Philipp Hagemeister <phihag@phihag.de>
|
||||
George Shank <shankga@gmail.com>
|
||||
Mike Morearty <mike@morearty.com>
|
||||
Peter Rybin <peter.rybin@gmail.com>
|
||||
Eugen Dueck <eugen@dueck.org>
|
||||
Gil Pedersen <git@gpost.dk>
|
||||
Tyler Neylon <tylerneylon@gmail.com>
|
||||
Golo Roden <webmaster@goloroden.de>
|
||||
Ron Korving <rkorving@wizcorp.jp>
|
||||
Brandon Wilson <chlavois@gmail.com>
|
||||
Bearice Ren <bearice@gmail.com>
|
||||
Ankur Oberoi <aoberoi@gmail.com>
|
||||
Atsuya Takagi <atsuya.takagi@gmail.com>
|
||||
Pooya Karimian <pkarimian@sencha.com>
|
||||
Frédéric Germain <frederic.germain@gmail.com>
|
||||
Robin Lee <cheeselee@fedoraproject.org>
|
||||
Adam Blackburn <regality@gmail.com>
|
||||
Willi Eggeling <email@wje-online.de>
|
||||
Andrew Paprocki <andrew@ishiboo.com>
|
||||
Max Ogden <max@maxogden.com>
|
||||
Olivier Lalonde <olalonde@gmail.com>
|
||||
Francois Marier <francois@mozilla.com>
|
||||
Trevor Norris <trev.norris@gmail.com>
|
||||
Joshua Erickson <josh@snoj.us>
|
||||
Kai Sasaki Lewuathe <sasaki_kai@lewuathe.sakura.ne.jp>
|
||||
Nicolas Chambrier <naholyr@gmail.com>
|
||||
Tim Bradshaw <tfb@cley.com>
|
||||
Johannes Ewald <mail@johannesewald.de>
|
||||
Chris Dent <chris.dent@gmail.com>
|
||||
Dan Milon <danmilon@gmail.com>
|
||||
Jacob Gable <jacob.gable@gmail.com>
|
||||
Rick Yakubowski <richard@orpha-systems.com>
|
||||
Dan Kohn <dan@dankohn.com>
|
||||
Timothy J Fontaine <tjfontaine@gmail.com>
|
||||
Eugene Girshov <eugene.girshov@nixu.com>
|
||||
Raymond Feng <enjoyjava@gmail.com>
|
||||
Tobias Müllerleile <tobias@muellerleile.net>
|
||||
Daniel Chatfield <chatfielddaniel@gmail.com>
|
||||
cjihrig <cjihrig@gmail.com>
|
||||
|
||||
@@ -1,2 +0,0 @@
|
||||
all:
|
||||
@echo "I need GNU make. Please run \`gmake\` instead."
|
||||
97
CMakeLists.txt
Normal file
97
CMakeLists.txt
Normal file
@@ -0,0 +1,97 @@
|
||||
cmake_minimum_required(VERSION 2.6)
|
||||
project(node)
|
||||
|
||||
if(USE_GCOV)
|
||||
set(CMAKE_BUILD_TYPE "Debug")
|
||||
|
||||
# Set global c and c++ flags
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fprofile-arcs -ftest-coverage")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fprofile-arcs -ftest-coverage")
|
||||
|
||||
# Link flags used for creating executables
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -lgcov -fprofile-arcs")
|
||||
|
||||
# Link flags used for creating shared libraries
|
||||
set(CMAKE_SHARED_LINKER_FLAGS "${CMAKE_SHARED_LINKER_FLAGS} -lgcov -profile-arcs")
|
||||
endif()
|
||||
|
||||
#
|
||||
# options
|
||||
#
|
||||
|
||||
find_package(PythonInterp 2 REQUIRED)
|
||||
|
||||
option(SHARED_V8 "use system shared V8 library")
|
||||
option(SHARED_LIBEV "use system shared libev library")
|
||||
option(SHARED_CARES "use system shared c-ares library")
|
||||
option(V8_SNAPSHOT "turn on snapshot when building stock v8")
|
||||
option(V8_OPROFILE "Add oprofile support")
|
||||
option(V8_GDBJIT "add gdbjit support")
|
||||
option(DTRACE "build with DTrace (experimental)")
|
||||
|
||||
# cmake policies to get rid of some warnings
|
||||
cmake_policy(SET CMP0009 NEW) # GLOB_RECURSE should no follow symlinks
|
||||
|
||||
# generic cmake configuration
|
||||
include("cmake/configure.cmake")
|
||||
|
||||
# find and configure libs
|
||||
include("cmake/libs.cmake")
|
||||
|
||||
# setup node build targets
|
||||
include("cmake/node_build.cmake")
|
||||
|
||||
# setup v8 build targets
|
||||
include("cmake/v8_build.cmake")
|
||||
|
||||
# docs
|
||||
## might want to move this to doc/CMakeLists.txt
|
||||
include("cmake/docs.cmake")
|
||||
|
||||
# tests
|
||||
enable_testing()
|
||||
include(CTest)
|
||||
add_subdirectory("test/")
|
||||
|
||||
# package
|
||||
include("cmake/package.cmake")
|
||||
|
||||
|
||||
#
|
||||
# Final build configuration output
|
||||
#
|
||||
|
||||
message("** Build Summary **")
|
||||
message(" Version: ${node_version_string}")
|
||||
message(" Prefix: ${PREFIX}")
|
||||
message(" Build Type: ${CMAKE_BUILD_TYPE}")
|
||||
message(" Architecture: ${CMAKE_SYSTEM_PROCESSOR}")
|
||||
message(" Platform: ${node_platform}")
|
||||
|
||||
if(SHARED_V8)
|
||||
message(" V8: ${V8_LIBRARY_PATH}")
|
||||
#else()
|
||||
#message(" V8 jobs: ${parallel_jobs}")
|
||||
endif()
|
||||
|
||||
if(SHARED_libev)
|
||||
message(" libev: ${LIBEV_LIBRARY}")
|
||||
endif()
|
||||
|
||||
if(SHARED_CARES)
|
||||
message(" libc-ares: ${LIBCARES_LIBRARY}")
|
||||
endif()
|
||||
|
||||
message(" RT library: ${RT}")
|
||||
message(" DL library: ${DL}")
|
||||
|
||||
if(${OPENSSL_FOUND} MATCHES TRUE)
|
||||
message(" OpenSSL: ${OPENSSL_LIBRARIES}")
|
||||
endif()
|
||||
|
||||
if(USE_GCOV)
|
||||
message(" gcov: enabled")
|
||||
endif()
|
||||
|
||||
message(" CCFLAGS: ${CCFLAGS}")
|
||||
message(" CPPFLAGS: ${CPPFLAGS}")
|
||||
145
CONTRIBUTING.md
145
CONTRIBUTING.md
@@ -1,145 +0,0 @@
|
||||
# CONTRIBUTING
|
||||
|
||||
The node.js project welcomes new contributors. This document will guide you
|
||||
through the process.
|
||||
|
||||
|
||||
### FORK
|
||||
|
||||
Fork the project [on GitHub](https://github.com/joyent/node) and check out
|
||||
your copy.
|
||||
|
||||
```
|
||||
$ git clone git@github.com:username/node.git
|
||||
$ cd node
|
||||
$ git remote add upstream git://github.com/joyent/node.git
|
||||
```
|
||||
|
||||
Now decide if you want your feature or bug fix to go into the master branch
|
||||
or the stable branch. As a rule of thumb, bug fixes go into the stable branch
|
||||
while new features go into the master branch.
|
||||
|
||||
The stable branch is effectively frozen; patches that change the node.js
|
||||
API/ABI or affect the run-time behavior of applications get rejected.
|
||||
|
||||
The rules for the master branch are less strict; consult the
|
||||
[stability index page][] for details.
|
||||
|
||||
In a nutshell, modules are at varying levels of API stability. Bug fixes are
|
||||
always welcome but API or behavioral changes to modules at stability level 3
|
||||
and up are off-limits.
|
||||
|
||||
Node.js has several bundled dependencies in the deps/ and the tools/
|
||||
directories that are not part of the project proper. Any changes to files
|
||||
in those directories or its subdirectories should be sent to their respective
|
||||
projects. Do not send your patch to us, we cannot accept it.
|
||||
|
||||
In case of doubt, open an issue in the [issue tracker][], post your question
|
||||
to the [node.js mailing list][] or contact one of the [project maintainers][]
|
||||
on [IRC][].
|
||||
|
||||
Especially do so if you plan to work on something big. Nothing is more
|
||||
frustrating than seeing your hard work go to waste because your vision
|
||||
does not align with that of a project maintainer.
|
||||
|
||||
|
||||
### BRANCH
|
||||
|
||||
Okay, so you have decided on the proper branch. Create a feature branch
|
||||
and start hacking:
|
||||
|
||||
```
|
||||
$ git checkout -b my-feature-branch -t origin/v0.8
|
||||
```
|
||||
|
||||
(Where v0.8 is the latest stable branch as of this writing.)
|
||||
|
||||
|
||||
### COMMIT
|
||||
|
||||
Make sure git knows your name and email address:
|
||||
|
||||
```
|
||||
$ git config --global user.name "J. Random User"
|
||||
$ git config --global user.email "j.random.user@example.com"
|
||||
```
|
||||
|
||||
Writing good commit logs is important. A commit log should describe what
|
||||
changed and why. Follow these guidelines when writing one:
|
||||
|
||||
1. The first line should be 50 characters or less and contain a short
|
||||
description of the change.
|
||||
2. Keep the second line blank.
|
||||
3. Wrap all other lines at 72 columns.
|
||||
|
||||
A good commit log looks like this:
|
||||
|
||||
```
|
||||
Header line: explaining the commit in one line
|
||||
|
||||
Body of commit message is a few lines of text, explaining things
|
||||
in more detail, possibly giving some background about the issue
|
||||
being fixed, etc etc.
|
||||
|
||||
The body of the commit message can be several paragraphs, and
|
||||
please do proper word-wrap and keep columns shorter than about
|
||||
72 characters or so. That way `git log` will show things
|
||||
nicely even when it is indented.
|
||||
```
|
||||
|
||||
The header line should be meaningful; it is what other people see when they
|
||||
run `git shortlog` or `git log --oneline`.
|
||||
|
||||
Have a look at `git log` for inspiration.
|
||||
|
||||
|
||||
### REBASE
|
||||
|
||||
Use `git rebase` (not `git merge`) to sync your work from time to time.
|
||||
|
||||
```
|
||||
$ git fetch upstream
|
||||
$ git rebase upstream/v0.8 # or upstream/master
|
||||
```
|
||||
|
||||
|
||||
### TEST
|
||||
|
||||
Bug fixes and features should come with tests. Add your tests in the
|
||||
test/simple/ directory. Look at other tests to see how they should be
|
||||
structured (license boilerplate, common includes, etc.).
|
||||
|
||||
```
|
||||
$ make jslint test
|
||||
```
|
||||
|
||||
Make sure the linter is happy and that all tests pass. Please, do not submit
|
||||
patches that fail either check.
|
||||
|
||||
|
||||
### PUSH
|
||||
|
||||
```
|
||||
$ git push origin my-feature-branch
|
||||
```
|
||||
|
||||
Go to https://github.com/username/node and select your feature branch. Click
|
||||
the 'Pull Request' button and fill out the form.
|
||||
|
||||
Pull requests are usually reviewed within a few days. If there are comments
|
||||
to address, apply your changes in a separate commit and push that to your
|
||||
feature branch. Post a comment in the pull request afterwards; GitHub does
|
||||
not send out notifications when you add commits.
|
||||
|
||||
|
||||
### CONTRIBUTOR LICENSE AGREEMENT
|
||||
|
||||
Please visit http://nodejs.org/cla.html and sign the Contributor License
|
||||
Agreement. You only need to do that once.
|
||||
|
||||
|
||||
[stability index page]: https://github.com/joyent/node/blob/master/doc/api/documentation.markdown
|
||||
[issue tracker]: https://github.com/joyent/node/issues
|
||||
[node.js mailing list]: http://groups.google.com/group/nodejs
|
||||
[IRC]: http://webchat.freenode.net/?channels=node.js
|
||||
[project maintainers]: https://github.com/joyent/node/wiki/Project-Organization
|
||||
7
CTestConfig.cmake
Normal file
7
CTestConfig.cmake
Normal file
@@ -0,0 +1,7 @@
|
||||
set(CTEST_PROJECT_NAME "node")
|
||||
set(CTEST_NIGHTLY_START_TIME "00:00:00 EST")
|
||||
|
||||
set(CTEST_DROP_METHOD "http")
|
||||
set(CTEST_DROP_SITE "my.cdash.org")
|
||||
set(CTEST_DROP_LOCATION "/submit.php?project=node")
|
||||
set(CTEST_DROP_SITE_CDASH TRUE)
|
||||
595
LICENSE
595
LICENSE
@@ -24,580 +24,45 @@ IN THE SOFTWARE.
|
||||
====
|
||||
|
||||
This license applies to all parts of Node that are not externally
|
||||
maintained libraries. The externally maintained libraries used by Node are:
|
||||
maintained libraries.
|
||||
|
||||
- V8, located at deps/v8. V8's license follows:
|
||||
"""
|
||||
This license applies to all parts of V8 that are not externally
|
||||
maintained libraries. The externally maintained libraries used by V8
|
||||
are:
|
||||
The externally maintained libraries used by Node are:
|
||||
|
||||
- PCRE test suite, located in
|
||||
test/mjsunit/third_party/regexp-pcre.js. This is based on the
|
||||
test suite from PCRE-7.3, which is copyrighted by the University
|
||||
of Cambridge and Google, Inc. The copyright notice and license
|
||||
are embedded in regexp-pcre.js.
|
||||
- v8, located at deps/v8. v8 is copyright Google, Inc, and released
|
||||
under a BSD license.
|
||||
|
||||
- Layout tests, located in test/mjsunit/third_party. These are
|
||||
based on layout tests from webkit.org which are copyrighted by
|
||||
Apple Computer, Inc. and released under a 3-clause BSD license.
|
||||
- libev, located at deps/libev, and libeio, located at deps/libeio. libev
|
||||
and libeio are copyright Marc Alexander Lehmann, and dual-licensed
|
||||
under the MIT license and GPL2.
|
||||
|
||||
- Strongtalk assembler, the basis of the files assembler-arm-inl.h,
|
||||
assembler-arm.cc, assembler-arm.h, assembler-ia32-inl.h,
|
||||
assembler-ia32.cc, assembler-ia32.h, assembler-x64-inl.h,
|
||||
assembler-x64.cc, assembler-x64.h, assembler-mips-inl.h,
|
||||
assembler-mips.cc, assembler-mips.h, assembler.cc and assembler.h.
|
||||
This code is copyrighted by Sun Microsystems Inc. and released
|
||||
under a 3-clause BSD license.
|
||||
- WAF build system, located at tools/waf. WAF is copyright Thomas Nagy,
|
||||
and released under the MIT license.
|
||||
|
||||
- Valgrind client API header, located at third_party/valgrind/valgrind.h
|
||||
This is release under the BSD license.
|
||||
- The SCONS build system, located at tools/scons. SCONS is copyright
|
||||
the SCONS Foundation and released under the MIT license.
|
||||
|
||||
These libraries have their own licenses; we recommend you read them,
|
||||
as their terms may differ from the terms below.
|
||||
- C-Ares, an asynchronous DNS client, located at deps/c-ares. C-Ares is
|
||||
copyright the Massachusetts Institute of Technology, authored by
|
||||
Greg Hudson, Daniel Stenberg and others, and released under the MIT
|
||||
license.
|
||||
|
||||
Copyright 2006-2012, the V8 project authors. All rights reserved.
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
- Node, optionally, dynamically links to OpenSSL, cryptographic software
|
||||
written by Eric Young (eay@cryptsoft.com) to provide SSL/TLS encryption.
|
||||
OpenSSL is copyright The OpenSSL Project and released under the OpenSSL
|
||||
license. OpenSSL is not included in the Node distribution.
|
||||
See http://openssl.org/ for more information.
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
* Neither the name of Google Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived
|
||||
from this software without specific prior written permission.
|
||||
- tools/doctool/markdown.js is copyright 2009-2010 Dominic Baggott and Ash
|
||||
Berli and released under the MIT license.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
- HTTP Parser, located at deps/http_parser, is a small C library
|
||||
copyright Ryan Lienhart Dahl and released under the MIT license.
|
||||
|
||||
- libev, located at deps/uv/src/unix/ev. libev's license follows:
|
||||
"""
|
||||
All files in libev are Copyright (C)2007,2008,2009 Marc Alexander Lehmann.
|
||||
- src/platform_darwin_proctitle.cc, has code taken from the Chromium
|
||||
project copyright Google Inc. and released under a BSD license.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
- tools/closure_linter is copyright The Closure Linter Authors and
|
||||
Google Inc. and released under the Apache License, version 2.0.
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Alternatively, the contents of this package may be used under the terms
|
||||
of the GNU General Public License ("GPL") version 2 or any later version,
|
||||
in which case the provisions of the GPL are applicable instead of the
|
||||
above. If you wish to allow the use of your version of this package only
|
||||
under the terms of the GPL and not to allow others to use your version of
|
||||
this file under the BSD license, indicate your decision by deleting the
|
||||
provisions above and replace them with the notice and other provisions
|
||||
required by the GPL in this and the other files of this package. If you do
|
||||
not delete the provisions above, a recipient may use your version of this
|
||||
file under either the BSD or the GPL.
|
||||
"""
|
||||
|
||||
- libeio, located at deps/uv/src/unix/eio. libeio's license follows:
|
||||
"""
|
||||
All files in libeio are Copyright (C)2007,2008 Marc Alexander Lehmann.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following
|
||||
disclaimer in the documentation and/or other materials provided
|
||||
with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
Alternatively, the contents of this package may be used under the terms
|
||||
of the GNU General Public License ("GPL") version 2 or any later version,
|
||||
in which case the provisions of the GPL are applicable instead of the
|
||||
above. If you wish to allow the use of your version of this package only
|
||||
under the terms of the GPL and not to allow others to use your version of
|
||||
this file under the BSD license, indicate your decision by deleting the
|
||||
provisions above and replace them with the notice and other provisions
|
||||
required by the GPL in this and the other files of this package. If you do
|
||||
not delete the provisions above, a recipient may use your version of this
|
||||
file under either the BSD or the GPL.
|
||||
"""
|
||||
|
||||
- WAF build system, located at tools/waf*. WAF's license follows:
|
||||
"""
|
||||
Copyright Thomas Nagy, 2005-2011
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
3. The name of the author may not be used to endorse or promote products
|
||||
derived from this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE AUTHOR "AS IS" AND ANY EXPRESS OR
|
||||
IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
|
||||
WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||
DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
|
||||
INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
|
||||
(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING
|
||||
IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- C-Ares, an asynchronous DNS client, located at deps/uv/src/ares. C-Ares license
|
||||
follows:
|
||||
"""
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
* notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting
|
||||
* documentation, and that the name of M.I.T. not be used in
|
||||
* advertising or publicity pertaining to distribution of the
|
||||
* software without specific, written prior permission.
|
||||
* M.I.T. makes no representations about the suitability of
|
||||
* this software for any purpose. It is provided "as is"
|
||||
* without express or implied warranty.
|
||||
"""
|
||||
|
||||
- OpenSSL located at deps/openssl. OpenSSL is cryptographic software written
|
||||
by Eric Young (eay@cryptsoft.com) to provide SSL/TLS encryption. OpenSSL's
|
||||
license follows:
|
||||
"""
|
||||
/* ====================================================================
|
||||
* Copyright (c) 1998-2011 The OpenSSL Project. All rights reserved.
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
*
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
*
|
||||
* 3. All advertising materials mentioning features or use of this
|
||||
* software must display the following acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit. (http://www.openssl.org/)"
|
||||
*
|
||||
* 4. The names "OpenSSL Toolkit" and "OpenSSL Project" must not be used to
|
||||
* endorse or promote products derived from this software without
|
||||
* prior written permission. For written permission, please contact
|
||||
* openssl-core@openssl.org.
|
||||
*
|
||||
* 5. Products derived from this software may not be called "OpenSSL"
|
||||
* nor may "OpenSSL" appear in their names without prior written
|
||||
* permission of the OpenSSL Project.
|
||||
*
|
||||
* 6. Redistributions of any form whatsoever must retain the following
|
||||
* acknowledgment:
|
||||
* "This product includes software developed by the OpenSSL Project
|
||||
* for use in the OpenSSL Toolkit (http://www.openssl.org/)"
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE OpenSSL PROJECT ``AS IS'' AND ANY
|
||||
* EXPRESSED OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE OpenSSL PROJECT OR
|
||||
* ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
* SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
|
||||
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
|
||||
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
|
||||
* STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
|
||||
* OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
* ====================================================================
|
||||
*
|
||||
* This product includes cryptographic software written by Eric Young
|
||||
* (eay@cryptsoft.com). This product includes software written by Tim
|
||||
* Hudson (tjh@cryptsoft.com).
|
||||
*
|
||||
*/
|
||||
"""
|
||||
|
||||
- HTTP Parser, located at deps/http_parser. HTTP Parser's license follows:
|
||||
"""
|
||||
http_parser.c is based on src/http/ngx_http_parse.c from NGINX copyright
|
||||
Igor Sysoev.
|
||||
|
||||
Additional changes are licensed under the same terms as NGINX and
|
||||
copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to
|
||||
deal in the Software without restriction, including without limitation the
|
||||
rights to use, copy, modify, merge, publish, distribute, sublicense, and/or
|
||||
sell copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
|
||||
IN THE SOFTWARE.
|
||||
"""
|
||||
|
||||
- Closure Linter is located at tools/closure_linter. Closure's license
|
||||
follows:
|
||||
"""
|
||||
# Copyright (c) 2007, Google Inc.
|
||||
# All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- tools/cpplint.py is a C++ linter. Its license follows:
|
||||
"""
|
||||
# Copyright (c) 2009 Google Inc. All rights reserved.
|
||||
#
|
||||
# Redistribution and use in source and binary forms, with or without
|
||||
# modification, are permitted provided that the following conditions are
|
||||
# met:
|
||||
#
|
||||
# * Redistributions of source code must retain the above copyright
|
||||
# notice, this list of conditions and the following disclaimer.
|
||||
# * Redistributions in binary form must reproduce the above
|
||||
# copyright notice, this list of conditions and the following disclaimer
|
||||
# in the documentation and/or other materials provided with the
|
||||
# distribution.
|
||||
# * Neither the name of Google Inc. nor the names of its
|
||||
# contributors may be used to endorse or promote products derived from
|
||||
# this software without specific prior written permission.
|
||||
#
|
||||
# THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
# "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
# LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
# A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
# OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
# SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
# LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- lib/buffer_ieee754.js. Its license follows:
|
||||
"""
|
||||
// Copyright (c) 2008, Fair Oaks Labs, Inc.
|
||||
// All rights reserved.
|
||||
//
|
||||
// Redistribution and use in source and binary forms, with or without
|
||||
// modification, are permitted provided that the following conditions are met:
|
||||
//
|
||||
// * Redistributions of source code must retain the above copyright notice,
|
||||
// this list of conditions and the following disclaimer.
|
||||
//
|
||||
// * Redistributions in binary form must reproduce the above copyright notice,
|
||||
// this list of conditions and the following disclaimer in the documentation
|
||||
// and/or other materials provided with the distribution.
|
||||
//
|
||||
// * Neither the name of Fair Oaks Labs, Inc. nor the names of its contributors
|
||||
// may be used to endorse or promote products derived from this software
|
||||
// without specific prior written permission.
|
||||
//
|
||||
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
|
||||
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
||||
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
|
||||
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
|
||||
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
|
||||
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
|
||||
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
// POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- lib/punycode.js is copyright 2011 Mathias Bynens <http://mathiasbynens.be/>
|
||||
and released under the MIT license.
|
||||
"""
|
||||
* Punycode.js <http://mths.be/punycode>
|
||||
* Copyright 2011 Mathias Bynens <http://mathiasbynens.be/>
|
||||
* Available under MIT license <http://mths.be/mit>
|
||||
"""
|
||||
|
||||
- tools/gyp. GYP is a meta-build system. GYP's license follows:
|
||||
"""
|
||||
Copyright (c) 2009 Google Inc. All rights reserved.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions are
|
||||
met:
|
||||
|
||||
* Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
* Redistributions in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the following disclaimer
|
||||
in the documentation and/or other materials provided with the
|
||||
distribution.
|
||||
* Neither the name of Google Inc. nor the names of its
|
||||
contributors may be used to endorse or promote products derived from
|
||||
this software without specific prior written permission.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
"AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
|
||||
A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
|
||||
OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
|
||||
SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
|
||||
LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
|
||||
THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
"""
|
||||
|
||||
- Zlib at deps/zlib. zlib's license follows:
|
||||
"""
|
||||
/* zlib.h -- interface of the 'zlib' general purpose compression library
|
||||
version 1.2.4, March 14th, 2010
|
||||
|
||||
Copyright (C) 1995-2010 Jean-loup Gailly and Mark Adler
|
||||
|
||||
This software is provided 'as-is', without any express or implied
|
||||
warranty. In no event will the authors be held liable for any damages
|
||||
arising from the use of this software.
|
||||
|
||||
Permission is granted to anyone to use this software for any purpose,
|
||||
including commercial applications, and to alter it and redistribute it
|
||||
freely, subject to the following restrictions:
|
||||
|
||||
1. The origin of this software must not be misrepresented; you must not
|
||||
claim that you wrote the original software. If you use this software
|
||||
in a product, an acknowledgment in the product documentation would be
|
||||
appreciated but is not required.
|
||||
2. Altered source versions must be plainly marked as such, and must not be
|
||||
misrepresented as being the original software.
|
||||
3. This notice may not be removed or altered from any source distribution.
|
||||
|
||||
Jean-loup Gailly
|
||||
Mark Adler
|
||||
|
||||
*/
|
||||
"""
|
||||
|
||||
- npm is a package manager program located at deps/npm.
|
||||
npm's license follows:
|
||||
"""
|
||||
Copyright 2009-2012, Isaac Z. Schlueter (the "Original Author")
|
||||
All rights reserved.
|
||||
|
||||
MIT +no-false-attribs License
|
||||
|
||||
Permission is hereby granted, free of charge, to any person
|
||||
obtaining a copy of this software and associated documentation
|
||||
files (the "Software"), to deal in the Software without
|
||||
restriction, including without limitation the rights to use,
|
||||
copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the
|
||||
Software is furnished to do so, subject to the following
|
||||
conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be
|
||||
included in all copies or substantial portions of the Software.
|
||||
|
||||
Distributions of all or part of the Software intended to be used
|
||||
by the recipients as they would use the unmodified Software,
|
||||
containing modifications that substantially alter, remove, or
|
||||
disable functionality of the Software, outside of the documented
|
||||
configuration mechanisms provided by the Software, shall be
|
||||
modified such that the Original Author's bug reporting email
|
||||
addresses and urls are either replaced with the contact information
|
||||
of the parties responsible for the changes, or removed entirely.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
|
||||
HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
|
||||
WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
||||
FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
|
||||
OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
Except where noted, this license applies to any and all software
|
||||
programs and associated documentation files created by the
|
||||
Original Author, when distributed with the Software.
|
||||
|
||||
"Node.js" and "node" trademark Joyent, Inc. npm is not officially
|
||||
part of the Node.js project, and is neither owned by nor
|
||||
officially affiliated with Joyent, Inc.
|
||||
|
||||
Packages published in the npm registry are not part of npm
|
||||
itself, are the sole property of their respective maintainers,
|
||||
and are not covered by this license.
|
||||
|
||||
"npm Logo" created by Mathias Pettersson and Brian Hammond,
|
||||
used with permission.
|
||||
|
||||
"Gubblebum Blocky" font
|
||||
Copyright (c) 2007 by Tjarda Koster, http://jelloween.deviantart.com
|
||||
included for use in the npm website and documentation,
|
||||
used with permission.
|
||||
|
||||
This program uses "node-uuid", Copyright (c) 2010 Robert Kieffer,
|
||||
according to the terms of the MIT license.
|
||||
|
||||
This program uses "request", Copyright (c) 2011 Mikeal Rogers,
|
||||
according to the terms of the Apache license.
|
||||
|
||||
This program uses "mkdirp", Copyright (c) 2010 James Halliday,
|
||||
according to the terms of the MIT/X11 license.
|
||||
"""
|
||||
|
||||
- tools/doc/node_modules/marked. Marked is a Markdown parser. Marked's
|
||||
license follows:
|
||||
"""
|
||||
Copyright (c) 2011-2012, Christopher Jeffrey (https://github.com/chjj/)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
in the Software without restriction, including without limitation the rights
|
||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||
copies of the Software, and to permit persons to whom the Software is
|
||||
furnished to do so, subject to the following conditions:
|
||||
|
||||
The above copyright notice and this permission notice shall be included in
|
||||
all copies or substantial portions of the Software.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||
THE SOFTWARE.
|
||||
"""
|
||||
|
||||
- test/gc/node_modules/weak. Node-weak is a node.js addon that provides garbage
|
||||
collector notifications. Node-weak's license follows:
|
||||
"""
|
||||
Copyright (c) 2011, Ben Noordhuis <info@bnoordhuis.nl>
|
||||
|
||||
Permission to use, copy, modify, and/or distribute this software for any
|
||||
purpose with or without fee is hereby granted, provided that the above
|
||||
copyright notice and this permission notice appear in all copies.
|
||||
|
||||
THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
|
||||
WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
|
||||
MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
|
||||
ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
|
||||
WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
|
||||
ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
|
||||
OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
|
||||
"""
|
||||
|
||||
- src/ngx-queue.h. ngx-queue.h is taken from the nginx source tree. nginx's
|
||||
license follows:
|
||||
"""
|
||||
Copyright (C) 2002-2012 Igor Sysoev
|
||||
Copyright (C) 2011,2012 Nginx, Inc.
|
||||
|
||||
Redistribution and use in source and binary forms, with or without
|
||||
modification, are permitted provided that the following conditions
|
||||
are met:
|
||||
1. Redistributions of source code must retain the above copyright
|
||||
notice, this list of conditions and the following disclaimer.
|
||||
2. Redistributions in binary form must reproduce the above copyright
|
||||
notice, this list of conditions and the following disclaimer in the
|
||||
documentation and/or other materials provided with the distribution.
|
||||
|
||||
THIS SOFTWARE IS PROVIDED BY AUTHOR AND CONTRIBUTORS ``AS IS'' AND
|
||||
ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
|
||||
ARE DISCLAIMED. IN NO EVENT SHALL AUTHOR OR CONTRIBUTORS BE LIABLE
|
||||
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
|
||||
OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
|
||||
HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
|
||||
SUCH DAMAGE.
|
||||
"""
|
||||
- tools/cpplint.py is copyright Google Inc. and released under a
|
||||
BSD license.
|
||||
|
||||
312
Makefile
312
Makefile
@@ -1,299 +1,128 @@
|
||||
-include config.mk
|
||||
WAF=python tools/waf-light
|
||||
|
||||
BUILDTYPE ?= Release
|
||||
PYTHON ?= python
|
||||
DESTDIR ?=
|
||||
SIGN ?=
|
||||
web_root = node@nodejs.org:~/web/nodejs.org/
|
||||
|
||||
# Default to verbose builds.
|
||||
# To do quiet/pretty builds, run `make V=` to set V to an empty string,
|
||||
# or set the V environment variable to an empty string.
|
||||
V ?= 1
|
||||
all: program
|
||||
|
||||
# BUILDTYPE=Debug builds both release and debug builds. If you want to compile
|
||||
# just the debug build, run `make -C out BUILDTYPE=Debug` instead.
|
||||
ifeq ($(BUILDTYPE),Release)
|
||||
all: out/Makefile node
|
||||
else
|
||||
all: out/Makefile node node_g
|
||||
endif
|
||||
all-progress:
|
||||
@$(WAF) -p build
|
||||
|
||||
# The .PHONY is needed to ensure that we recursively use the out/Makefile
|
||||
# to check for changes.
|
||||
.PHONY: node node_g
|
||||
program:
|
||||
@$(WAF) --product-type=program build
|
||||
|
||||
node: config.gypi out/Makefile
|
||||
$(MAKE) -C out BUILDTYPE=Release V=$(V)
|
||||
ln -fs out/Release/node node
|
||||
staticlib:
|
||||
@$(WAF) --product-type=cstaticlib build
|
||||
|
||||
node_g: config.gypi out/Makefile
|
||||
$(MAKE) -C out BUILDTYPE=Debug V=$(V)
|
||||
ln -fs out/Debug/node node_g
|
||||
dynamiclib:
|
||||
@$(WAF) --product-type=cshlib build
|
||||
|
||||
config.gypi: configure
|
||||
./configure
|
||||
|
||||
out/Debug/node:
|
||||
$(MAKE) -C out BUILDTYPE=Debug V=$(V)
|
||||
|
||||
out/Makefile: common.gypi deps/uv/uv.gyp deps/http_parser/http_parser.gyp deps/zlib/zlib.gyp deps/v8/build/common.gypi deps/v8/tools/gyp/v8.gyp node.gyp config.gypi
|
||||
$(PYTHON) tools/gyp_node -f make
|
||||
|
||||
install: all
|
||||
$(PYTHON) tools/install.py $@ $(DESTDIR)
|
||||
install:
|
||||
@$(WAF) install
|
||||
|
||||
uninstall:
|
||||
$(PYTHON) tools/install.py $@ $(DESTDIR)
|
||||
|
||||
clean:
|
||||
-rm -rf out/Makefile node node_g out/$(BUILDTYPE)/node blog.html email.md
|
||||
-find out/ -name '*.o' -o -name '*.a' | xargs rm -rf
|
||||
-rm -rf node_modules
|
||||
|
||||
distclean:
|
||||
-rm -rf out
|
||||
-rm -f config.gypi
|
||||
-rm -f config.mk
|
||||
-rm -rf node node_g blog.html email.md
|
||||
-rm -rf node_modules
|
||||
@$(WAF) uninstall
|
||||
|
||||
test: all
|
||||
$(PYTHON) tools/test.py --mode=release simple message
|
||||
PYTHONPATH=tools/closure_linter/ $(PYTHON) tools/closure_linter/closure_linter/gjslint.py --unix_mode --strict --nojsdoc -r lib/ -r src/ --exclude_files lib/punycode.js
|
||||
|
||||
test-http1: all
|
||||
$(PYTHON) tools/test.py --mode=release --use-http1 simple message
|
||||
python tools/test.py --mode=release simple message
|
||||
|
||||
test-valgrind: all
|
||||
$(PYTHON) tools/test.py --mode=release --valgrind simple message
|
||||
python tools/test.py --mode=release --valgrind simple message
|
||||
|
||||
test/gc/node_modules/weak/build:
|
||||
@if [ ! -f node ]; then make all; fi
|
||||
./node deps/npm/node_modules/node-gyp/bin/node-gyp rebuild \
|
||||
--directory="$(shell pwd)/test/gc/node_modules/weak" \
|
||||
--nodedir="$(shell pwd)"
|
||||
|
||||
test-gc: all test/gc/node_modules/weak/build
|
||||
$(PYTHON) tools/test.py --mode=release gc
|
||||
|
||||
test-all: all test/gc/node_modules/weak/build
|
||||
$(PYTHON) tools/test.py --mode=debug,release
|
||||
make test-npm
|
||||
|
||||
test-all-http1: all
|
||||
$(PYTHON) tools/test.py --mode=debug,release --use-http1
|
||||
test-all: all
|
||||
python tools/test.py --mode=debug,release
|
||||
|
||||
test-all-valgrind: all
|
||||
$(PYTHON) tools/test.py --mode=debug,release --valgrind
|
||||
python tools/test.py --mode=debug,release --valgrind
|
||||
|
||||
test-release: all
|
||||
$(PYTHON) tools/test.py --mode=release
|
||||
python tools/test.py --mode=release
|
||||
|
||||
test-debug: all
|
||||
$(PYTHON) tools/test.py --mode=debug
|
||||
python tools/test.py --mode=debug
|
||||
|
||||
test-message: all
|
||||
$(PYTHON) tools/test.py message
|
||||
python tools/test.py message
|
||||
|
||||
test-simple: all
|
||||
$(PYTHON) tools/test.py simple
|
||||
python tools/test.py simple
|
||||
|
||||
test-pummel: all
|
||||
$(PYTHON) tools/test.py pummel
|
||||
python tools/test.py pummel
|
||||
|
||||
test-internet: all
|
||||
$(PYTHON) tools/test.py internet
|
||||
python tools/test.py internet
|
||||
|
||||
test-npm: node
|
||||
./node deps/npm/test/run.js
|
||||
|
||||
test-npm-publish: node
|
||||
npm_package_config_publishtest=true ./node deps/npm/test/run.js
|
||||
build/default/node: all
|
||||
|
||||
apidoc_sources = $(wildcard doc/api/*.markdown)
|
||||
apidocs = $(addprefix out/,$(apidoc_sources:.markdown=.html)) \
|
||||
$(addprefix out/,$(apidoc_sources:.markdown=.json))
|
||||
apidocs = $(addprefix build/,$(apidoc_sources:.markdown=.html))
|
||||
|
||||
apidoc_dirs = out/doc out/doc/api/ out/doc/api/assets out/doc/about out/doc/community out/doc/download out/doc/logos out/doc/images
|
||||
apidoc_dirs = build/doc build/doc/api/ build/doc/api/assets
|
||||
|
||||
apiassets = $(subst api_assets,api/assets,$(addprefix out/,$(wildcard doc/api_assets/*)))
|
||||
|
||||
doc_images = $(addprefix out/,$(wildcard doc/images/* doc/*.jpg doc/*.png))
|
||||
apiassets = $(subst api_assets,api/assets,$(addprefix build/,$(wildcard doc/api_assets/*)))
|
||||
|
||||
website_files = \
|
||||
out/doc/index.html \
|
||||
out/doc/v0.4_announcement.html \
|
||||
out/doc/cla.html \
|
||||
out/doc/sh_main.js \
|
||||
out/doc/sh_javascript.min.js \
|
||||
out/doc/sh_vim-dark.css \
|
||||
out/doc/sh.css \
|
||||
out/doc/favicon.ico \
|
||||
out/doc/pipe.css \
|
||||
out/doc/about/index.html \
|
||||
out/doc/community/index.html \
|
||||
out/doc/download/index.html \
|
||||
out/doc/logos/index.html \
|
||||
out/doc/changelog.html \
|
||||
$(doc_images)
|
||||
build/doc/index.html \
|
||||
build/doc/v0.4_announcement.html \
|
||||
build/doc/cla.html \
|
||||
build/doc/sh_main.js \
|
||||
build/doc/sh_javascript.min.js \
|
||||
build/doc/sh_vim-dark.css \
|
||||
build/doc/logo.png \
|
||||
build/doc/sponsored.png \
|
||||
build/doc/favicon.ico \
|
||||
build/doc/pipe.css
|
||||
|
||||
doc: $(apidoc_dirs) $(website_files) $(apiassets) $(apidocs) tools/doc/ blog node
|
||||
|
||||
blogclean:
|
||||
rm -rf out/blog
|
||||
|
||||
blog: doc/blog out/Release/node tools/blog
|
||||
out/Release/node tools/blog/generate.js doc/blog/ out/blog/ doc/blog.html doc/rss.xml
|
||||
doc: build/default/node $(apidoc_dirs) $(website_files) $(apiassets) $(apidocs)
|
||||
|
||||
$(apidoc_dirs):
|
||||
mkdir -p $@
|
||||
|
||||
out/doc/api/assets/%: doc/api_assets/% out/doc/api/assets/
|
||||
build/doc/api/assets/%: doc/api_assets/% build/doc/api/assets/
|
||||
cp $< $@
|
||||
|
||||
out/doc/changelog.html: ChangeLog doc/changelog-head.html doc/changelog-foot.html tools/build-changelog.sh node
|
||||
bash tools/build-changelog.sh
|
||||
build/doc/%: doc/%
|
||||
cp $< $@
|
||||
|
||||
out/doc/%.html: doc/%.html node
|
||||
cat $< | sed -e 's|__VERSION__|'$(VERSION)'|g' > $@
|
||||
build/doc/api/%.html: doc/api/%.markdown build/default/node $(apidoc_dirs) $(apiassets) tools/doctool/doctool.js
|
||||
build/default/node tools/doctool/doctool.js doc/template.html $< > $@
|
||||
|
||||
out/doc/%: doc/%
|
||||
cp -r $< $@
|
||||
|
||||
out/doc/api/%.json: doc/api/%.markdown node
|
||||
out/Release/node tools/doc/generate.js --format=json $< > $@
|
||||
|
||||
out/doc/api/%.html: doc/api/%.markdown node
|
||||
out/Release/node tools/doc/generate.js --format=html --template=doc/template.html $< > $@
|
||||
|
||||
email.md: ChangeLog tools/email-footer.md
|
||||
bash tools/changelog-head.sh | sed 's|^\* #|* \\#|g' > $@
|
||||
cat tools/email-footer.md | sed -e 's|__VERSION__|'$(VERSION)'|g' >> $@
|
||||
|
||||
blog.html: email.md
|
||||
cat $< | ./node tools/doc/node_modules/.bin/marked > $@
|
||||
|
||||
blog-upload: blog
|
||||
rsync -r out/blog/ node@nodejs.org:~/web/nodejs.org/blog/
|
||||
build/doc/%:
|
||||
|
||||
website-upload: doc
|
||||
rsync -r out/doc/ node@nodejs.org:~/web/nodejs.org/
|
||||
ssh node@nodejs.org '\
|
||||
rm -f ~/web/nodejs.org/dist/latest &&\
|
||||
ln -s $(VERSION) ~/web/nodejs.org/dist/latest &&\
|
||||
rm -f ~/web/nodejs.org/docs/latest &&\
|
||||
ln -s $(VERSION) ~/web/nodejs.org/docs/latest &&\
|
||||
rm -f ~/web/nodejs.org/dist/node-latest.tar.gz &&\
|
||||
ln -s $(VERSION)/node-$(VERSION).tar.gz ~/web/nodejs.org/dist/node-latest.tar.gz'
|
||||
scp -r build/doc/* $(web_root)
|
||||
|
||||
docopen: out/doc/api/all.html
|
||||
-google-chrome out/doc/api/all.html
|
||||
docopen: build/doc/api/all.html
|
||||
-google-chrome build/doc/api/all.html
|
||||
|
||||
docclean:
|
||||
-rm -rf out/doc
|
||||
-rm -rf build/doc
|
||||
|
||||
VERSION=v$(shell $(PYTHON) tools/getnodeversion.py)
|
||||
RELEASE=$(shell $(PYTHON) tools/getnodeisrelease.py)
|
||||
PLATFORM=$(shell uname | tr '[:upper:]' '[:lower:]')
|
||||
ifeq ($(findstring x86_64,$(shell uname -m)),x86_64)
|
||||
DESTCPU ?= x64
|
||||
else
|
||||
DESTCPU ?= ia32
|
||||
endif
|
||||
ifeq ($(DESTCPU),x64)
|
||||
ARCH=x64
|
||||
else
|
||||
ARCH=x86
|
||||
endif
|
||||
clean:
|
||||
$(WAF) clean
|
||||
-find tools -name "*.pyc" | xargs rm -f
|
||||
|
||||
distclean: docclean
|
||||
-find tools -name "*.pyc" | xargs rm -f
|
||||
-rm -rf build/ node node_g
|
||||
|
||||
check:
|
||||
@tools/waf-light check
|
||||
|
||||
VERSION=$(shell git describe)
|
||||
TARNAME=node-$(VERSION)
|
||||
TARBALL=$(TARNAME).tar.gz
|
||||
BINARYNAME=$(TARNAME)-$(PLATFORM)-$(ARCH)
|
||||
BINARYTAR=$(BINARYNAME).tar.gz
|
||||
PKG=out/$(TARNAME).pkg
|
||||
packagemaker=/Developer/Applications/Utilities/PackageMaker.app/Contents/MacOS/PackageMaker
|
||||
|
||||
dist: doc $(TARBALL) $(PKG)
|
||||
|
||||
PKGDIR=out/dist-osx
|
||||
|
||||
release-only:
|
||||
@if [ "$(shell git status --porcelain | egrep -v '^\?\? ')" = "" ]; then \
|
||||
exit 0 ; \
|
||||
else \
|
||||
echo "" >&2 ; \
|
||||
echo "The git repository is not clean." >&2 ; \
|
||||
echo "Please commit changes before building release tarball." >&2 ; \
|
||||
echo "" >&2 ; \
|
||||
git status --porcelain | egrep -v '^\?\?' >&2 ; \
|
||||
echo "" >&2 ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
@if [ "$(RELEASE)" = "1" ]; then \
|
||||
exit 0; \
|
||||
else \
|
||||
echo "" >&2 ; \
|
||||
echo "#NODE_VERSION_IS_RELEASE is set to $(RELEASE)." >&2 ; \
|
||||
echo "Did you remember to update src/node_version.cc?" >&2 ; \
|
||||
echo "" >&2 ; \
|
||||
exit 1 ; \
|
||||
fi
|
||||
|
||||
pkg: $(PKG)
|
||||
|
||||
$(PKG): release-only
|
||||
rm -rf $(PKGDIR)
|
||||
rm -rf out/deps out/Release
|
||||
./configure --prefix=$(PKGDIR)/32/usr/local --without-snapshot --dest-cpu=ia32
|
||||
$(MAKE) install V=$(V)
|
||||
rm -rf out/deps out/Release
|
||||
./configure --prefix=$(PKGDIR)/usr/local --without-snapshot --dest-cpu=x64
|
||||
$(MAKE) install V=$(V)
|
||||
SIGN="$(APP_SIGN)" PKGDIR="$(PKGDIR)" bash tools/osx-codesign.sh
|
||||
lipo $(PKGDIR)/32/usr/local/bin/node \
|
||||
$(PKGDIR)/usr/local/bin/node \
|
||||
-output $(PKGDIR)/usr/local/bin/node-universal \
|
||||
-create
|
||||
mv $(PKGDIR)/usr/local/bin/node-universal $(PKGDIR)/usr/local/bin/node
|
||||
rm -rf $(PKGDIR)/32
|
||||
$(packagemaker) \
|
||||
--id "org.nodejs.Node" \
|
||||
--doc tools/osx-pkg.pmdoc \
|
||||
--out $(PKG)
|
||||
SIGN="$(INT_SIGN)" PKG="$(PKG)" bash tools/osx-productsign.sh
|
||||
|
||||
$(TARBALL): release-only node doc
|
||||
#dist: doc/node.1 doc/api
|
||||
dist: doc
|
||||
git archive --format=tar --prefix=$(TARNAME)/ HEAD | tar xf -
|
||||
mkdir -p $(TARNAME)/doc/api
|
||||
mkdir -p $(TARNAME)/doc
|
||||
cp doc/node.1 $(TARNAME)/doc/node.1
|
||||
cp -r out/doc/api/* $(TARNAME)/doc/api/
|
||||
cp -r build/doc/api $(TARNAME)/doc/api
|
||||
rm -rf $(TARNAME)/deps/v8/test # too big
|
||||
rm -rf $(TARNAME)/doc/images # too big
|
||||
find $(TARNAME)/ -type l | xargs rm # annoying on windows
|
||||
tar -cf $(TARNAME).tar $(TARNAME)
|
||||
rm -rf $(TARNAME)
|
||||
gzip -f -9 $(TARNAME).tar
|
||||
|
||||
tar: $(TARBALL)
|
||||
|
||||
$(BINARYTAR): release-only
|
||||
rm -rf $(BINARYNAME)
|
||||
rm -rf out/deps out/Release
|
||||
./configure --prefix=/ --without-snapshot --dest-cpu=$(DESTCPU) $(CONFIG_FLAGS)
|
||||
$(MAKE) install DESTDIR=$(BINARYNAME) V=$(V) PORTABLE=1
|
||||
cp README.md $(BINARYNAME)
|
||||
cp LICENSE $(BINARYNAME)
|
||||
cp ChangeLog $(BINARYNAME)
|
||||
tar -cf $(BINARYNAME).tar $(BINARYNAME)
|
||||
rm -rf $(BINARYNAME)
|
||||
gzip -f -9 $(BINARYNAME).tar
|
||||
|
||||
binary: $(BINARYTAR)
|
||||
|
||||
dist-upload: $(TARBALL) $(PKG)
|
||||
ssh node@nodejs.org mkdir -p web/nodejs.org/dist/$(VERSION)
|
||||
scp $(TARBALL) node@nodejs.org:~/web/nodejs.org/dist/$(VERSION)/$(TARBALL)
|
||||
scp $(PKG) node@nodejs.org:~/web/nodejs.org/dist/$(VERSION)/$(TARNAME).pkg
|
||||
|
||||
bench:
|
||||
benchmark/http_simple_bench.sh
|
||||
|
||||
@@ -302,15 +131,12 @@ bench-idle:
|
||||
sleep 1
|
||||
./node benchmark/idle_clients.js &
|
||||
|
||||
jslintfix:
|
||||
PYTHONPATH=tools/closure_linter/ $(PYTHON) tools/closure_linter/closure_linter/fixjsstyle.py --strict --nojsdoc -r lib/ -r src/ --exclude_files lib/punycode.js
|
||||
|
||||
jslint:
|
||||
PYTHONPATH=tools/closure_linter/ $(PYTHON) tools/closure_linter/closure_linter/gjslint.py --unix_mode --strict --nojsdoc -r lib/ -r src/ --exclude_files lib/punycode.js
|
||||
PYTHONPATH=tools/closure_linter/ python tools/closure_linter/closure_linter/gjslint.py --unix_mode --strict --nojsdoc -r lib/ -r src/ -r test/
|
||||
|
||||
cpplint:
|
||||
@$(PYTHON) tools/cpplint.py $(wildcard src/*.cc src/*.h src/*.c)
|
||||
@python tools/cpplint.py $(wildcard src/*.cc src/*.h src/*.c)
|
||||
|
||||
lint: jslint cpplint
|
||||
|
||||
.PHONY: lint cpplint jslint bench clean docopen docclean doc dist distclean check uninstall install install-includes install-bin all staticlib dynamiclib test test-all website-upload pkg blog blogclean tar binary release-only
|
||||
.PHONY: lint cpplint jslint bench clean docopen docclean doc dist distclean check uninstall install all program staticlib dynamiclib test test-all website-upload
|
||||
|
||||
40
Makefile.cmake
Normal file
40
Makefile.cmake
Normal file
@@ -0,0 +1,40 @@
|
||||
BUILD?=build
|
||||
VERBOSE?=0
|
||||
PARALLEL_JOBS?=1
|
||||
CMAKE?=cmake
|
||||
TOOLCHAIN_FILE=#./cmake/codesourcery-arm-toolchain.cmake
|
||||
|
||||
all: package
|
||||
|
||||
$(BUILD)/Makefile:
|
||||
mkdir $(BUILD) || exit 0
|
||||
cd $(BUILD) && $(CMAKE) -DCMAKE_VERBOSE_MAKEFILE=$(VERBOSE) -DCMAKE_TOOLCHAIN_FILE=$(TOOLCHAIN_FILE) ..
|
||||
|
||||
build: $(BUILD)/Makefile
|
||||
cd $(BUILD) && make -j $(PARALLEL_JOBS)
|
||||
|
||||
install: build
|
||||
cd $(BUILD) && sudo make install
|
||||
|
||||
clean:
|
||||
rm -rf $(BUILD)
|
||||
|
||||
doc: $(BUILD)/Makefile
|
||||
cd $(BUILD) && make doc
|
||||
|
||||
package: $(BUILD)/Makefile
|
||||
cd $(BUILD) && make package
|
||||
|
||||
test: $(BUILD)/Makefile
|
||||
cd $(BUILD) && make test
|
||||
|
||||
cdash: $(BUILD)/Makefile
|
||||
cd $(BUILD) && make Experimental
|
||||
|
||||
cdash-cov: $(BUILD)/Makefile
|
||||
cd $(BUILD) && $(CMAKE) -DUSE_GCOV=True .. && make Experimental
|
||||
|
||||
cdash-mem: $(BUILD)/Makefile
|
||||
cd $(BUILD) && make NightlyMemoryCheck
|
||||
|
||||
.PHONY: build install clean doc package test cdash cdash-cov cdash-mem
|
||||
77
README.cmake
Normal file
77
README.cmake
Normal file
@@ -0,0 +1,77 @@
|
||||
Instructions for building with cmake
|
||||
|
||||
Make sure you have cmake:
|
||||
Ubuntu/Debian: sudo apt-get install cmake
|
||||
Mac: http://www.cmake.org/files/v2.8/cmake-2.8.3-Darwin-universal.dmg
|
||||
Other platforms: http://www.cmake.org/cmake/resources/software.html
|
||||
|
||||
To build:
|
||||
|
||||
make -f Makefile.cmake
|
||||
make -f Makefile.cmake install
|
||||
|
||||
To run the tests:
|
||||
|
||||
make -f Makefile.cmake test
|
||||
|
||||
To build the documentation:
|
||||
|
||||
make -f Makefile.cmake doc
|
||||
|
||||
To read the documentation:
|
||||
|
||||
man doc/node.1
|
||||
|
||||
To build distro packages (tgz, deb, rpm, PackageMaker):
|
||||
|
||||
make -f Makefile.cmake package
|
||||
|
||||
To submit test results (see http://my.cdash.org/index.php?project=node):
|
||||
|
||||
make -f Makefile.cmake cdash
|
||||
|
||||
To submit coverage test results:
|
||||
|
||||
make -f Makefile.cmake cdash-cov
|
||||
|
||||
To submit valgrind test results:
|
||||
|
||||
make -f Makefile.cmake cdash-mem
|
||||
|
||||
Cross-compiling:
|
||||
An example toolchain file for the CodeSourcery ARM toolchain is included in
|
||||
the cmake directory: codesourcery-arm-toolchain.cmake.
|
||||
|
||||
Install the CodeSourcery toolchain, set the path to the toolchain in
|
||||
cmake/codesourcery-arm-toolchain.cmake, and uncomment the TOOLCHAIN_FILE
|
||||
variable in Makefile.cmake to use it.
|
||||
|
||||
If you are using cmake directly, just add the flag
|
||||
"-DCMAKE_TOOLCHAIN_FILE=/path/to/toolchain-file" when
|
||||
running cmake.
|
||||
|
||||
Using cmake directly:
|
||||
cd ~/your-node-source-dir
|
||||
mkdir name-of-build-dir (can be anything)
|
||||
cd name-of-build-dir
|
||||
cmake ..
|
||||
|
||||
At this point you have generated a set of Makefiles and can use the standard
|
||||
make commands (make, make install, etc.). The Makefile.cmake file is just a
|
||||
wrapper around these commands; take a look at it for more details.
|
||||
|
||||
Other build targets:
|
||||
make Experimental
|
||||
make Nightly
|
||||
make NightlyMemoryCheck
|
||||
make Continuous
|
||||
|
||||
Additional options:
|
||||
In the CMakeLists.txt, you'll see things like
|
||||
option(SHARED_V8, ...). If you want to enable any of those options you can
|
||||
pass "-DOPTION=True" when running cmake (e.g., cmake -DSHARED_V8=True).
|
||||
|
||||
See http://nodejs.org/ for more information. For help and discussion
|
||||
subscribe to the mailing list by visiting
|
||||
http://groups.google.com/group/nodejs or by sending an email to
|
||||
nodejs+subscribe@googlegroups.com.
|
||||
49
README.md
49
README.md
@@ -1,60 +1,33 @@
|
||||
Evented I/O for V8 javascript. [](http://travis-ci.org/joyent/node)
|
||||
Evented I/O for V8 javascript.
|
||||
===
|
||||
|
||||
### To build:
|
||||
|
||||
Prerequisites (Unix only):
|
||||
|
||||
* Python 2.6 or 2.7
|
||||
* GNU Make 3.81 or newer
|
||||
* libexecinfo (FreeBSD and OpenBSD only)
|
||||
|
||||
Unix/Macintosh:
|
||||
To build:
|
||||
|
||||
./configure
|
||||
make
|
||||
make install
|
||||
|
||||
If your python binary is in a non-standard location or has a
|
||||
non-standard name, run the following instead:
|
||||
|
||||
export PYTHON=/path/to/python
|
||||
$PYTHON ./configure
|
||||
make
|
||||
make install
|
||||
|
||||
Windows:
|
||||
|
||||
vcbuild.bat
|
||||
|
||||
### To run the tests:
|
||||
|
||||
Unix/Macintosh:
|
||||
To run the tests:
|
||||
|
||||
make test
|
||||
|
||||
Windows:
|
||||
|
||||
vcbuild.bat test
|
||||
|
||||
### To build the documentation:
|
||||
To build the documentation:
|
||||
|
||||
make doc
|
||||
|
||||
### To read the documentation:
|
||||
To read the documentation:
|
||||
|
||||
man doc/node.1
|
||||
|
||||
Resources for Newcomers
|
||||
---
|
||||
- [The Wiki](https://github.com/joyent/node/wiki)
|
||||
- [The Wiki](http://github.com/ry/node/wiki)
|
||||
- [nodejs.org](http://nodejs.org/)
|
||||
- [how to install node.js and npm (node package manager)](http://joyeur.com/2010/12/10/installing-node-and-npm/)
|
||||
- [list of modules](https://github.com/joyent/node/wiki/modules)
|
||||
- [searching the npm registry](http://search.npmjs.org/)
|
||||
- [list of companies and projects using node](https://github.com/joyent/node/wiki/Projects,-Applications,-and-Companies-Using-Node)
|
||||
- [list of modules](http://github.com/ry/node/wiki/modules)
|
||||
- [list of companies and projects using node](http://github.com/ry/node/wiki)
|
||||
- [node.js mailing list](http://groups.google.com/group/nodejs)
|
||||
- irc chatroom, [#node.js on freenode.net](http://webchat.freenode.net?channels=node.js&uio=d4)
|
||||
- [community](https://github.com/joyent/node/wiki/Community)
|
||||
- [contributing](https://github.com/joyent/node/wiki/Contributing)
|
||||
- [big list of all the helpful wiki pages](https://github.com/joyent/node/wiki/_pages)
|
||||
- [community](https://github.com/ry/node/wiki/Community)
|
||||
- [contributing](https://github.com/ry/node/wiki/Contributing)
|
||||
- [big list of all the helpful wiki pages](https://github.com/ry/node/wiki/_pages)
|
||||
|
||||
33
TODO
Normal file
33
TODO
Normal file
@@ -0,0 +1,33 @@
|
||||
- fix tests for NODE_MODULE_CONTEXTS=1
|
||||
- readline
|
||||
- fix for two column glyphs. use Markus Kuhn's wcwidth.c
|
||||
- fix for commands that extend beyond term width
|
||||
- Erradicate all traces of 'binary' encoding. Only used, now, in OpenSSL
|
||||
binding.
|
||||
- EventSource branch merged
|
||||
- Use C++ style casts everywhere.
|
||||
- Ruby-like Process#detach (is that possible?)
|
||||
- stderr isn't flushing on exit
|
||||
- ReadStream should not use an offset in calls to fs.read
|
||||
(so that it can pull in files larger than 2G)
|
||||
- process object should be defined in src/node.js not in c++
|
||||
- Test for EMFILE accept spin bug.
|
||||
- Deprecate setEncoding() and instead add option to on('data').
|
||||
Example:
|
||||
|
||||
stdin.on('data', { encoding: 'utf8' }, function (chunk) {
|
||||
process.stdout.write('WRITE: ' + chunk);
|
||||
});
|
||||
|
||||
Perhaps by assigning cb.opts.encoding and calling
|
||||
EventEmitter.optHandlers.encoding() if it exists.
|
||||
|
||||
- DOCS
|
||||
- anchor links next to each function, for easy linking.
|
||||
EG <a href="#fs.stat">#</a>
|
||||
|
||||
- "node --raw-js script.js" should bipass all Node code and load a raw V8
|
||||
interpreter
|
||||
- Use http_parser_execute2() in node_http_parser.cc and make req.pause()
|
||||
work correctly
|
||||
https://github.com/ry/http-parser/blob/c95a5479596e95b7cdd88ca9d7b32fd3afb4379c/http_parser.h#L266
|
||||
88
TODO.win32
Normal file
88
TODO.win32
Normal file
@@ -0,0 +1,88 @@
|
||||
- Implement setenv / unsetenv
|
||||
|
||||
- Implement other stuff missing in node.cc/process
|
||||
Like getuid, getgid, setgid, kill etc.
|
||||
|
||||
- Better `net` support
|
||||
* getaddrinfo
|
||||
* setMulticastTTL, setMembership, setLoopback
|
||||
* pipe, socketpair
|
||||
* A named pipe should be provided when a unix socket is requested.
|
||||
* SendMsg and RecvMsg should be supported with named pipes.
|
||||
|
||||
- New libev backend
|
||||
The current libev backend supports sockets only. This complicates stuff like
|
||||
child processes, stdio. Best would be if node_net switched from exposing
|
||||
readyness notifications to using completion notifications, so on windows we
|
||||
could use IOCP for sockets. Experts tell me that is really the fastest way
|
||||
to work with sockets on windows.
|
||||
|
||||
- Child process issues
|
||||
* Communication between parent and child is slow; it uses a socketpair
|
||||
where a pipe would be much faster. Replace it by a pipe when there
|
||||
is a libev backend that supports waiting for a pipe.
|
||||
* When a child process spawns the pid is not available straightaway.
|
||||
On linux the pid is available immediately because fork() doesn't
|
||||
block; on windows a libeio thread is used to call CreateProcess.
|
||||
So this can't really be fixed, but it could be worked around by adding a
|
||||
'spawn' or 'pid' event.
|
||||
* passing socket custom_fds is not supported
|
||||
* child_process.exec() only works on systems with msys installed.
|
||||
It's because it relies on the 'sh' shell. The default windows shell
|
||||
is 'cmd' and it works a little differently. Maybe add an option to
|
||||
specify the shell to exec()?
|
||||
|
||||
- Make colorful util.inspect work on windows.
|
||||
|
||||
- Stdio: support passing sockets between master/child process
|
||||
Normal windows applications wouldn't like this, but it can be useful for
|
||||
communication between node processes. This requires
|
||||
stdio.isStdinBlocking/isStdoutBlocking to be smarter.
|
||||
|
||||
- Skip/fix tests that can never pass on windows
|
||||
|
||||
- Find a solution for fs.symlink / fs.lstat / fs.chown
|
||||
Windows has different symlink types: file symlinks (vista+),
|
||||
directory symlinks (vista+), junction points (xp+)
|
||||
|
||||
- Handle _open_osfhandle failures
|
||||
E.g. currently we're using the construct _open_osfhandle(socket/open/accept(...)).
|
||||
Now socket() can fail by itself and _open_osfhandle can fail by itself too.
|
||||
If socket() fails it returns -1 so _open_osfhandle fails as well, but and we'll always return/throw EBADF.
|
||||
If _open_osfhandle fails but socket doesn't, a stray handle is left open. It should be fixed.
|
||||
|
||||
- Think about `make install`
|
||||
|
||||
- Extensions
|
||||
Should be DLLs on windows.
|
||||
|
||||
- Link pthreads-w32 statically by default
|
||||
|
||||
- Link Mingw libraries statically by default
|
||||
Like libstdc++.dll, more maybe.
|
||||
Microsoft libs are always there, no static linkage required (e.g. msvcrt, winsock2).
|
||||
|
||||
- Make (open?)SSL work
|
||||
|
||||
- Support using shared libs (libeio, v8, c-ares)
|
||||
Need to link with with a stub library. Libraries should use `dllexport`,
|
||||
headers must have `dllimport`.
|
||||
|
||||
- V8: push MINGW32 build fixes upstream
|
||||
|
||||
- Work around missing pread/pwrite more elegantly
|
||||
Currently it's exported from libeio, while it wasn't intended to be exported.
|
||||
The libeio workaround implementation sucks, it uses a global mutex.
|
||||
It should be possible to implement pread and pwrite using winapi's ReadFile/Writefile
|
||||
directly, passing an OVERLAPPED structure while not associating with an completion port.
|
||||
|
||||
- Work around missing inet_pton/inet_ntop more elegantly
|
||||
Currently it's exported from from c-ares, while it wasn't intended to be exported.
|
||||
It prevents linking c-ares dynamically.
|
||||
|
||||
- See what libev/libeio changes can be pushed upstream
|
||||
|
||||
- 64-bit build
|
||||
Should be possible with MinGW-w64, it's pretty good.
|
||||
|
||||
- ... much more probably
|
||||
@@ -1,15 +0,0 @@
|
||||
var types = 'Array Buffer Int8Array Uint8Array Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array'.split(' ');
|
||||
|
||||
var type = types[types.indexOf(process.argv[2])];
|
||||
if (!type)
|
||||
type = types[0];
|
||||
|
||||
console.error('Benchmarking', type);
|
||||
var clazz = global[type];
|
||||
|
||||
var arr = new clazz(25 * 10e5);
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
for (var j = 0, k = arr.length; j < k; ++j) {
|
||||
arr[j] = (j ^ k) & 127;
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
var types = 'Array Buffer Int8Array Uint8Array Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array'.split(' ');
|
||||
|
||||
var type = types[types.indexOf(process.argv[2])];
|
||||
if (!type)
|
||||
type = types[0];
|
||||
|
||||
console.error('Benchmarking', type);
|
||||
var clazz = global[type];
|
||||
|
||||
var arr = new clazz(25 * 10e5);
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
for (var j = 0, k = arr.length; j < k; ++j) {
|
||||
arr[j] = 0.0;
|
||||
}
|
||||
}
|
||||
@@ -1,15 +0,0 @@
|
||||
var types = 'Array Buffer Int8Array Uint8Array Int16Array Uint16Array Int32Array Uint32Array Float32Array Float64Array'.split(' ');
|
||||
|
||||
var type = types[types.indexOf(process.argv[2])];
|
||||
if (!type)
|
||||
type = types[0];
|
||||
|
||||
console.error('Benchmarking', type);
|
||||
var clazz = global[type];
|
||||
|
||||
var arr = new clazz(25 * 10e5);
|
||||
for (var i = 0; i < 10; ++i) {
|
||||
for (var j = 0, k = arr.length; j < k; ++j) {
|
||||
arr[j] = 0;
|
||||
}
|
||||
}
|
||||
@@ -1,80 +0,0 @@
|
||||
// first start node http_simple.js
|
||||
var http = require('http');
|
||||
|
||||
var latency = [];
|
||||
|
||||
var numRequests = parseInt(process.argv[2], 10) || 100;
|
||||
var maxSockets = parseInt(process.argv[3], 10) || 100;
|
||||
var runs = parseInt(process.argv[4], 10) || 100;
|
||||
var prefix = process.argv[5] || '';
|
||||
if (prefix) prefix += '_';
|
||||
var r = 0;
|
||||
|
||||
var port = parseInt(process.env.PORT, 10) || 8000;
|
||||
var host = process.env.HOST || '127.0.0.1';
|
||||
|
||||
http.globalAgent.maxSockets = maxSockets;
|
||||
|
||||
run();
|
||||
|
||||
function run() {
|
||||
if (r++ === runs) {
|
||||
return finish();
|
||||
}
|
||||
|
||||
// make numRequests in parallel
|
||||
// retain the order in which they are *made*. This requires trapping
|
||||
// each one in a closure, since otherwise, we'll of course end
|
||||
// up mostly sorting them in ascending order, since the cb from a
|
||||
// fast request will almost always be called before the cb from a
|
||||
// slow one.
|
||||
var c = numRequests;
|
||||
var lat = [];
|
||||
latency.push(lat);
|
||||
for (var i = 0; i < numRequests; i++) (function (i) {
|
||||
makeRequest(function(l) {
|
||||
lat[i] = l;
|
||||
c--;
|
||||
if (c === 0) run();
|
||||
});
|
||||
})(i);
|
||||
}
|
||||
|
||||
function makeRequest(cb) {
|
||||
var opts = { host: host,
|
||||
port: port,
|
||||
uri: 'http://'+host+':'+port+'/bytes/12',
|
||||
forever: true,
|
||||
path: '/bytes/12' };
|
||||
var pre = Date.now();
|
||||
var req = http.get(opts, function(res) {
|
||||
return cb(Date.now() - pre);
|
||||
});
|
||||
}
|
||||
|
||||
function finish() {
|
||||
var data = [];
|
||||
latency.forEach(function(run, i) {
|
||||
run.forEach(function(l, j) {
|
||||
data[j] = data[j] || [];
|
||||
data[j][i] = l;
|
||||
});
|
||||
});
|
||||
|
||||
data = data.map(function (l, i) {
|
||||
return l.join('\t')
|
||||
}).join('\n') + '\n';
|
||||
|
||||
var fname = prefix +
|
||||
'client_latency_' +
|
||||
numRequests + '_' +
|
||||
maxSockets + '_' +
|
||||
runs + '.tab';
|
||||
var path = require('path');
|
||||
fname = path.resolve(__dirname, '..', 'out', fname);
|
||||
fname = path.relative(process.cwd(), fname);
|
||||
require('fs').writeFile(fname, data, function(er) {
|
||||
if (er) throw er;
|
||||
console.log('written: %s', fname);
|
||||
});
|
||||
}
|
||||
@@ -1,72 +0,0 @@
|
||||
// Call fs.readFile over and over again really fast.
|
||||
// Then see how many times it got called.
|
||||
// Yes, this is a silly benchmark. Most benchmarks are silly.
|
||||
|
||||
var path = require('path');
|
||||
var filename = path.resolve(__dirname, 'http.sh');
|
||||
var fs = require('fs');
|
||||
var count = 0;
|
||||
var go = true;
|
||||
var len = -1;
|
||||
var assert = require('assert');
|
||||
|
||||
var concurrency = 1;
|
||||
var encoding = null;
|
||||
var time = 10;
|
||||
|
||||
for (var i = 2; i < process.argv.length; i++) {
|
||||
var arg = process.argv[i];
|
||||
if (arg.match(/^-e$/)) {
|
||||
encoding = process.argv[++i] || null;
|
||||
} else if (arg.match(/^-c$/)) {
|
||||
concurrency = ~~process.argv[++i];
|
||||
if (concurrency < 1) concurrency = 1;
|
||||
} else if (arg === '-t') {
|
||||
time = ~~process.argv[++i];
|
||||
if (time < 1) time = 1;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
setTimeout(function() {
|
||||
go = false;
|
||||
}, time * 1000);
|
||||
|
||||
function round(n) {
|
||||
return Math.floor(n * 100) / 100;
|
||||
}
|
||||
|
||||
var start = process.hrtime();
|
||||
while (concurrency--) readFile();
|
||||
|
||||
function readFile() {
|
||||
if (!go) {
|
||||
process.stdout.write('\n');
|
||||
console.log('read the file %d times (higher is better)', count);
|
||||
var end = process.hrtime();
|
||||
var elapsed = [end[0] - start[0], end[1] - start[1]];
|
||||
var ns = elapsed[0] * 1E9 + elapsed[1];
|
||||
var nsper = round(ns / count);
|
||||
console.log('%d ns per read (lower is better)', nsper);
|
||||
var readsper = round(count / (ns / 1E9));
|
||||
console.log('%d reads per sec (higher is better)', readsper);
|
||||
process.exit(0);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(count % 1000)) {
|
||||
process.stdout.write('.');
|
||||
}
|
||||
|
||||
if (encoding) fs.readFile(filename, encoding, then);
|
||||
else fs.readFile(filename, then);
|
||||
|
||||
function then(er, data) {
|
||||
assert.ifError(er);
|
||||
count++;
|
||||
// basic sanity test: we should get the same number of bytes each time.
|
||||
if (count === 1) len = data.length;
|
||||
else assert(len === data.length);
|
||||
readFile();
|
||||
}
|
||||
}
|
||||
@@ -1,43 +0,0 @@
|
||||
#!/bin/bash
|
||||
cd "$(dirname "$(dirname $0)")"
|
||||
|
||||
if type sysctl &>/dev/null; then
|
||||
# darwin and linux
|
||||
sudo sysctl -w net.ipv4.ip_local_port_range="12000 65535"
|
||||
sudo sysctl -w net.inet.ip.portrange.first=12000
|
||||
sudo sysctl -w net.inet.tcp.msl=1000
|
||||
sudo sysctl -w kern.maxfiles=1000000 kern.maxfilesperproc=1000000
|
||||
elif type /usr/sbin/ndd &>/dev/null; then
|
||||
# sunos
|
||||
/usr/sbin/ndd -set /dev/tcp tcp_smallest_anon_port 12000
|
||||
/usr/sbin/ndd -set /dev/tcp tcp_largest_anon_port 65535
|
||||
/usr/sbin/ndd -set /dev/tcp tcp_max_buf 2097152
|
||||
/usr/sbin/ndd -set /dev/tcp tcp_xmit_hiwat 1048576
|
||||
/usr/sbin/ndd -set /dev/tcp tcp_recv_hiwat 1048576
|
||||
fi
|
||||
|
||||
ulimit -n 100000
|
||||
|
||||
k=${KEEPALIVE}
|
||||
if [ "$k" = "no" ]; then
|
||||
k=""
|
||||
else
|
||||
k="-k"
|
||||
fi
|
||||
node=${NODE:-./node}
|
||||
|
||||
$node benchmark/http_simple.js &
|
||||
npid=$!
|
||||
|
||||
sleep 1
|
||||
|
||||
if [ "$k" = "-k" ]; then
|
||||
echo "using keepalive"
|
||||
fi
|
||||
|
||||
for i in a a a a a a a a a a a a a a a a a a a a; do
|
||||
ab $k -t 10 -c 100 http://127.0.0.1:8000/${TYPE:-bytes}/${LENGTH:-1024} \
|
||||
2>&1 | grep Req | egrep -o '[0-9\.]+'
|
||||
done
|
||||
|
||||
kill $npid
|
||||
@@ -1,127 +0,0 @@
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
// persons to whom the Software is furnished to do so, subject to the
|
||||
// following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
var spawn = require('child_process').spawn;
|
||||
var cluster = require('cluster');
|
||||
var http = require('http');
|
||||
|
||||
var options = {
|
||||
mode: 'master',
|
||||
host: '127.0.0.1',
|
||||
port: 22344,
|
||||
path: '/',
|
||||
servers: 1,
|
||||
clients: 1
|
||||
};
|
||||
|
||||
for (var i = 2; i < process.argv.length; ++i) {
|
||||
var args = process.argv[i].split('=', 2);
|
||||
var key = args[0];
|
||||
var val = args[1];
|
||||
options[key] = val;
|
||||
}
|
||||
|
||||
switch (options.mode) {
|
||||
case 'master': startMaster(); break;
|
||||
case 'server': startServer(); break;
|
||||
case 'client': startClient(); break;
|
||||
default: throw new Error('Bad mode: ' + options.mode);
|
||||
}
|
||||
|
||||
process.title = 'http_bench[' + options.mode + ']';
|
||||
|
||||
// monkey-patch the log functions so they include name + pid
|
||||
console.log = patch(console.log);
|
||||
console.trace = patch(console.trace);
|
||||
console.error = patch(console.error);
|
||||
|
||||
function patch(fun) {
|
||||
var prefix = process.title + '[' + process.pid + '] ';
|
||||
return function() {
|
||||
var args = Array.prototype.slice.call(arguments);
|
||||
args[0] = prefix + args[0];
|
||||
return fun.apply(console, args);
|
||||
};
|
||||
}
|
||||
|
||||
function startMaster() {
|
||||
if (!cluster.isMaster) return startServer();
|
||||
|
||||
for (var i = ~~options.servers; i > 0; --i) cluster.fork();
|
||||
|
||||
for (var i = ~~options.clients; i > 0; --i) {
|
||||
var cp = spawn(process.execPath, [__filename, 'mode=client']);
|
||||
cp.stdout.pipe(process.stdout);
|
||||
cp.stderr.pipe(process.stderr);
|
||||
}
|
||||
}
|
||||
|
||||
function startServer() {
|
||||
http.createServer(onRequest).listen(options.port, options.host);
|
||||
|
||||
var body = Array(1024).join('x');
|
||||
var headers = {'Content-Length': '' + body.length};
|
||||
|
||||
function onRequest(req, res) {
|
||||
req.on('error', onError);
|
||||
res.on('error', onError);
|
||||
res.writeHead(200, headers);
|
||||
res.end(body);
|
||||
}
|
||||
|
||||
function onError(err) {
|
||||
console.error(err.stack);
|
||||
}
|
||||
}
|
||||
|
||||
function startClient() {
|
||||
// send off a bunch of concurrent requests
|
||||
// TODO make configurable
|
||||
sendRequest();
|
||||
sendRequest();
|
||||
|
||||
function sendRequest() {
|
||||
var req = http.request(options, onConnection);
|
||||
req.on('error', onError);
|
||||
req.end();
|
||||
}
|
||||
|
||||
// add a little back-off to prevent EADDRNOTAVAIL errors, it's pretty easy
|
||||
// to exhaust the available port range
|
||||
function relaxedSendRequest() {
|
||||
setTimeout(sendRequest, 1);
|
||||
}
|
||||
|
||||
function onConnection(res) {
|
||||
res.on('error', onError);
|
||||
res.on('data', onData);
|
||||
res.on('end', relaxedSendRequest);
|
||||
}
|
||||
|
||||
function onError(err) {
|
||||
console.error(err.stack);
|
||||
relaxedSendRequest();
|
||||
}
|
||||
|
||||
function onData(data) {
|
||||
// this space intentionally left blank
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
var http = require('http');
|
||||
var port = parseInt(process.env.PORT, 10) || 8000;
|
||||
var defaultLag = parseInt(process.argv[2], 10) || 100;
|
||||
|
||||
http.createServer(function(req, res) {
|
||||
res.writeHead(200, { 'content-type': 'text/plain',
|
||||
'content-length': '2' });
|
||||
|
||||
var lag = parseInt(req.url.split("/").pop(), 10) || defaultLag;
|
||||
setTimeout(function() {
|
||||
res.end('ok');
|
||||
}, lag);
|
||||
}).listen(port, 'localhost');
|
||||
@@ -1,123 +1,87 @@
|
||||
var path = require('path'),
|
||||
exec = require('child_process').exec,
|
||||
http = require('http');
|
||||
path = require("path");
|
||||
exec = require("child_process").exec;
|
||||
http = require("http");
|
||||
|
||||
var port = parseInt(process.env.PORT || 8000);
|
||||
port = parseInt(process.env.PORT || 8000);
|
||||
|
||||
console.log('pid ' + process.pid);
|
||||
|
||||
var fixed = makeString(20 * 1024, 'C'),
|
||||
storedBytes = {},
|
||||
storedBuffer = {},
|
||||
storedUnicode = {};
|
||||
|
||||
var useDomains = process.env.NODE_USE_DOMAINS;
|
||||
|
||||
// set up one global domain.
|
||||
if (useDomains) {
|
||||
var domain = require('domain');
|
||||
var gdom = domain.create();
|
||||
gdom.on('error', function(er) {
|
||||
console.log('Error on global domain', er);
|
||||
throw er;
|
||||
});
|
||||
gdom.enter();
|
||||
fixed = ""
|
||||
for (var i = 0; i < 20*1024; i++) {
|
||||
fixed += "C";
|
||||
}
|
||||
|
||||
var server = http.createServer(function (req, res) {
|
||||
if (useDomains) {
|
||||
var dom = domain.create();
|
||||
dom.add(req);
|
||||
dom.add(res);
|
||||
}
|
||||
stored = {};
|
||||
storedBuffer = {};
|
||||
|
||||
var commands = req.url.split('/');
|
||||
var server = http.createServer(function (req, res) {
|
||||
var commands = req.url.split("/");
|
||||
var command = commands[1];
|
||||
var body = '';
|
||||
var body = "";
|
||||
var arg = commands[2];
|
||||
var n_chunks = parseInt(commands[3], 10);
|
||||
var status = 200;
|
||||
|
||||
if (command == 'bytes') {
|
||||
var n = ~~arg;
|
||||
if (command == "bytes") {
|
||||
var n = parseInt(arg, 10)
|
||||
if (n <= 0)
|
||||
throw new Error('bytes called with n <= 0')
|
||||
if (storedBytes[n] === undefined) {
|
||||
console.log('create storedBytes[n]');
|
||||
storedBytes[n] = makeString(n, 'C');
|
||||
throw "bytes called with n <= 0"
|
||||
if (stored[n] === undefined) {
|
||||
console.log("create stored[n]");
|
||||
stored[n] = "";
|
||||
for (var i = 0; i < n; i++) {
|
||||
stored[n] += "C"
|
||||
}
|
||||
}
|
||||
body = storedBytes[n];
|
||||
body = stored[n];
|
||||
|
||||
} else if (command == 'buffer') {
|
||||
var n = ~~arg;
|
||||
if (n <= 0)
|
||||
throw new Error('buffer called with n <= 0');
|
||||
} else if (command == "buffer") {
|
||||
var n = parseInt(arg, 10)
|
||||
if (n <= 0) throw new Error("bytes called with n <= 0");
|
||||
if (storedBuffer[n] === undefined) {
|
||||
console.log('create storedBuffer[n]');
|
||||
console.log("create storedBuffer[n]");
|
||||
storedBuffer[n] = new Buffer(n);
|
||||
for (var i = 0; i < n; i++) {
|
||||
storedBuffer[n][i] = 'C'.charCodeAt(0);
|
||||
storedBuffer[n][i] = "C".charCodeAt(0);
|
||||
}
|
||||
}
|
||||
body = storedBuffer[n];
|
||||
|
||||
} else if (command == 'unicode') {
|
||||
var n = ~~arg;
|
||||
if (n <= 0)
|
||||
throw new Error('unicode called with n <= 0');
|
||||
if (storedUnicode[n] === undefined) {
|
||||
console.log('create storedUnicode[n]');
|
||||
storedUnicode[n] = makeString(n, '\u263A');
|
||||
}
|
||||
body = storedUnicode[n];
|
||||
|
||||
} else if (command == 'quit') {
|
||||
} else if (command == "quit") {
|
||||
res.connection.server.close();
|
||||
body = 'quitting';
|
||||
body = "quitting";
|
||||
|
||||
} else if (command == 'fixed') {
|
||||
} else if (command == "fixed") {
|
||||
body = fixed;
|
||||
|
||||
} else if (command == 'echo') {
|
||||
res.writeHead(200, { 'Content-Type': 'text/plain',
|
||||
'Transfer-Encoding': 'chunked' });
|
||||
req.pipe(res);
|
||||
return;
|
||||
|
||||
} else {
|
||||
status = 404;
|
||||
body = 'not found\n';
|
||||
body = "not found\n";
|
||||
}
|
||||
|
||||
// example: http://localhost:port/bytes/512/4
|
||||
// sends a 512 byte body in 4 chunks of 128 bytes
|
||||
if (n_chunks > 0) {
|
||||
res.writeHead(status, { 'Content-Type': 'text/plain',
|
||||
'Transfer-Encoding': 'chunked' });
|
||||
res.writeHead(status, { "Content-Type": "text/plain",
|
||||
"Transfer-Encoding": "chunked" });
|
||||
// send body in chunks
|
||||
var len = body.length;
|
||||
var step = Math.floor(len / n_chunks) || 1;
|
||||
var step = ~~(len / n_chunks) || len;
|
||||
|
||||
for (var i = 0, n = (n_chunks - 1); i < n; ++i) {
|
||||
res.write(body.slice(i * step, i * step + step));
|
||||
for (var i = 0; i < len; i += step) {
|
||||
res.write(body.slice(i, i + step));
|
||||
}
|
||||
res.end(body.slice((n_chunks - 1) * step));
|
||||
|
||||
res.end();
|
||||
} else {
|
||||
var content_length = body.length.toString();
|
||||
|
||||
res.writeHead(status, { 'Content-Type': 'text/plain',
|
||||
'Content-Length': content_length });
|
||||
res.writeHead(status, { "Content-Type": "text/plain",
|
||||
"Content-Length": content_length });
|
||||
res.end(body);
|
||||
}
|
||||
});
|
||||
|
||||
function makeString(size, c) {
|
||||
var s = '';
|
||||
while (s.length < size) {
|
||||
s += c;
|
||||
}
|
||||
return s;
|
||||
}
|
||||
});
|
||||
|
||||
server.listen(port, function () {
|
||||
console.log('Listening at http://127.0.0.1:'+port+'/');
|
||||
|
||||
@@ -1,127 +0,0 @@
|
||||
//
|
||||
// Usage:
|
||||
// node benchmark/http_simple_auto.js <args> <target>
|
||||
//
|
||||
// Where:
|
||||
// <args> Arguments to pass to `ab`.
|
||||
// <target> Target to benchmark, e.g. `bytes/1024` or `buffer/8192`.
|
||||
//
|
||||
|
||||
var path = require("path");
|
||||
var http = require("http");
|
||||
var spawn = require("child_process").spawn;
|
||||
|
||||
var port = parseInt(process.env.PORT || 8000);
|
||||
|
||||
var fixed = ""
|
||||
for (var i = 0; i < 20*1024; i++) {
|
||||
fixed += "C";
|
||||
}
|
||||
|
||||
var stored = {};
|
||||
var storedBuffer = {};
|
||||
|
||||
var server = http.createServer(function (req, res) {
|
||||
var commands = req.url.split("/");
|
||||
var command = commands[1];
|
||||
var body = "";
|
||||
var arg = commands[2];
|
||||
var n_chunks = parseInt(commands[3], 10);
|
||||
var status = 200;
|
||||
|
||||
if (command == "bytes") {
|
||||
var n = parseInt(arg, 10)
|
||||
if (n <= 0)
|
||||
throw "bytes called with n <= 0"
|
||||
if (stored[n] === undefined) {
|
||||
stored[n] = "";
|
||||
for (var i = 0; i < n; i++) {
|
||||
stored[n] += "C"
|
||||
}
|
||||
}
|
||||
body = stored[n];
|
||||
|
||||
} else if (command == "buffer") {
|
||||
var n = parseInt(arg, 10)
|
||||
if (n <= 0) throw new Error("bytes called with n <= 0");
|
||||
if (storedBuffer[n] === undefined) {
|
||||
storedBuffer[n] = new Buffer(n);
|
||||
for (var i = 0; i < n; i++) {
|
||||
storedBuffer[n][i] = "C".charCodeAt(0);
|
||||
}
|
||||
}
|
||||
body = storedBuffer[n];
|
||||
|
||||
} else if (command == "quit") {
|
||||
res.connection.server.close();
|
||||
body = "quitting";
|
||||
|
||||
} else if (command == "fixed") {
|
||||
body = fixed;
|
||||
|
||||
} else if (command == "echo") {
|
||||
res.writeHead(200, { "Content-Type": "text/plain",
|
||||
"Transfer-Encoding": "chunked" });
|
||||
req.pipe(res);
|
||||
return;
|
||||
|
||||
} else {
|
||||
status = 404;
|
||||
body = "not found\n";
|
||||
}
|
||||
|
||||
// example: http://localhost:port/bytes/512/4
|
||||
// sends a 512 byte body in 4 chunks of 128 bytes
|
||||
if (n_chunks > 0) {
|
||||
res.writeHead(status, { "Content-Type": "text/plain",
|
||||
"Transfer-Encoding": "chunked" });
|
||||
// send body in chunks
|
||||
var len = body.length;
|
||||
var step = Math.floor(len / n_chunks) || 1;
|
||||
|
||||
for (var i = 0, n = (n_chunks - 1); i < n; ++i) {
|
||||
res.write(body.slice(i * step, i * step + step));
|
||||
}
|
||||
res.end(body.slice((n_chunks - 1) * step));
|
||||
} else {
|
||||
var content_length = body.length.toString();
|
||||
|
||||
res.writeHead(status, { "Content-Type": "text/plain",
|
||||
"Content-Length": content_length });
|
||||
res.end(body);
|
||||
}
|
||||
|
||||
});
|
||||
|
||||
server.listen(port, function () {
|
||||
var url = 'http://127.0.0.1:' + port + '/';
|
||||
|
||||
var n = process.argv.length - 1;
|
||||
process.argv[n] = url + process.argv[n];
|
||||
|
||||
var cp = spawn('ab', process.argv.slice(2));
|
||||
cp.stdout.pipe(process.stdout);
|
||||
cp.stderr.pipe(process.stderr);
|
||||
cp.on('exit', function() {
|
||||
server.close();
|
||||
process.nextTick(dump_mm_stats);
|
||||
});
|
||||
});
|
||||
|
||||
function dump_mm_stats() {
|
||||
if (typeof gc != 'function') return;
|
||||
|
||||
var before = process.memoryUsage();
|
||||
for (var i = 0; i < 10; ++i) gc();
|
||||
var after = process.memoryUsage();
|
||||
setTimeout(print_stats, 250); // give GC time to settle
|
||||
|
||||
function print_stats() {
|
||||
console.log('\nBEFORE / AFTER GC');
|
||||
['rss', 'heapTotal', 'heapUsed'].forEach(function(key) {
|
||||
var a = before[key] / (1024 * 1024);
|
||||
var b = after[key] / (1024 * 1024);
|
||||
console.log('%sM / %sM %s', a.toFixed(2), b.toFixed(2), key);
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
var cluster = require('cluster');
|
||||
var os = require('os');
|
||||
|
||||
if (cluster.isMaster) {
|
||||
console.log('master running on pid %d', process.pid);
|
||||
for (var i = 0, n = os.cpus().length; i < n; ++i) cluster.fork();
|
||||
} else {
|
||||
require(__dirname + '/http_simple.js');
|
||||
}
|
||||
@@ -2,47 +2,41 @@
|
||||
* gcc -o iotest io.c
|
||||
*/
|
||||
|
||||
#include <assert.h>
|
||||
#include <unistd.h>
|
||||
#include <string.h>
|
||||
#include <fcntl.h>
|
||||
#include <sys/time.h>
|
||||
#include <assert.h>
|
||||
#include <stdlib.h>
|
||||
#include <stdint.h>
|
||||
#include <stdio.h>
|
||||
|
||||
static int c = 0;
|
||||
static int tsize = 1000 * 1048576;
|
||||
static const char path[] = "/tmp/wt.dat";
|
||||
static char buf[65536];
|
||||
int tsize = 1000 * 1048576;
|
||||
const char *path = "/tmp/wt.dat";
|
||||
|
||||
static uint64_t now(void) {
|
||||
struct timeval tv;
|
||||
int c = 0;
|
||||
|
||||
if (gettimeofday(&tv, NULL))
|
||||
abort();
|
||||
|
||||
return tv.tv_sec * 1000000ULL + tv.tv_usec;
|
||||
char* bufit(size_t l)
|
||||
{
|
||||
char *p = malloc(l);
|
||||
memset(p, '!', l);
|
||||
return p;
|
||||
}
|
||||
|
||||
static void writetest(int size, size_t bsize)
|
||||
void writetest(int size, size_t bsize)
|
||||
{
|
||||
int i;
|
||||
uint64_t start, end;
|
||||
char *buf = bufit(bsize);
|
||||
struct timeval start, end;
|
||||
double elapsed;
|
||||
double mbps;
|
||||
|
||||
assert(bsize <= sizeof buf);
|
||||
|
||||
int fd = open(path, O_CREAT|O_WRONLY, 0644);
|
||||
if (fd < 0) {
|
||||
perror("open failed");
|
||||
exit(254);
|
||||
}
|
||||
|
||||
start = now();
|
||||
|
||||
assert(0 == gettimeofday(&start, NULL));
|
||||
for (i = 0; i < size; i += bsize) {
|
||||
int rv = write(fd, buf, bsize);
|
||||
if (c++ % 2000 == 0) fprintf(stderr, ".");
|
||||
@@ -51,41 +45,35 @@ static void writetest(int size, size_t bsize)
|
||||
exit(254);
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef NSYNC
|
||||
# ifdef __linux__
|
||||
#ifdef __linux__
|
||||
fdatasync(fd);
|
||||
# else
|
||||
#else
|
||||
fsync(fd);
|
||||
# endif
|
||||
#endif /* SYNC */
|
||||
|
||||
#endif
|
||||
close(fd);
|
||||
|
||||
end = now();
|
||||
elapsed = (end - start) / 1e6;
|
||||
assert(0 == gettimeofday(&end, NULL));
|
||||
elapsed = (end.tv_sec - start.tv_sec) + ((double)(end.tv_usec - start.tv_usec))/100000.;
|
||||
mbps = ((tsize/elapsed)) / 1048576;
|
||||
|
||||
fprintf(stderr, "\nWrote %d bytes in %03fs using %ld byte buffers: %03fmB/s\n", size, elapsed, bsize, mbps);
|
||||
|
||||
free(buf);
|
||||
}
|
||||
|
||||
void readtest(int size, size_t bsize)
|
||||
{
|
||||
int i;
|
||||
uint64_t start, end;
|
||||
char *buf = bufit(bsize);
|
||||
struct timeval start, end;
|
||||
double elapsed;
|
||||
double mbps;
|
||||
|
||||
assert(bsize <= sizeof buf);
|
||||
|
||||
int fd = open(path, O_RDONLY, 0644);
|
||||
if (fd < 0) {
|
||||
perror("open failed");
|
||||
exit(254);
|
||||
}
|
||||
|
||||
start = now();
|
||||
|
||||
assert(0 == gettimeofday(&start, NULL));
|
||||
for (i = 0; i < size; i += bsize) {
|
||||
int rv = read(fd, buf, bsize);
|
||||
if (rv < 0) {
|
||||
@@ -94,12 +82,12 @@ void readtest(int size, size_t bsize)
|
||||
}
|
||||
}
|
||||
close(fd);
|
||||
|
||||
end = now();
|
||||
elapsed = (end - start) / 1e6;
|
||||
assert(0 == gettimeofday(&end, NULL));
|
||||
elapsed = (end.tv_sec - start.tv_sec) + ((double)(end.tv_usec - start.tv_usec))/100000.;
|
||||
mbps = ((tsize/elapsed)) / 1048576;
|
||||
|
||||
fprintf(stderr, "Read %d bytes in %03fs using %ld byte buffers: %03fmB/s\n", size, elapsed, bsize, mbps);
|
||||
|
||||
free(buf);
|
||||
}
|
||||
|
||||
void cleanup() {
|
||||
|
||||
@@ -62,7 +62,7 @@ function readtest(size, bsize) {
|
||||
|
||||
function wt(tsize, bsize, done) {
|
||||
var start = Date.now();
|
||||
s = writetest(tsize, bsize);
|
||||
s = writetest(tsize, bsizes[0]);
|
||||
s.addListener('close', function() {
|
||||
var end = Date.now();
|
||||
var diff = end - start;
|
||||
@@ -73,7 +73,7 @@ function wt(tsize, bsize, done) {
|
||||
|
||||
function rt(tsize, bsize, done) {
|
||||
var start = Date.now();
|
||||
s = readtest(tsize, bsize);
|
||||
s = readtest(tsize, bsizes[0]);
|
||||
s.addListener('close', function() {
|
||||
var end = Date.now();
|
||||
var diff = end - start;
|
||||
|
||||
@@ -1,41 +0,0 @@
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
// persons to whom the Software is furnished to do so, subject to the
|
||||
// following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
var count = 2e6,
|
||||
left = count,
|
||||
start;
|
||||
|
||||
function onNextTick() {
|
||||
if (--left) {
|
||||
process.nextTick(onNextTick);
|
||||
} else {
|
||||
finalize();
|
||||
}
|
||||
}
|
||||
|
||||
function finalize() {
|
||||
var duration = (new Date()).getTime() - start,
|
||||
ticksPerSec = count / duration * 1000;
|
||||
console.log("nextTick callbacks per second: " + Math.round(ticksPerSec));
|
||||
}
|
||||
|
||||
start = (new Date()).getTime();
|
||||
process.nextTick(onNextTick);
|
||||
@@ -1,17 +0,0 @@
|
||||
// run with `time node benchmark/next-tick.js`
|
||||
var assert = require('assert');
|
||||
|
||||
var N = 1e7;
|
||||
var n = 0;
|
||||
|
||||
process.on('exit', function() {
|
||||
assert.equal(n, N);
|
||||
});
|
||||
|
||||
function cb() {
|
||||
n++;
|
||||
}
|
||||
|
||||
for (var i = 0; i < N; ++i) {
|
||||
process.nextTick(cb);
|
||||
}
|
||||
@@ -1,43 +1,48 @@
|
||||
var http = require('http');
|
||||
var http = require("http");
|
||||
|
||||
var concurrency = 30;
|
||||
var port = 12346;
|
||||
var n = 700;
|
||||
var n = 7; // several orders of magnitude slower
|
||||
var bytes = 1024*5;
|
||||
|
||||
var requests = 0;
|
||||
var responses = 0;
|
||||
|
||||
var body = '';
|
||||
var body = "";
|
||||
for (var i = 0; i < bytes; i++) {
|
||||
body += 'C';
|
||||
body += "C";
|
||||
}
|
||||
|
||||
var server = http.createServer(function(req, res) {
|
||||
var server = http.createServer(function (req, res) {
|
||||
res.writeHead(200, {
|
||||
'Content-Type': 'text/plain',
|
||||
'Content-Length': body.length
|
||||
"Content-Type": "text/plain",
|
||||
"Content-Length": body.length
|
||||
});
|
||||
res.end(body);
|
||||
res.write(body);
|
||||
res.close();
|
||||
})
|
||||
server.listen(port);
|
||||
|
||||
server.listen(port, function() {
|
||||
var agent = new http.Agent();
|
||||
agent.maxSockets = concurrency;
|
||||
function responseListener (res) {
|
||||
res.addListener("end", function () {
|
||||
if (requests < n) {
|
||||
var req = res.client.request("/");
|
||||
req.addListener('response', responseListener);
|
||||
req.close();
|
||||
requests++;
|
||||
}
|
||||
|
||||
for (var i = 0; i < n; i++) {
|
||||
var req = http.get({
|
||||
port: port,
|
||||
path: '/',
|
||||
agent: agent
|
||||
}, function(res) {
|
||||
res.on('end', function() {
|
||||
if (++responses === n) {
|
||||
server.close();
|
||||
}
|
||||
});
|
||||
});
|
||||
req.id = i;
|
||||
requests++;
|
||||
}
|
||||
});
|
||||
if (++responses == n) {
|
||||
server.close();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
for (var i = 0; i < concurrency; i++) {
|
||||
var client = http.createClient(port);
|
||||
client.id = i;
|
||||
var req = client.request("/");
|
||||
req.addListener('response', responseListener);
|
||||
req.close();
|
||||
requests++;
|
||||
}
|
||||
|
||||
@@ -1,25 +0,0 @@
|
||||
var net = require('net');
|
||||
var received = 0;
|
||||
var start = new Date();
|
||||
var socket = net.connect(8000);
|
||||
|
||||
socket.on('data', function(d) {
|
||||
received += d.length;
|
||||
});
|
||||
|
||||
var interval = setInterval(function() {
|
||||
// After 1 gigabyte shutdown.
|
||||
if (received > 10 * 1024 * 1024 * 1024) {
|
||||
socket.destroy();
|
||||
clearInterval(interval);
|
||||
process.exit(0);
|
||||
} else {
|
||||
// Otherwise print some stats.
|
||||
var now = new Date();
|
||||
var gigabytes = received / (1024 * 1024 * 1024);
|
||||
var gigabits = gigabytes * 8.0;
|
||||
var millisec = now - start;
|
||||
var sec = millisec / 1000;
|
||||
console.log((gigabits / sec) + " gbit/sec")
|
||||
}
|
||||
}, 1000);
|
||||
@@ -1,21 +0,0 @@
|
||||
var fork = require('child_process').fork;
|
||||
var net = require('net');
|
||||
var buffer = new Buffer(1024 * 1024);
|
||||
|
||||
function write(socket) {
|
||||
if (!socket.writable) return;
|
||||
|
||||
socket.write(buffer, function() {
|
||||
write(socket);
|
||||
});
|
||||
}
|
||||
|
||||
var server = net.createServer(function(socket) {
|
||||
server.close();
|
||||
write(socket);
|
||||
});
|
||||
|
||||
server.listen(8000, function() {
|
||||
fork(__dirname + '/throughput-child.js');
|
||||
});
|
||||
|
||||
@@ -1,86 +0,0 @@
|
||||
|
||||
var assert = require('assert'),
|
||||
fs = require('fs'),
|
||||
path = require('path'),
|
||||
tls = require('tls');
|
||||
|
||||
|
||||
var target_connections = 10000,
|
||||
concurrency = 10;
|
||||
|
||||
for (var i = 2; i < process.argv.length; i++) {
|
||||
switch (process.argv[i]) {
|
||||
case '-c':
|
||||
concurrency = ~~process.argv[++i];
|
||||
break;
|
||||
|
||||
case '-n':
|
||||
target_connections = ~~process.argv[++i];
|
||||
break;
|
||||
|
||||
default:
|
||||
throw new Error('Invalid flag: ' + process.argv[i]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
var cert_dir = path.resolve(__dirname, '../test/fixtures'),
|
||||
options = { key: fs.readFileSync(cert_dir + '/test_key.pem'),
|
||||
cert: fs.readFileSync(cert_dir + '/test_cert.pem'),
|
||||
ca: [ fs.readFileSync(cert_dir + '/test_ca.pem') ] };
|
||||
|
||||
var server = tls.createServer(options, onConnection);
|
||||
server.listen(8000);
|
||||
|
||||
|
||||
var initiated_connections = 0,
|
||||
server_connections = 0,
|
||||
client_connections = 0,
|
||||
start = Date.now();
|
||||
|
||||
for (var i = 0; i < concurrency; i++)
|
||||
makeConnection();
|
||||
|
||||
|
||||
process.on('exit', onExit);
|
||||
|
||||
|
||||
function makeConnection() {
|
||||
if (initiated_connections >= target_connections)
|
||||
return;
|
||||
|
||||
initiated_connections++;
|
||||
|
||||
var conn = tls.connect(8000, function() {
|
||||
client_connections++;
|
||||
|
||||
if (client_connections % 100 === 0)
|
||||
console.log(client_connections + ' of ' + target_connections +
|
||||
' connections made');
|
||||
|
||||
conn.end();
|
||||
makeConnection();
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
function onConnection(conn) {
|
||||
server_connections++;
|
||||
|
||||
if (server_connections === target_connections)
|
||||
server.close();
|
||||
}
|
||||
|
||||
|
||||
function onExit() {
|
||||
var end = Date.now(),
|
||||
s = (end - start) / 1000,
|
||||
persec = Math.round(target_connections / s);
|
||||
|
||||
assert.equal(initiated_connections, target_connections);
|
||||
assert.equal(client_connections, target_connections);
|
||||
assert.equal(server_connections, target_connections);
|
||||
|
||||
console.log('%d connections in %d s', target_connections, s);
|
||||
console.log('%d connections per second', persec);
|
||||
}
|
||||
@@ -1,63 +0,0 @@
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
// persons to whom the Software is furnished to do so, subject to the
|
||||
// following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
if (!process.versions.openssl) {
|
||||
console.error('Skipping because node compiled without OpenSSL.');
|
||||
process.exit(0);
|
||||
}
|
||||
|
||||
var common = require('../common');
|
||||
var assert = require('assert');
|
||||
var tls = require('tls');
|
||||
var fs = require('fs');
|
||||
var path = require('path');
|
||||
|
||||
var options = {
|
||||
key: fs.readFileSync(path.join(common.fixturesDir, 'test_key.pem')),
|
||||
cert: fs.readFileSync(path.join(common.fixturesDir, 'test_cert.pem'))
|
||||
};
|
||||
|
||||
var fragment = 'fr';
|
||||
var dataSize = 1024 * 1024;
|
||||
var sent = 0;
|
||||
var received = 0;
|
||||
|
||||
var server = tls.createServer(options, function (stream) {
|
||||
for (sent = 0; sent <= dataSize; sent += fragment.length) {
|
||||
stream.write(fragment);
|
||||
}
|
||||
stream.end();
|
||||
});
|
||||
|
||||
server.listen(common.PORT, function () {
|
||||
var client = tls.connect(common.PORT, function () {
|
||||
client.on('data', function (data) {
|
||||
received += data.length;
|
||||
});
|
||||
client.on('end', function () {
|
||||
server.close();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
process.on('exit', function () {
|
||||
assert.equal(sent, received);
|
||||
});
|
||||
4
cmake/CTestCustom.cmake
Normal file
4
cmake/CTestCustom.cmake
Normal file
@@ -0,0 +1,4 @@
|
||||
set(CTEST_CUSTOM_PRE_TEST "sh -c \"rm -rf ../test/tmp && mkdir ../test/tmp\"")
|
||||
set(CTEST_CUSTOM_POST_TEST ${CTEST_CUSTOM_PRE_TEST})
|
||||
set(CTEST_CUSTOM_PRE_MEMCHECK ${CTEST_CUSTOM_PRE_TEST})
|
||||
set(CTEST_CUSTOM_POST_MEMCHECK ${CTEST_CUSTOM_PRE_TEST})
|
||||
22
cmake/codesourcery-arm-toolchain.cmake
Normal file
22
cmake/codesourcery-arm-toolchain.cmake
Normal file
@@ -0,0 +1,22 @@
|
||||
set(toolchain_dir #SET THIS TO YOUR TOOLCHAIN PATH)
|
||||
set(toolchain_bin_dir ${toolchain_dir}/bin)
|
||||
set(toolchain_libc_dir ${toolchain_dir}/arm-none-linux-gnueabi/libc)
|
||||
set(toolchain_inc_dir ${toolchain_libc_dir}/include)
|
||||
set(toolchain_lib_dir ${toolchain_libc_dir}/usr/lib)
|
||||
|
||||
set(CMAKE_SYSTEM_NAME Linux CACHE INTERNAL "system name")
|
||||
set(CMAKE_SYSTEM_PROCESSOR arm CACHE INTERNAL "processor")
|
||||
set(CMAKE_C_COMPILER ${toolchain_bin_dir}/arm-none-linux-gnueabi-gcc)
|
||||
set(CMAKE_CXX_COMPILER ${toolchain_bin_dir}/arm-none-linux-gnueabi-g++)
|
||||
set(CMAKE_C_FLAGS "-isystem ${toolchain_inc_dir}" CACHE INTERNAL "c compiler flags")
|
||||
set(CMAKE_CXX_FLAGS "-isystem ${toolchain_inc_dir}" CACHE INTERNAL "cxx compiler flags")
|
||||
|
||||
set(link_flags -L${toolchain_lib_dir})
|
||||
|
||||
set(CMAKE_EXE_LINKER_FLAGS ${link_flags} CACHE INTERNAL "exe link flags")
|
||||
set(CMAKE_MODULE_LINKER_FLAGS ${link_flags} CACHE INTERNAL "module link flags")
|
||||
set(CMAKE_SHARED_LINKER_FLAGS ${link_flags} CACHE INTERNAL "shared lnk flags")
|
||||
set(CMAKE_FIND_ROOT_PATH ${toolchain_libc_dir} CACHE INTERNAL "cross root directory")
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH CACHE INTERNAL "")
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_LIBRARY ONLY CACHE INTERNAL "")
|
||||
set(CMAKE_FIND_ROOT_PATH_MODE_INCLUDE ONLY CACHE INTERNAL "")
|
||||
114
cmake/configure.cmake
Normal file
114
cmake/configure.cmake
Normal file
@@ -0,0 +1,114 @@
|
||||
#
|
||||
# configure node for building
|
||||
#
|
||||
include(CheckFunctionExists)
|
||||
|
||||
|
||||
if(NOT "v${CMAKE_BUILD_TYPE}" MATCHES vDebug)
|
||||
set(CMAKE_BUILD_TYPE "Release")
|
||||
endif()
|
||||
|
||||
string(TOLOWER ${CMAKE_SYSTEM_NAME} node_platform)
|
||||
|
||||
if(${node_platform} MATCHES darwin)
|
||||
execute_process(COMMAND sw_vers -productVersion OUTPUT_VARIABLE OSX_VERSION)
|
||||
string(REGEX REPLACE "^([0-9]+\\.[0-9]+).*$" "\\1" OSX_VERSION "${OSX_VERSION}")
|
||||
|
||||
if(OSX_VERSION GREATER 10.5)
|
||||
# 10.6 builds are 64-bit
|
||||
set(CMAKE_SYSTEM_PROCESSOR x86_64)
|
||||
endif()
|
||||
endif()
|
||||
|
||||
# Get system architecture
|
||||
if(${CMAKE_SYSTEM_PROCESSOR} MATCHES i686*)
|
||||
set(node_arch x86)
|
||||
elseif(${CMAKE_SYSTEM_PROCESSOR} MATCHES i386*)
|
||||
set(node_arch x86)
|
||||
else()
|
||||
set(node_arch ${CMAKE_SYSTEM_PROCESSOR})
|
||||
endif()
|
||||
|
||||
if(${node_arch} MATCHES unknown)
|
||||
set(node_arch x86)
|
||||
endif()
|
||||
|
||||
set(NODE_INCLUDE_PREFIX ${CMAKE_INSTALL_PREFIX})
|
||||
|
||||
# Copy tools directory for out-of-source build
|
||||
string(COMPARE EQUAL $(PROJECT_BINARY_DIR) ${PROJECT_SOURCE_DIR} in_source_build)
|
||||
if(NOT in_source_build)
|
||||
execute_process(COMMAND cmake -E copy_directory ${PROJECT_SOURCE_DIR}/tools ${PROJECT_BINARY_DIR}/tools)
|
||||
configure_file(${PROJECT_SOURCE_DIR}/deps/v8/tools/jsmin.py ${PROJECT_BINARY_DIR}/tools COPYONLY)
|
||||
endif()
|
||||
|
||||
# Set some compiler/linker flags..
|
||||
set(CMAKE_C_FLAGS_DEBUG "-O0 -Wall -g -Wextra -DDEBUG $ENV{CFLAGS}")
|
||||
set(CMAKE_CXX_FLAGS_DEBUG "-O0 -Wall -g -Wextra -DDEBUG $ENV{CXXFLAGS}")
|
||||
|
||||
set(CMAKE_C_FLAGS_RELEASE "-g -O3 -DNDEBUG $ENV{CFLAGS}")
|
||||
set(CMAKE_CXX_FLAGS_RELEASE "-g -O3 -DNDEBUG $ENV{CXXFLAGS}")
|
||||
|
||||
if(NOT ${node_platform} MATCHES windows)
|
||||
add_definitions(-D__POSIX__=1)
|
||||
endif()
|
||||
|
||||
if(${node_platform} MATCHES sunos)
|
||||
add_definitions(-threads)
|
||||
elseif(NOT ${node_platform} MATCHES cygwin*)
|
||||
add_definitions(-pthread)
|
||||
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -rdynamic")
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -rdynamic")
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -pthread")
|
||||
endif()
|
||||
|
||||
if(${node_platform} MATCHES darwin)
|
||||
set(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -framework Carbon")
|
||||
# explicitly set this so that we don't check again when building libeio
|
||||
set(HAVE_FDATASYNC 0)
|
||||
else()
|
||||
# OSX fdatasync() check wrong: http://public.kitware.com/Bug/view.php?id=10044
|
||||
check_function_exists(fdatasync HAVE_FDATASYNC)
|
||||
endif()
|
||||
|
||||
if(HAVE_FDATASYNC)
|
||||
add_definitions(-DHAVE_FDATASYNC=1)
|
||||
else()
|
||||
add_definitions(-DHAVE_FDATASYNC=0)
|
||||
endif()
|
||||
|
||||
if(DTRACE)
|
||||
if(NOT ${node_platform} MATCHES sunos)
|
||||
message(FATAL_ERROR "DTrace support only currently available on Solaris")
|
||||
endif()
|
||||
find_program(dtrace_bin dtrace)
|
||||
if(NOT dtrace_bin)
|
||||
message(FATAL_ERROR "DTrace binary not found")
|
||||
endif()
|
||||
add_definitions(-DHAVE_DTRACE=1)
|
||||
endif()
|
||||
|
||||
add_definitions(
|
||||
-DPLATFORM="${node_platform}"
|
||||
-DX_STACKSIZE=65536
|
||||
-D_LARGEFILE_SOURCE
|
||||
-D_FILE_OFFSET_BITS=64
|
||||
-DEV_MULTIPLICITY=0
|
||||
-D_FORTIFY_SOURCE=2
|
||||
)
|
||||
|
||||
# set the exec output path to be compatible with the current waf build system
|
||||
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
|
||||
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/debug/)
|
||||
else()
|
||||
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_BINARY_DIR}/default/)
|
||||
endif()
|
||||
|
||||
#
|
||||
## ---------------------------------------------------------
|
||||
#
|
||||
|
||||
file(GLOB js2c_files ${PROJECT_SOURCE_DIR}/lib/*.js)
|
||||
set(js2c_files ${PROJECT_SOURCE_DIR}/src/node.js ${js2c_files})
|
||||
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/src)
|
||||
|
||||
80
cmake/docs.cmake
Normal file
80
cmake/docs.cmake
Normal file
@@ -0,0 +1,80 @@
|
||||
#
|
||||
# docs
|
||||
#
|
||||
|
||||
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/doc)
|
||||
|
||||
set(node_binary ${PROJECT_BINARY_DIR}/default/node)
|
||||
set(doctool tools/doctool/doctool.js)
|
||||
set(changelog_html ${PROJECT_BINARY_DIR}/doc/changelog.html)
|
||||
|
||||
file(GLOB_RECURSE doc_sources RELATIVE ${PROJECT_SOURCE_DIR} doc/*)
|
||||
|
||||
foreach(FILE ${doc_sources})
|
||||
string(REGEX REPLACE "(.*)api_assets(.*)" "\\1api/assets\\2" OUT_FILE ${FILE})
|
||||
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/${OUT_FILE}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/${FILE} ${PROJECT_BINARY_DIR}/${OUT_FILE}
|
||||
DEPENDS ${PROJECT_SOURCE_DIR}/${FILE}
|
||||
)
|
||||
list(APPEND doc_sources_copy ${PROJECT_BINARY_DIR}/${OUT_FILE})
|
||||
endforeach()
|
||||
|
||||
file(GLOB_RECURSE api_markdown RELATIVE ${PROJECT_SOURCE_DIR} ${PROJECT_SOURCE_DIR}/doc/api/*)
|
||||
|
||||
foreach(file ${api_markdown})
|
||||
string(REGEX REPLACE "(.*)\\.markdown" "\\1" tmp ${file})
|
||||
set(api_basenames ${api_basenames} ${tmp})
|
||||
endforeach()
|
||||
|
||||
foreach(api ${api_basenames})
|
||||
set(api_html ${api_html} ${PROJECT_BINARY_DIR}/${api}.html)
|
||||
add_custom_command(
|
||||
OUTPUT "${PROJECT_BINARY_DIR}/${api}.html"
|
||||
COMMAND ${node_binary} ${doctool} ${PROJECT_BINARY_DIR}/doc/template.html "${PROJECT_BINARY_DIR}/${api}.markdown" > "${PROJECT_BINARY_DIR}/${api}.html"
|
||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
DEPENDS node ${doctool} ${doc_sources_copy}
|
||||
VERBATIM
|
||||
)
|
||||
endforeach()
|
||||
|
||||
add_custom_target(
|
||||
doc
|
||||
DEPENDS node ${doc_sources_copy} ${api_html} ${changelog_html}
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}
|
||||
)
|
||||
|
||||
#add_custom_command(
|
||||
# OUTPUT ${PROJECT_BINARY_DIR}/doc/api.html
|
||||
# COMMAND ${PROJECT_BINARY_DIR}/default/node tools/ronnjs/bin/ronn.js --fragment doc/api.markdown
|
||||
# | sed "s/<h2>\\\(.*\\\)<\\/h2>/<h2 id=\"\\1\">\\1<\\/h2>/g"
|
||||
# | cat doc/api_header.html - doc/api_footer.html > ${PROJECT_BINARY_DIR}/doc/api.html
|
||||
# WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
# DEPENDS node doc/api.markdown doc/api_header.html doc/api_footer.html
|
||||
# VERBATIM
|
||||
# )
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${changelog_html}
|
||||
COMMAND ${node_binary} ${doctool} doc/template.html ChangeLog
|
||||
| sed "s|assets/|api/assets/|g"
|
||||
| sed "s|<body>|<body id=\"changelog\">|g" > ${changelog_html}
|
||||
WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
DEPENDS ChangeLog node ${doctool} ${doc_sources_copy}
|
||||
VERBATIM
|
||||
)
|
||||
|
||||
#add_custom_command(
|
||||
# OUTPUT ${PROJECT_BINARY_DIR}/doc/changelog.html
|
||||
# COMMAND cat doc/changelog_header.html ChangeLog doc/changelog_footer.html > ${PROJECT_BINARY_DIR}/doc/changelog.html
|
||||
# WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
# DEPENDS ChangeLog doc/changelog_header.html doc/changelog_footer.html
|
||||
# VERBATIM
|
||||
# )
|
||||
|
||||
#add_custom_command(
|
||||
# OUTPUT ${PROJECT_BINARY_DIR}/doc/node.1
|
||||
# COMMAND ${PROJECT_BINARY_DIR}/default/node tools/ronnjs/bin/ronn.js --roff doc/api.markdown > ${PROJECT_BINARY_DIR}/doc/node.1
|
||||
# WORKING_DIRECTORY ${PROJECT_SOURCE_DIR}
|
||||
# DEPENDS node doc/api.markdown tools/ronnjs/bin/ronn.js
|
||||
# VERBATIM
|
||||
# )
|
||||
18
cmake/libc-ares.cmake
Normal file
18
cmake/libc-ares.cmake
Normal file
@@ -0,0 +1,18 @@
|
||||
if(SHARED_CARES)
|
||||
find_library(LIBCARES_LIBRARY NAMES cares)
|
||||
find_path(LIBCARES_INCLUDE_DIR ares.h
|
||||
PATH_SUFFIXES include
|
||||
) # Find header
|
||||
find_package_handle_standard_args(libcares DEFAULT_MSG LIBCARES_LIBRARY LIBCARES_INCLUDE_DIR)
|
||||
else()
|
||||
set(cares_arch ${node_arch})
|
||||
|
||||
if(${node_arch} MATCHES x86_64)
|
||||
set(cares_arch x64)
|
||||
elseif(${node_arch} MATCHES x86)
|
||||
set(cares_arch ia32)
|
||||
endif()
|
||||
|
||||
add_subdirectory(deps/c-ares)
|
||||
set(LIBCARES_INCLUDE_DIR ${CMAKE_SOURCE_DIR}/deps/c-ares ${CMAKE_SOURCE_DIR}/deps/c-ares/${node_platform}-${cares_arch})
|
||||
endif()
|
||||
10
cmake/libev.cmake
Normal file
10
cmake/libev.cmake
Normal file
@@ -0,0 +1,10 @@
|
||||
if(SHARED_LIBEV)
|
||||
find_library(LIBEV_LIBRARY NAMES ev)
|
||||
find_path(LIBEV_INCLUDE_DIR ev.h
|
||||
PATH_SUFFIXES include/ev include
|
||||
) # Find header
|
||||
find_package_handle_standard_args(libev DEFAULT_MSG LIBEV_LIBRARY LIBEV_INCLUDE_DIR)
|
||||
else()
|
||||
add_subdirectory(deps/libev)
|
||||
set(LIBEV_INCLUDE_DIR deps/libev)
|
||||
endif()
|
||||
55
cmake/libs.cmake
Normal file
55
cmake/libs.cmake
Normal file
@@ -0,0 +1,55 @@
|
||||
#
|
||||
# libraries
|
||||
#
|
||||
|
||||
include(CheckLibraryExists)
|
||||
include(FindPackageHandleStandardArgs)
|
||||
set(HAVE_CONFIG_H True)
|
||||
add_definitions(-DHAVE_CONFIG_H=1)
|
||||
|
||||
find_package(OpenSSL QUIET)
|
||||
find_package(Threads)
|
||||
find_library(RT rt)
|
||||
find_library(DL dl)
|
||||
check_library_exists(socket socket "" HAVE_SOCKET_LIB)
|
||||
check_library_exists(nsl gethostbyname "" HAVE_NSL_LIB)
|
||||
check_library_exists(util openpty "" HAVE_UTIL_LIB)
|
||||
|
||||
if(RT)
|
||||
set(extra_libs ${extra_libs} ${RT})
|
||||
endif()
|
||||
|
||||
if(DL)
|
||||
set(extra_libs ${extra_libs} ${DL})
|
||||
endif()
|
||||
|
||||
if(${node_platform} MATCHES freebsd)
|
||||
find_library(KVM NAMES kvm)
|
||||
set(extra_libs ${extra_libs} KVM)
|
||||
endif()
|
||||
|
||||
if(${HAVE_SOCKET_LIB})
|
||||
set(extra_libs ${extra_libs} socket)
|
||||
endif()
|
||||
|
||||
if(${HAVE_NSL_LIB})
|
||||
set(extra_libs ${extra_libs} nsl)
|
||||
endif()
|
||||
|
||||
if(HAVE_UTIL_LIB)
|
||||
set(extra_libs ${extra_libs} util)
|
||||
endif()
|
||||
|
||||
if(OPENSSL_FOUND)
|
||||
add_definitions(-DHAVE_OPENSSL=1)
|
||||
set(HAVE_OPENSSL True)
|
||||
set(node_extra_src ${node_extra_src} src/node_crypto.cc)
|
||||
set(extra_libs ${extra_libs} ${OPENSSL_LIBRARIES})
|
||||
endif()
|
||||
|
||||
include("cmake/libc-ares.cmake")
|
||||
include("cmake/libev.cmake")
|
||||
include("cmake/libv8.cmake")
|
||||
|
||||
add_subdirectory(deps/libeio)
|
||||
add_subdirectory(deps/http_parser)
|
||||
25
cmake/libv8.cmake
Normal file
25
cmake/libv8.cmake
Normal file
@@ -0,0 +1,25 @@
|
||||
set(V8_INCLUDE_NAMES v8.h v8-debug.h v8-profiler.h v8stdint.h)
|
||||
set(V8_LIBRARY_NAMES v8)
|
||||
|
||||
if(SHARED_V8)
|
||||
find_path(V8_INCLUDE_DIR NAMES ${V8_INCLUDE_NAMES})
|
||||
find_library(V8_LIBRARY_PATH NAMES ${V8_LIBRARY_NAMES} NO_CMAKE_PATH)
|
||||
else()
|
||||
set(V8_INCLUDE_DIR "${PROJECT_BINARY_DIR}/deps/v8/include")
|
||||
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
|
||||
set(v8_fn "libv8_g.a")
|
||||
else()
|
||||
set(v8_fn "libv8.a")
|
||||
endif()
|
||||
set(V8_LIBRARY_PATH "${PROJECT_BINARY_DIR}/deps/v8/${v8_fn}")
|
||||
install(DIRECTORY
|
||||
## Do NOT remove the trailing slash
|
||||
## it is required so that v8 headers are
|
||||
## copied directly into include/node
|
||||
## rather than in a subdirectory
|
||||
## See CMake's install(DIRECTORY) manual for details
|
||||
${V8_INCLUDE_DIR}/
|
||||
|
||||
DESTINATION include/node
|
||||
)
|
||||
endif()
|
||||
146
cmake/node_build.cmake
Normal file
146
cmake/node_build.cmake
Normal file
@@ -0,0 +1,146 @@
|
||||
#
|
||||
# node build stuff
|
||||
#
|
||||
|
||||
set(macros_file ${PROJECT_BINARY_DIR}/macros.py)
|
||||
|
||||
# replace debug(x) and assert(x) with nothing in release build
|
||||
if(${CMAKE_BUILD_TYPE} MATCHES Release)
|
||||
file(APPEND ${macros_file} "macro debug(x) = void(0);\n")
|
||||
file(APPEND ${macros_file} "macro assert(x) = void(0);\n")
|
||||
endif()
|
||||
|
||||
if(NOT DTRACE)
|
||||
set(dtrace_probes
|
||||
DTRACE_HTTP_CLIENT_REQUEST
|
||||
DTRACE_HTTP_CLIENT_RESPONSE
|
||||
DTRACE_HTTP_SERVER_REQUEST
|
||||
DTRACE_HTTP_SERVER_RESPONSE
|
||||
DTRACE_NET_SERVER_CONNECTION
|
||||
DTRACE_NET_STREAM_END
|
||||
DTRACE_NET_SOCKET_READ
|
||||
DTRACE_NET_SOCKET_WRITE)
|
||||
foreach(probe ${dtrace_probes})
|
||||
file(APPEND ${macros_file} "macro ${probe}(x) = void(0);\n")
|
||||
endforeach()
|
||||
endif()
|
||||
|
||||
# Sort the JS files being built into natives so that the build is
|
||||
# deterministic
|
||||
list(SORT js2c_files)
|
||||
|
||||
# include macros file in generation
|
||||
set(js2c_files ${js2c_files} ${macros_file})
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${PROJECT_BINARY_DIR}/src/node_natives.h
|
||||
COMMAND ${PYTHON_EXECUTABLE} ${PROJECT_BINARY_DIR}/tools/js2c.py ${PROJECT_BINARY_DIR}/src/node_natives.h ${js2c_files}
|
||||
DEPENDS ${js2c_files})
|
||||
|
||||
set(node_platform_src "src/platform_${node_platform}.cc")
|
||||
|
||||
if(NOT EXISTS ${CMAKE_SOURCE_DIR}/${node_platform_src})
|
||||
set(node_extra_src ${node_extra_src} "src/platform_none.cc")
|
||||
else()
|
||||
set(node_extra_src ${node_extra_src} ${node_platform_src})
|
||||
endif()
|
||||
|
||||
set(node_sources
|
||||
src/node_main.cc
|
||||
src/node.cc
|
||||
src/node_buffer.cc
|
||||
src/node_javascript.cc
|
||||
src/node_extensions.cc
|
||||
src/node_http_parser.cc
|
||||
src/node_net.cc
|
||||
src/node_io_watcher.cc
|
||||
src/node_child_process.cc
|
||||
src/node_constants.cc
|
||||
src/node_cares.cc
|
||||
src/node_events.cc
|
||||
src/node_file.cc
|
||||
src/node_signal_watcher.cc
|
||||
src/node_stat_watcher.cc
|
||||
src/node_stdio.cc
|
||||
src/node_timer.cc
|
||||
src/node_script.cc
|
||||
src/node_os.cc
|
||||
src/node_dtrace.cc
|
||||
src/node_string.cc
|
||||
src/node_natives.h
|
||||
${node_extra_src})
|
||||
|
||||
# Set up PREFIX, CCFLAGS, and CPPFLAGS for node_config.h
|
||||
set(PREFIX ${CMAKE_INSTALL_PREFIX})
|
||||
if(${CMAKE_BUILD_TYPE} MATCHES Debug)
|
||||
set(CCFLAGS "${CMAKE_C_FLAGS_DEBUG} ${CMAKE_C_FLAGS}")
|
||||
else()
|
||||
set(CCFLAGS "${CMAKE_C_FLAGS_RELEASE} ${CMAKE_C_FLAGS}")
|
||||
endif()
|
||||
get_directory_property(compile_defs COMPILE_DEFINITIONS)
|
||||
foreach(def ${compile_defs})
|
||||
set(CPPFLAGS "${CPPFLAGS} -D${def}")
|
||||
endforeach()
|
||||
|
||||
configure_file(src/node_config.h.in ${PROJECT_BINARY_DIR}/src/node_config.h ESCAPE_QUOTES)
|
||||
configure_file(config.h.cmake ${PROJECT_BINARY_DIR}/config.h)
|
||||
|
||||
include_directories(
|
||||
src
|
||||
deps/libeio
|
||||
deps/http_parser
|
||||
${V8_INCLUDE_DIR}
|
||||
${LIBEV_INCLUDE_DIR}
|
||||
${LIBCARES_INCLUDE_DIR}
|
||||
|
||||
${PROJECT_BINARY_DIR}
|
||||
${PROJECT_BINARY_DIR}/src
|
||||
)
|
||||
|
||||
if(DTRACE)
|
||||
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src/node_provider.h
|
||||
COMMAND ${dtrace_bin} -x nolibs -h -o ${PROJECT_BINARY_DIR}/src/node_provider.h -s ${PROJECT_SOURCE_DIR}/src/node_provider.d
|
||||
DEPENDS ${PROJECT_SOURCE_DIR}/src/node_provider.d)
|
||||
|
||||
set(node_sources ${node_sources} src/node_provider.o)
|
||||
set(node_sources src/node_provider.h ${node_sources})
|
||||
endif()
|
||||
|
||||
add_executable(node ${node_sources})
|
||||
set_target_properties(node PROPERTIES DEBUG_POSTFIX "_g")
|
||||
target_link_libraries(node
|
||||
ev
|
||||
eio
|
||||
cares
|
||||
http_parser
|
||||
${V8_LIBRARY_PATH}
|
||||
${CMAKE_THREAD_LIBS_INIT}
|
||||
${extra_libs})
|
||||
|
||||
if(DTRACE)
|
||||
# manually gather up the object files for dtrace
|
||||
get_property(sourcefiles TARGET node PROPERTY SOURCES)
|
||||
foreach(src_file ${sourcefiles})
|
||||
if(src_file MATCHES ".*\\.cc$")
|
||||
set(node_objs ${node_objs} ${PROJECT_BINARY_DIR}/CMakeFiles/node.dir/${src_file}.o)
|
||||
endif()
|
||||
endforeach()
|
||||
|
||||
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/src/node_provider.o
|
||||
#COMMAND cmake -E echo ${node_objs}
|
||||
COMMAND ${dtrace_bin} -G -x nolibs -s ${PROJECT_SOURCE_DIR}/src/node_provider.d -o ${PROJECT_BINARY_DIR}/src/node_provider.o ${node_objs}
|
||||
DEPENDS ${node_objs})
|
||||
endif()
|
||||
|
||||
install(TARGETS node RUNTIME DESTINATION bin)
|
||||
install(FILES
|
||||
${PROJECT_BINARY_DIR}/config.h
|
||||
src/node.h
|
||||
src/node_object_wrap.h
|
||||
src/node_buffer.h
|
||||
src/node_events.h
|
||||
src/node_version.h
|
||||
${PROJECT_BINARY_DIR}/src/node_config.h
|
||||
|
||||
DESTINATION ${NODE_INCLUDE_PREFIX}/include/node
|
||||
)
|
||||
39
cmake/package.cmake
Normal file
39
cmake/package.cmake
Normal file
@@ -0,0 +1,39 @@
|
||||
#
|
||||
# package
|
||||
#
|
||||
|
||||
# Allow absolute paths when installing
|
||||
# see http://www.cmake.org/pipermail/cmake/2008-July/022958.html
|
||||
set(CPACK_SET_DESTDIR "ON")
|
||||
|
||||
if(${node_platform} MATCHES darwin)
|
||||
set(CPACK_GENERATOR "TGZ;PackageMaker")
|
||||
# CPack requires the files to end in .txt
|
||||
configure_file(LICENSE ${PROJECT_BINARY_DIR}/LICENSE.txt COPYONLY)
|
||||
configure_file(ChangeLog ${PROJECT_BINARY_DIR}/ChangeLog.txt COPYONLY)
|
||||
set(CPACK_RESOURCE_FILE_LICENSE "${PROJECT_BINARY_DIR}/LICENSE.txt")
|
||||
set(CPACK_RESOURCE_FILE_README "${PROJECT_BINARY_DIR}/ChangeLog.txt")
|
||||
#set(CPACK_RESOURCE_FILE_WELCOME "")
|
||||
elseif(${node_platform} MATCHES linux)
|
||||
set(CPACK_GENERATOR "TGZ;DEB;RPM")
|
||||
else()
|
||||
set(CPACK_GENERATOR "TGZ")
|
||||
endif()
|
||||
set(CPACK_DEBIAN_PACKAGE_MAINTAINER "Tom Hughes <tom.hughes@palm.com>")
|
||||
set(CPACK_PACKAGE_DESCRIPTION_SUMMARY "Evented I/O for V8 JavaScript.")
|
||||
set(CPACK_PACKAGE_DESCRIPTION "Evented I/O for V8 JavaScript.
|
||||
Node's goal is to provide an easy way to build scalable network programs.
|
||||
Node is similar in design to and influenced by systems like Ruby's Event
|
||||
Machine or Python's Twisted. Node takes the event model a bit further—it
|
||||
presents the event loop as a language construct instead of as a library.")
|
||||
set(CPACK_DEBIAN_PACKAGE_DESCRIPTION "${CPACK_PACKAGE_DESCRIPTION}")
|
||||
set(CPACK_DEBIAN_PACKAGE_SECTION "web")
|
||||
file(READ ${PROJECT_SOURCE_DIR}/src/node_version.h node_version_h OFFSET 0)
|
||||
string(REGEX REPLACE ".*NODE_MAJOR_VERSION[ ]*([0-9]+).*" "\\1" CPACK_PACKAGE_VERSION_MAJOR "${node_version_h}")
|
||||
string(REGEX REPLACE ".*NODE_MINOR_VERSION[ ]*([0-9]+).*" "\\1" CPACK_PACKAGE_VERSION_MINOR "${node_version_h}")
|
||||
string(REGEX REPLACE ".*NODE_PATCH_VERSION[ ]*([0-9]+).*" "\\1" CPACK_PACKAGE_VERSION_PATCH "${node_version_h}")
|
||||
set(node_version_string "${CPACK_PACKAGE_VERSION_MAJOR}.${CPACK_PACKAGE_VERSION_MINOR}.${CPACK_PACKAGE_VERSION_PATCH}")
|
||||
|
||||
# Note: this is intentionally at the bottom so that the above CPACK variables
|
||||
# are used by CPack.
|
||||
include(CPack)
|
||||
102
cmake/v8_build.cmake
Normal file
102
cmake/v8_build.cmake
Normal file
@@ -0,0 +1,102 @@
|
||||
#
|
||||
# v8 build stuff
|
||||
#
|
||||
|
||||
string(TOLOWER ${CMAKE_BUILD_TYPE} v8mode)
|
||||
set(v8arch ${node_arch})
|
||||
|
||||
if(${node_arch} MATCHES x86_64)
|
||||
set(v8arch x64)
|
||||
elseif(${node_arch} MATCHES x86)
|
||||
set(v8arch ia32)
|
||||
endif()
|
||||
|
||||
|
||||
if(NOT SHARED_V8)
|
||||
if(V8_SNAPSHOT)
|
||||
set(v8_snapshot snapshot=on)
|
||||
endif()
|
||||
|
||||
if(V8_OPROFILE)
|
||||
set(v8_oprofile prof=oprofile)
|
||||
endif()
|
||||
|
||||
if(V8_GDBJIT)
|
||||
set(v8_gdbjit gdbjit=on)
|
||||
endif()
|
||||
|
||||
if(${node_platform} MATCHES darwin)
|
||||
execute_process(COMMAND hwprefs cpu_count OUTPUT_VARIABLE cpu_count)
|
||||
elseif(${node_platform} MATCHES linux)
|
||||
execute_process(COMMAND sh -c "cat /proc/cpuinfo | grep processor | sort | uniq | wc -l"
|
||||
OUTPUT_VARIABLE cpu_count)
|
||||
elseif(${node_platform} MATCHES sunos)
|
||||
execute_process(COMMAND sh -c "psrinfo | wc -l" OUTPUT_VARIABLE cpu_count)
|
||||
else()
|
||||
set(cpu_count 1)
|
||||
endif()
|
||||
|
||||
if(${cpu_count} GREATER 1)
|
||||
math(EXPR parallel_jobs ${cpu_count}*2)
|
||||
else()
|
||||
set(parallel_jobs 1)
|
||||
endif()
|
||||
|
||||
add_library(v8 STATIC IMPORTED)
|
||||
set_property(TARGET v8
|
||||
PROPERTY IMPORTED_LOCATION ${PROJECT_BINARY_DIR}/deps/v8/${v8_fn})
|
||||
|
||||
set(compile_env_vars "CC=${CMAKE_C_COMPILER} CXX=${CMAKE_CXX_COMPILER} AR=${CMAKE_AR} RANLIB=${CMAKE_RANLIB} CFLAGS=\"${CMAKE_C_FLAGS}\" CXXFLAGS=\"${CMAKE_CXX_FLAGS}\" LDFLAGS=\"${CMAKE_EXE_LINKER_FLAGS}\"")
|
||||
|
||||
set(compile_cmd "${compile_env_vars} ${PYTHON_EXECUTABLE} ${PROJECT_BINARY_DIR}/tools/scons/scons.py -j ${parallel_jobs} visibility=default mode=${v8mode} arch=${v8arch} library=static ${v8_snapshot} ${v8_oprofile} ${v8_gdbjit} verbose=on")
|
||||
|
||||
|
||||
if(CMAKE_VERSION VERSION_GREATER 2.8 OR CMAKE_VERSION VERSION_EQUAL 2.8)
|
||||
# use ExternalProject for CMake >2.8
|
||||
include(ExternalProject)
|
||||
|
||||
ExternalProject_Add(v8_extprj
|
||||
URL ${PROJECT_SOURCE_DIR}/deps/v8
|
||||
|
||||
BUILD_IN_SOURCE True
|
||||
BUILD_COMMAND sh -c "${compile_cmd}"
|
||||
SOURCE_DIR ${PROJECT_BINARY_DIR}/deps/v8
|
||||
# ignore this stuff, it's not needed for building v8 but ExternalProject
|
||||
# demands these steps
|
||||
|
||||
CONFIGURE_COMMAND "true" # fake configure
|
||||
INSTALL_COMMAND "true" # fake install
|
||||
)
|
||||
|
||||
add_dependencies(node v8_extprj)
|
||||
else()
|
||||
# copy v8 sources inefficiently with CMake versions <2.8
|
||||
file(GLOB_RECURSE v8_sources RELATIVE ${PROJECT_SOURCE_DIR} deps/v8/*)
|
||||
|
||||
if(NOT ${in_source_build})
|
||||
file(MAKE_DIRECTORY ${PROJECT_BINARY_DIR}/deps/v8)
|
||||
|
||||
foreach(FILE ${v8_sources})
|
||||
add_custom_command(OUTPUT ${PROJECT_BINARY_DIR}/${FILE}
|
||||
COMMAND ${CMAKE_COMMAND} -E copy_if_different ${PROJECT_SOURCE_DIR}/${FILE} ${PROJECT_BINARY_DIR}/${FILE}
|
||||
DEPENDS ${PROJECT_SOURCE_DIR}/${FILE}
|
||||
)
|
||||
list(APPEND v8_sources_dest ${PROJECT_BINARY_DIR}/${FILE})
|
||||
endforeach()
|
||||
else()
|
||||
set(v8_sources_dest ${v8_sources})
|
||||
endif()
|
||||
|
||||
add_custom_command(
|
||||
OUTPUT ${PROJECT_BINARY_DIR}/deps/v8/${v8_fn}
|
||||
COMMAND sh -c "${compile_cmd}"
|
||||
WORKING_DIRECTORY ${PROJECT_BINARY_DIR}/deps/v8/
|
||||
DEPENDS ${v8_sources_dest}
|
||||
)
|
||||
|
||||
add_custom_target(v8_stock ALL DEPENDS ${PROJECT_BINARY_DIR}/deps/v8/${v8_fn})
|
||||
set_property(TARGET v8 PROPERTY
|
||||
IMPORTED_LOCATION ${PROJECT_BINARY_DIR}/deps/v8/${v8_fn})
|
||||
add_dependencies(node v8_stock)
|
||||
endif()
|
||||
endif()
|
||||
225
common.gypi
225
common.gypi
@@ -1,225 +0,0 @@
|
||||
{
|
||||
'variables': {
|
||||
'visibility%': 'hidden', # V8's visibility setting
|
||||
'target_arch%': 'ia32', # set v8's target architecture
|
||||
'host_arch%': 'ia32', # set v8's host architecture
|
||||
'want_separate_host_toolset': 0, # V8 should not build target and host
|
||||
'library%': 'static_library', # allow override to 'shared_library' for DLL/.so builds
|
||||
'component%': 'static_library', # NB. these names match with what V8 expects
|
||||
'msvs_multi_core_compile': '0', # we do enable multicore compiles, but not using the V8 way
|
||||
'gcc_version%': 'unknown',
|
||||
'clang%': 0,
|
||||
|
||||
# Turn on optimizations that may trigger compiler bugs.
|
||||
# Use at your own risk. Do *NOT* report bugs if this option is enabled.
|
||||
'node_unsafe_optimizations%': 0,
|
||||
|
||||
# Enable V8's post-mortem debugging only on unix flavors.
|
||||
'conditions': [
|
||||
['OS != "win"', {
|
||||
'v8_postmortem_support': 'true'
|
||||
}]
|
||||
],
|
||||
},
|
||||
|
||||
'target_defaults': {
|
||||
'default_configuration': 'Release',
|
||||
'configurations': {
|
||||
'Debug': {
|
||||
'defines': [ 'DEBUG', '_DEBUG' ],
|
||||
'cflags': [ '-g', '-O0' ],
|
||||
'conditions': [
|
||||
['target_arch=="x64"', {
|
||||
'msvs_configuration_platform': 'x64',
|
||||
}],
|
||||
],
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
||||
'RuntimeLibrary': 1, # static debug
|
||||
'Optimization': 0, # /Od, no optimization
|
||||
'MinimalRebuild': 'false',
|
||||
'OmitFramePointers': 'false',
|
||||
'BasicRuntimeChecks': 3, # /RTC1
|
||||
},
|
||||
'VCLinkerTool': {
|
||||
'LinkIncremental': 2, # enable incremental linking
|
||||
},
|
||||
},
|
||||
},
|
||||
'Release': {
|
||||
'conditions': [
|
||||
['target_arch=="x64"', {
|
||||
'msvs_configuration_platform': 'x64',
|
||||
}],
|
||||
['node_unsafe_optimizations==1', {
|
||||
'cflags': [ '-O3', '-ffunction-sections', '-fdata-sections' ],
|
||||
'ldflags': [ '-Wl,--gc-sections' ],
|
||||
}, {
|
||||
'cflags': [ '-O2', '-fno-strict-aliasing' ],
|
||||
'cflags!': [ '-O3', '-fstrict-aliasing' ],
|
||||
'conditions': [
|
||||
# Required by the dtrace post-processor. Unfortunately,
|
||||
# some gcc/binutils combos generate bad code when
|
||||
# -ffunction-sections is enabled. Let's hope for the best.
|
||||
['OS=="solaris"', {
|
||||
'cflags': [ '-ffunction-sections', '-fdata-sections' ],
|
||||
}, {
|
||||
'cflags!': [ '-ffunction-sections', '-fdata-sections' ],
|
||||
}],
|
||||
['clang == 0 and gcc_version >= 40', {
|
||||
'cflags': [ '-fno-tree-vrp' ],
|
||||
}],
|
||||
['clang == 0 and gcc_version <= 44', {
|
||||
'cflags': [ '-fno-tree-sink' ],
|
||||
}],
|
||||
],
|
||||
}],
|
||||
['OS=="solaris"', {
|
||||
'cflags': [ '-fno-omit-frame-pointer' ],
|
||||
# pull in V8's postmortem metadata
|
||||
'ldflags': [ '-Wl,-z,allextract' ]
|
||||
}],
|
||||
],
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
||||
'RuntimeLibrary': 0, # static release
|
||||
'Optimization': 3, # /Ox, full optimization
|
||||
'FavorSizeOrSpeed': 1, # /Ot, favour speed over size
|
||||
'InlineFunctionExpansion': 2, # /Ob2, inline anything eligible
|
||||
'WholeProgramOptimization': 'true', # /GL, whole program optimization, needed for LTCG
|
||||
'OmitFramePointers': 'true',
|
||||
'EnableFunctionLevelLinking': 'true',
|
||||
'EnableIntrinsicFunctions': 'true',
|
||||
'RuntimeTypeInfo': 'false',
|
||||
'ExceptionHandling': '0',
|
||||
'AdditionalOptions': [
|
||||
'/MP', # compile across multiple CPUs
|
||||
],
|
||||
},
|
||||
'VCLibrarianTool': {
|
||||
'AdditionalOptions': [
|
||||
'/LTCG', # link time code generation
|
||||
],
|
||||
},
|
||||
'VCLinkerTool': {
|
||||
'LinkTimeCodeGeneration': 1, # link-time code generation
|
||||
'OptimizeReferences': 2, # /OPT:REF
|
||||
'EnableCOMDATFolding': 2, # /OPT:ICF
|
||||
'LinkIncremental': 1, # disable incremental linking
|
||||
},
|
||||
},
|
||||
}
|
||||
},
|
||||
'msvs_settings': {
|
||||
'VCCLCompilerTool': {
|
||||
'StringPooling': 'true', # pool string literals
|
||||
'DebugInformationFormat': 3, # Generate a PDB
|
||||
'WarningLevel': 3,
|
||||
'BufferSecurityCheck': 'true',
|
||||
'ExceptionHandling': 1, # /EHsc
|
||||
'SuppressStartupBanner': 'true',
|
||||
'WarnAsError': 'false',
|
||||
},
|
||||
'VCLibrarianTool': {
|
||||
},
|
||||
'VCLinkerTool': {
|
||||
'conditions': [
|
||||
['target_arch=="x64"', {
|
||||
'TargetMachine' : 17 # /MACHINE:X64
|
||||
}],
|
||||
],
|
||||
'GenerateDebugInformation': 'true',
|
||||
'RandomizedBaseAddress': 2, # enable ASLR
|
||||
'DataExecutionPrevention': 2, # enable DEP
|
||||
'AllowIsolation': 'true',
|
||||
'SuppressStartupBanner': 'true',
|
||||
'target_conditions': [
|
||||
['_type=="executable"', {
|
||||
'SubSystem': 1, # console executable
|
||||
}],
|
||||
],
|
||||
},
|
||||
},
|
||||
'conditions': [
|
||||
['OS == "win"', {
|
||||
'msvs_cygwin_shell': 0, # prevent actions from trying to use cygwin
|
||||
'defines': [
|
||||
'WIN32',
|
||||
# we don't really want VC++ warning us about
|
||||
# how dangerous C functions are...
|
||||
'_CRT_SECURE_NO_DEPRECATE',
|
||||
# ... or that C implementations shouldn't use
|
||||
# POSIX names
|
||||
'_CRT_NONSTDC_NO_DEPRECATE',
|
||||
'BUILDING_V8_SHARED=1',
|
||||
'BUILDING_UV_SHARED=1',
|
||||
],
|
||||
}, {
|
||||
'defines': [
|
||||
'_LARGEFILE_SOURCE',
|
||||
'_FILE_OFFSET_BITS=64',
|
||||
],
|
||||
}],
|
||||
[ 'OS=="linux" or OS=="freebsd" or OS=="openbsd" or OS=="solaris"', {
|
||||
'cflags': [ '-Wall', '-pthread', ],
|
||||
'cflags_cc': [ '-fno-rtti', '-fno-exceptions' ],
|
||||
'ldflags': [ '-pthread', '-rdynamic' ],
|
||||
'conditions': [
|
||||
[ 'target_arch=="ia32"', {
|
||||
'cflags': [ '-m32' ],
|
||||
'ldflags': [ '-m32' ],
|
||||
}],
|
||||
[ 'target_arch=="x64"', {
|
||||
'cflags': [ '-m64' ],
|
||||
'ldflags': [ '-m64' ],
|
||||
}],
|
||||
[ 'OS=="solaris"', {
|
||||
'cflags': [ '-pthreads' ],
|
||||
'ldflags': [ '-pthreads' ],
|
||||
'cflags!': [ '-pthread' ],
|
||||
'ldflags!': [ '-pthread' ],
|
||||
}],
|
||||
],
|
||||
}],
|
||||
['OS=="mac"', {
|
||||
'defines': ['_DARWIN_USE_64_BIT_INODE=1'],
|
||||
'xcode_settings': {
|
||||
'ALWAYS_SEARCH_USER_PATHS': 'NO',
|
||||
'GCC_CW_ASM_SYNTAX': 'NO', # No -fasm-blocks
|
||||
'GCC_DYNAMIC_NO_PIC': 'NO', # No -mdynamic-no-pic
|
||||
# (Equivalent to -fPIC)
|
||||
'GCC_ENABLE_CPP_EXCEPTIONS': 'NO', # -fno-exceptions
|
||||
'GCC_ENABLE_CPP_RTTI': 'NO', # -fno-rtti
|
||||
'GCC_ENABLE_PASCAL_STRINGS': 'NO', # No -mpascal-strings
|
||||
'GCC_THREADSAFE_STATICS': 'NO', # -fno-threadsafe-statics
|
||||
'GCC_VERSION': '4.2',
|
||||
'PREBINDING': 'NO', # No -Wl,-prebind
|
||||
'MACOSX_DEPLOYMENT_TARGET': '10.5', # -mmacosx-version-min=10.5
|
||||
'USE_HEADERMAP': 'NO',
|
||||
'OTHER_CFLAGS': [
|
||||
'-fno-strict-aliasing',
|
||||
],
|
||||
'WARNING_CFLAGS': [
|
||||
'-Wall',
|
||||
'-Wendif-labels',
|
||||
'-W',
|
||||
'-Wno-unused-parameter',
|
||||
],
|
||||
},
|
||||
'target_conditions': [
|
||||
['_type!="static_library"', {
|
||||
'xcode_settings': {'OTHER_LDFLAGS': ['-Wl,-search_paths_first']},
|
||||
}],
|
||||
],
|
||||
'conditions': [
|
||||
['target_arch=="ia32"', {
|
||||
'xcode_settings': {'ARCHS': ['i386']},
|
||||
}],
|
||||
['target_arch=="x64"', {
|
||||
'xcode_settings': {'ARCHS': ['x86_64']},
|
||||
}],
|
||||
],
|
||||
}],
|
||||
],
|
||||
}
|
||||
}
|
||||
2
config.h.cmake
Normal file
2
config.h.cmake
Normal file
@@ -0,0 +1,2 @@
|
||||
#cmakedefine HAVE_OPENSSL 1
|
||||
#cmakedefine HAVE_CONFIG_H 1
|
||||
518
configure
vendored
518
configure
vendored
@@ -1,507 +1,21 @@
|
||||
#!/usr/bin/env python
|
||||
import optparse
|
||||
import os
|
||||
import pprint
|
||||
import re
|
||||
import subprocess
|
||||
import sys
|
||||
#! /bin/sh
|
||||
|
||||
CC = os.environ.get('CC', 'cc')
|
||||
# v8 doesn't like ccache
|
||||
if [ ! -z "`echo $CC | grep ccache`" ]; then
|
||||
echo "Error: V8 doesn't like cache. Please set your CC env var to 'gcc'"
|
||||
echo " (ba)sh: export CC=gcc"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
root_dir = os.path.dirname(__file__)
|
||||
sys.path.insert(0, os.path.join(root_dir, 'deps', 'v8', 'tools'))
|
||||
CUR_DIR=$PWD
|
||||
|
||||
# parse our options
|
||||
parser = optparse.OptionParser()
|
||||
#possible relative path
|
||||
WORKINGDIR=`dirname $0`
|
||||
cd "$WORKINGDIR"
|
||||
#abs path
|
||||
WORKINGDIR=`pwd`
|
||||
cd "$CUR_DIR"
|
||||
|
||||
parser.add_option("--debug",
|
||||
action="store_true",
|
||||
dest="debug",
|
||||
help="Also build debug build")
|
||||
"${WORKINGDIR}/tools/waf-light" --jobs=1 configure $*
|
||||
|
||||
parser.add_option("--prefix",
|
||||
action="store",
|
||||
dest="prefix",
|
||||
help="Select the install prefix (defaults to /usr/local)")
|
||||
|
||||
parser.add_option("--without-npm",
|
||||
action="store_true",
|
||||
dest="without_npm",
|
||||
help="Don\'t install the bundled npm package manager")
|
||||
|
||||
parser.add_option("--without-waf",
|
||||
action="store_true",
|
||||
dest="without_waf",
|
||||
help="Don\'t install node-waf")
|
||||
|
||||
parser.add_option("--without-ssl",
|
||||
action="store_true",
|
||||
dest="without_ssl",
|
||||
help="Build without SSL")
|
||||
|
||||
parser.add_option("--without-snapshot",
|
||||
action="store_true",
|
||||
dest="without_snapshot",
|
||||
help="Build without snapshotting V8 libraries. You might want to set"
|
||||
" this for cross-compiling. [Default: False]")
|
||||
|
||||
parser.add_option("--shared-v8",
|
||||
action="store_true",
|
||||
dest="shared_v8",
|
||||
help="Link to a shared V8 DLL instead of static linking")
|
||||
|
||||
parser.add_option("--shared-v8-includes",
|
||||
action="store",
|
||||
dest="shared_v8_includes",
|
||||
help="Directory containing V8 header files")
|
||||
|
||||
parser.add_option("--shared-v8-libpath",
|
||||
action="store",
|
||||
dest="shared_v8_libpath",
|
||||
help="A directory to search for the shared V8 DLL")
|
||||
|
||||
parser.add_option("--shared-v8-libname",
|
||||
action="store",
|
||||
dest="shared_v8_libname",
|
||||
help="Alternative lib name to link to (default: 'v8')")
|
||||
|
||||
parser.add_option("--shared-openssl",
|
||||
action="store_true",
|
||||
dest="shared_openssl",
|
||||
help="Link to a shared OpenSSl DLL instead of static linking")
|
||||
|
||||
parser.add_option("--shared-openssl-includes",
|
||||
action="store",
|
||||
dest="shared_openssl_includes",
|
||||
help="Directory containing OpenSSL header files")
|
||||
|
||||
parser.add_option("--shared-openssl-libpath",
|
||||
action="store",
|
||||
dest="shared_openssl_libpath",
|
||||
help="A directory to search for the shared OpenSSL DLLs")
|
||||
|
||||
parser.add_option("--shared-openssl-libname",
|
||||
action="store",
|
||||
dest="shared_openssl_libname",
|
||||
help="Alternative lib name to link to (default: 'crypto,ssl')")
|
||||
|
||||
# deprecated
|
||||
parser.add_option("--openssl-use-sys",
|
||||
action="store_true",
|
||||
dest="shared_openssl",
|
||||
help=optparse.SUPPRESS_HELP)
|
||||
|
||||
# deprecated
|
||||
parser.add_option("--openssl-includes",
|
||||
action="store",
|
||||
dest="shared_openssl_includes",
|
||||
help=optparse.SUPPRESS_HELP)
|
||||
|
||||
# deprecated
|
||||
parser.add_option("--openssl-libpath",
|
||||
action="store",
|
||||
dest="shared_openssl_libpath",
|
||||
help=optparse.SUPPRESS_HELP)
|
||||
|
||||
parser.add_option("--no-ssl2",
|
||||
action="store_true",
|
||||
dest="no_ssl2",
|
||||
help="Disable OpenSSL v2")
|
||||
|
||||
parser.add_option("--shared-zlib",
|
||||
action="store_true",
|
||||
dest="shared_zlib",
|
||||
help="Link to a shared zlib DLL instead of static linking")
|
||||
|
||||
parser.add_option("--shared-zlib-includes",
|
||||
action="store",
|
||||
dest="shared_zlib_includes",
|
||||
help="Directory containing zlib header files")
|
||||
|
||||
parser.add_option("--shared-zlib-libpath",
|
||||
action="store",
|
||||
dest="shared_zlib_libpath",
|
||||
help="A directory to search for the shared zlib DLL")
|
||||
|
||||
parser.add_option("--shared-zlib-libname",
|
||||
action="store",
|
||||
dest="shared_zlib_libname",
|
||||
help="Alternative lib name to link to (default: 'z')")
|
||||
|
||||
parser.add_option("--with-dtrace",
|
||||
action="store_true",
|
||||
dest="with_dtrace",
|
||||
help="Build with DTrace (default is true on supported systems)")
|
||||
|
||||
parser.add_option("--without-dtrace",
|
||||
action="store_true",
|
||||
dest="without_dtrace",
|
||||
help="Build without DTrace")
|
||||
|
||||
parser.add_option("--with-etw",
|
||||
action="store_true",
|
||||
dest="with_etw",
|
||||
help="Build with ETW (default is true on Windows)")
|
||||
|
||||
parser.add_option("--without-etw",
|
||||
action="store_true",
|
||||
dest="without_etw",
|
||||
help="Build without ETW")
|
||||
|
||||
# CHECKME does this still work with recent releases of V8?
|
||||
parser.add_option("--gdb",
|
||||
action="store_true",
|
||||
dest="gdb",
|
||||
help="add gdb support")
|
||||
|
||||
parser.add_option("--dest-cpu",
|
||||
action="store",
|
||||
dest="dest_cpu",
|
||||
help="CPU architecture to build for. Valid values are: arm, ia32, x64")
|
||||
|
||||
parser.add_option("--dest-os",
|
||||
action="store",
|
||||
dest="dest_os",
|
||||
help="Operating system to build for. Valid values are: "
|
||||
"win, mac, solaris, freebsd, linux")
|
||||
|
||||
parser.add_option("--no-ifaddrs",
|
||||
action="store_true",
|
||||
dest="no_ifaddrs",
|
||||
help="Use on deprecated SunOS systems that do not support ifaddrs.h")
|
||||
|
||||
parser.add_option("--with-arm-float-abi",
|
||||
action="store",
|
||||
dest="arm_float_abi",
|
||||
help="Specifies which floating-point ABI to use. Valid values are: "
|
||||
"soft, softfp, hard")
|
||||
|
||||
# Using --unsafe-optimizations voids your warranty.
|
||||
parser.add_option("--unsafe-optimizations",
|
||||
action="store_true",
|
||||
dest="unsafe_optimizations",
|
||||
help=optparse.SUPPRESS_HELP)
|
||||
|
||||
parser.add_option("--tag",
|
||||
action="store",
|
||||
dest="tag",
|
||||
help="Custom build tag")
|
||||
|
||||
(options, args) = parser.parse_args()
|
||||
|
||||
|
||||
def b(value):
|
||||
"""Returns the string 'true' if value is truthy, 'false' otherwise."""
|
||||
if value:
|
||||
return 'true'
|
||||
else:
|
||||
return 'false'
|
||||
|
||||
|
||||
def pkg_config(pkg):
|
||||
cmd = os.popen('pkg-config --libs %s' % pkg, 'r')
|
||||
libs = cmd.readline().strip()
|
||||
ret = cmd.close()
|
||||
if (ret): return None
|
||||
|
||||
cmd = os.popen('pkg-config --cflags %s' % pkg, 'r')
|
||||
cflags = cmd.readline().strip()
|
||||
ret = cmd.close()
|
||||
if (ret): return None
|
||||
|
||||
return (libs, cflags)
|
||||
|
||||
|
||||
def cc_macros():
|
||||
"""Checks predefined macros using the CC command."""
|
||||
|
||||
try:
|
||||
p = subprocess.Popen(CC.split() + ['-dM', '-E', '-'],
|
||||
stdin=subprocess.PIPE,
|
||||
stdout=subprocess.PIPE,
|
||||
stderr=subprocess.PIPE)
|
||||
except OSError:
|
||||
print '''Node.js configure error: No acceptable C compiler found!
|
||||
|
||||
Please make sure you have a C compiler installed on your system and/or
|
||||
consider adjusting the CC environment variable if you installed
|
||||
it in a non-standard prefix.
|
||||
'''
|
||||
sys.exit()
|
||||
|
||||
p.stdin.write('\n')
|
||||
out = p.communicate()[0]
|
||||
|
||||
out = str(out).split('\n')
|
||||
|
||||
k = {}
|
||||
for line in out:
|
||||
import shlex
|
||||
lst = shlex.split(line)
|
||||
if len(lst) > 2:
|
||||
key = lst[1]
|
||||
val = lst[2]
|
||||
k[key] = val
|
||||
return k
|
||||
|
||||
|
||||
def is_arch_armv7():
|
||||
"""Check for ARMv7 instructions"""
|
||||
cc_macros_cache = cc_macros()
|
||||
return ('__ARM_ARCH_7__' in cc_macros_cache or
|
||||
'__ARM_ARCH_7A__' in cc_macros_cache or
|
||||
'__ARM_ARCH_7R__' in cc_macros_cache or
|
||||
'__ARM_ARCH_7M__' in cc_macros_cache)
|
||||
|
||||
|
||||
def arm_hard_float_abi():
|
||||
"""Check for hardfloat or softfloat eabi on ARM"""
|
||||
# GCC versions 4.6 and above define __ARM_PCS or __ARM_PCS_VFP to specify
|
||||
# the Floating Point ABI used (PCS stands for Procedure Call Standard).
|
||||
# We use these as well as a couple of other defines to statically determine
|
||||
# what FP ABI used.
|
||||
# GCC versions 4.4 and below don't support hard-fp.
|
||||
# GCC versions 4.5 may support hard-fp without defining __ARM_PCS or
|
||||
# __ARM_PCS_VFP.
|
||||
|
||||
if compiler_version() >= (4, 6, 0):
|
||||
return '__ARM_PCS_VFP' in cc_macros()
|
||||
elif compiler_version() < (4, 5, 0):
|
||||
return False
|
||||
elif '__ARM_PCS_VFP' in cc_macros():
|
||||
return True
|
||||
elif ('__ARM_PCS' in cc_macros() or
|
||||
'__SOFTFP' in cc_macros() or
|
||||
not '__VFP_FP__' in cc_macros()):
|
||||
return False
|
||||
else:
|
||||
print '''Node.js configure error: Your version of GCC does not report
|
||||
the Floating-Point ABI to compile for your hardware
|
||||
|
||||
Please manually specify which floating-point ABI to use with the
|
||||
--with-arm-float-abi option.
|
||||
'''
|
||||
sys.exit()
|
||||
|
||||
|
||||
def host_arch_cc():
|
||||
"""Host architecture check using the CC command."""
|
||||
|
||||
k = cc_macros()
|
||||
|
||||
matchup = {
|
||||
'__x86_64__' : 'x64',
|
||||
'__i386__' : 'ia32',
|
||||
'__arm__' : 'arm',
|
||||
}
|
||||
|
||||
rtn = 'ia32' # default
|
||||
|
||||
for i in matchup:
|
||||
if i in k and k[i] != '0':
|
||||
rtn = matchup[i]
|
||||
break
|
||||
|
||||
return rtn
|
||||
|
||||
|
||||
def host_arch_win():
|
||||
"""Host architecture check using environ vars (better way to do this?)"""
|
||||
|
||||
arch = os.environ.get('PROCESSOR_ARCHITECTURE', 'x86')
|
||||
|
||||
matchup = {
|
||||
'AMD64' : 'x64',
|
||||
'x86' : 'ia32',
|
||||
'arm' : 'arm',
|
||||
}
|
||||
|
||||
return matchup.get(arch, 'ia32')
|
||||
|
||||
|
||||
def compiler_version():
|
||||
try:
|
||||
proc = subprocess.Popen(CC.split() + ['--version'], stdout=subprocess.PIPE)
|
||||
except WindowsError:
|
||||
return (0, False)
|
||||
|
||||
is_clang = 'clang' in proc.communicate()[0].split('\n')[0]
|
||||
|
||||
proc = subprocess.Popen(CC.split() + ['-dumpversion'], stdout=subprocess.PIPE)
|
||||
version = tuple(map(int, proc.communicate()[0].split('.')))
|
||||
|
||||
return (version, is_clang)
|
||||
|
||||
|
||||
def configure_arm(o):
|
||||
# V8 on ARM requires that armv7 is set. CPU Model detected by
|
||||
# the presence of __ARM_ARCH_7__ and the like defines in compiler
|
||||
if options.arm_float_abi:
|
||||
hard_float = options.arm_float_abi == 'hard'
|
||||
else:
|
||||
hard_float = arm_hard_float_abi()
|
||||
o['variables']['v8_use_arm_eabi_hardfloat'] = b(hard_float)
|
||||
|
||||
armv7 = is_arch_armv7()
|
||||
if armv7:
|
||||
# CHECKME VFPv3 implies ARMv7+ but is the reverse true as well?
|
||||
o['variables']['arm_fpu'] = 'vfpv3'
|
||||
o['variables']['arm_neon'] = 0
|
||||
o['variables']['armv7'] = int(armv7)
|
||||
|
||||
|
||||
def configure_node(o):
|
||||
# TODO add gdb
|
||||
o['variables']['v8_no_strict_aliasing'] = 1 # work around compiler bugs
|
||||
o['variables']['node_prefix'] = os.path.expanduser(options.prefix or '')
|
||||
o['variables']['node_install_npm'] = b(not options.without_npm)
|
||||
o['variables']['node_install_waf'] = b(not options.without_waf)
|
||||
o['variables']['node_unsafe_optimizations'] = (
|
||||
1 if options.unsafe_optimizations else 0)
|
||||
o['default_configuration'] = 'Debug' if options.debug else 'Release'
|
||||
|
||||
host_arch = host_arch_win() if os.name == 'nt' else host_arch_cc()
|
||||
target_arch = options.dest_cpu or host_arch
|
||||
o['variables']['host_arch'] = host_arch
|
||||
o['variables']['target_arch'] = target_arch
|
||||
|
||||
if target_arch == 'arm':
|
||||
configure_arm(o)
|
||||
|
||||
cc_version, is_clang = compiler_version()
|
||||
o['variables']['clang'] = 1 if is_clang else 0
|
||||
|
||||
if not is_clang and cc_version != 0:
|
||||
o['variables']['gcc_version'] = 10 * cc_version[0] + cc_version[1]
|
||||
|
||||
# clang has always supported -fvisibility=hidden, right?
|
||||
if not is_clang and cc_version < (4,0,0):
|
||||
o['variables']['visibility'] = ''
|
||||
|
||||
# By default, enable DTrace on SunOS systems. Don't allow it on other
|
||||
# systems, since it won't work. (The MacOS build process is different than
|
||||
# SunOS, and we haven't implemented it.)
|
||||
if sys.platform.startswith('sunos'):
|
||||
o['variables']['node_use_dtrace'] = b(not options.without_dtrace)
|
||||
elif b(options.with_dtrace) == 'true':
|
||||
raise Exception('DTrace is currently only supported on SunOS systems.')
|
||||
else:
|
||||
o['variables']['node_use_dtrace'] = 'false'
|
||||
|
||||
if options.no_ifaddrs:
|
||||
o['defines'] += ['SUNOS_NO_IFADDRS']
|
||||
|
||||
# By default, enable ETW on Windows.
|
||||
if sys.platform.startswith('win32'):
|
||||
o['variables']['node_use_etw'] = b(not options.without_etw);
|
||||
elif b(options.with_etw) == 'true':
|
||||
raise Exception('ETW is only supported on Windows.')
|
||||
else:
|
||||
o['variables']['node_use_etw'] = 'false'
|
||||
|
||||
if options.tag:
|
||||
o['variables']['node_tag'] = '-' + options.tag
|
||||
else:
|
||||
o['variables']['node_tag'] = ''
|
||||
|
||||
|
||||
def configure_libz(o):
|
||||
o['variables']['node_shared_zlib'] = b(options.shared_zlib)
|
||||
|
||||
# assume shared_zlib if one of these is set?
|
||||
if options.shared_zlib_libpath:
|
||||
o['libraries'] += ['-L%s' % options.shared_zlib_libpath]
|
||||
if options.shared_zlib_libname:
|
||||
o['libraries'] += ['-l%s' % options.shared_zlib_libname]
|
||||
elif options.shared_zlib:
|
||||
o['libraries'] += ['-lz']
|
||||
if options.shared_zlib_includes:
|
||||
o['include_dirs'] += [options.shared_zlib_includes]
|
||||
|
||||
|
||||
def configure_v8(o):
|
||||
o['variables']['v8_use_snapshot'] = b(not options.without_snapshot)
|
||||
o['variables']['node_shared_v8'] = b(options.shared_v8)
|
||||
|
||||
# assume shared_v8 if one of these is set?
|
||||
if options.shared_v8_libpath:
|
||||
o['libraries'] += ['-L%s' % options.shared_v8_libpath]
|
||||
if options.shared_v8_libname:
|
||||
o['libraries'] += ['-l%s' % options.shared_v8_libname]
|
||||
elif options.shared_v8:
|
||||
o['libraries'] += ['-lv8']
|
||||
if options.shared_v8_includes:
|
||||
o['include_dirs'] += [options.shared_v8_includes]
|
||||
|
||||
|
||||
def configure_openssl(o):
|
||||
o['variables']['node_use_openssl'] = b(not options.without_ssl)
|
||||
o['variables']['node_shared_openssl'] = b(options.shared_openssl)
|
||||
|
||||
if options.without_ssl:
|
||||
return
|
||||
|
||||
if options.no_ssl2:
|
||||
o['defines'] += ['OPENSSL_NO_SSL2=1']
|
||||
|
||||
if options.shared_openssl:
|
||||
(libs, cflags) = pkg_config('openssl') or ('-lssl -lcrypto', '')
|
||||
|
||||
if options.shared_openssl_libpath:
|
||||
o['libraries'] += ['-L%s' % options.shared_openssl_libpath]
|
||||
|
||||
if options.shared_openssl_libname:
|
||||
libnames = options.shared_openssl_libname.split(',')
|
||||
o['libraries'] += ['-l%s' % s for s in libnames]
|
||||
else:
|
||||
o['libraries'] += libs.split()
|
||||
|
||||
if options.shared_openssl_includes:
|
||||
o['include_dirs'] += [options.shared_openssl_includes]
|
||||
else:
|
||||
o['cflags'] += cflags.split()
|
||||
|
||||
|
||||
output = {
|
||||
'variables': {},
|
||||
'include_dirs': [],
|
||||
'libraries': [],
|
||||
'defines': [],
|
||||
'cflags': [],
|
||||
}
|
||||
|
||||
configure_node(output)
|
||||
configure_libz(output)
|
||||
configure_v8(output)
|
||||
configure_openssl(output)
|
||||
|
||||
# variables should be a root level element,
|
||||
# move everything else to target_defaults
|
||||
variables = output['variables']
|
||||
del output['variables']
|
||||
output = {
|
||||
'variables': variables,
|
||||
'target_defaults': output
|
||||
}
|
||||
pprint.pprint(output, indent=2)
|
||||
|
||||
def write(filename, data):
|
||||
filename = os.path.join(root_dir, filename)
|
||||
print "creating ", filename
|
||||
f = open(filename, 'w+')
|
||||
f.write(data)
|
||||
|
||||
write('config.gypi', "# Do not edit. Generated by the configure script.\n" +
|
||||
pprint.pformat(output, indent=2) + "\n")
|
||||
|
||||
write('config.mk', "# Do not edit. Generated by the configure script.\n" +
|
||||
("BUILDTYPE=%s\n" % ('Debug' if options.debug else 'Release')))
|
||||
|
||||
if os.name == 'nt':
|
||||
gyp_args = ['-f', 'msvs', '-G', 'msvs_version=2010']
|
||||
elif options.dest_os:
|
||||
gyp_args = ['-f', 'make-' + options.dest_os]
|
||||
else:
|
||||
gyp_args = ['-f', 'make']
|
||||
|
||||
subprocess.call([sys.executable, 'tools/gyp_node'] + gyp_args)
|
||||
exit $?
|
||||
|
||||
1198
deps/c-ares/CHANGES
vendored
Normal file
1198
deps/c-ares/CHANGES
vendored
Normal file
File diff suppressed because it is too large
Load Diff
@@ -40,30 +40,6 @@
|
||||
library version it is using.
|
||||
|
||||
|
||||
How to install using MSVC from the command line
|
||||
-----------------------------------------------
|
||||
|
||||
In order to allow easy usage of c-ares libraries it may be convenient to
|
||||
install c-ares libraries and header files to a common subdirectory tree.
|
||||
|
||||
Once that c-ares libraries have been built using procedure described above,
|
||||
use same command prompt window to define environment variable INSTALL_DIR
|
||||
to designate the top subdirectory where installation of c-ares libraries and
|
||||
header files will be done.
|
||||
|
||||
> set INSTALL_DIR=c:\c-ares
|
||||
|
||||
Afterwards, run following command to actually perform the installation:
|
||||
|
||||
> nmake -f Makefile.msvc install
|
||||
|
||||
Installation procedure will copy c-ares libraries to subdirectory 'lib' and
|
||||
c-ares header files to subdirectory 'include' below the INSTALL_DIR subdir.
|
||||
|
||||
When environment variable INSTALL_DIR is not defined, installation is done
|
||||
to c-ares source folder where Makefile.msvc file is located.
|
||||
|
||||
|
||||
How to build using Visual Studio 6 IDE
|
||||
--------------------------------------
|
||||
|
||||
25
deps/c-ares/RELEASE-NOTES
vendored
Normal file
25
deps/c-ares/RELEASE-NOTES
vendored
Normal file
@@ -0,0 +1,25 @@
|
||||
c-ares version 1.7.4
|
||||
|
||||
Changed:
|
||||
|
||||
o local-bind: Support binding to local interface/IPs, see
|
||||
ares_set_local_ip4, ares_set_local_ip6, ares_set_local_dev
|
||||
|
||||
Fixed:
|
||||
|
||||
o memory leak in ares_getnameinfo
|
||||
o add missing break that caused get_ares_servers to fail
|
||||
o ares_parse_a_reply: fix CNAME response parsing
|
||||
o init_by_options: don't copy an empty sortlist
|
||||
o Replaced uint32_t with unsigned int to fix broken builds
|
||||
on a couple of platforms
|
||||
o Fix lookup with HOSTALIASES set
|
||||
o adig: fix NAPTR parsing
|
||||
o compiler warning cleanups
|
||||
|
||||
Thanks go to these friendly people for their efforts and contributions:
|
||||
|
||||
Andrew C. Morrow, Ben Greear, Ben Noordhuis, Daniel Stenberg,
|
||||
Guenter Knauf, Mike Crowe, Patrik Thunstrom, Yang Tse
|
||||
|
||||
Have fun!
|
||||
60
deps/uv/include/ares.h → deps/c-ares/ares.h
vendored
60
deps/uv/include/ares.h → deps/c-ares/ares.h
vendored
@@ -1,6 +1,6 @@
|
||||
|
||||
/* Copyright 1998, 2009 by the Massachusetts Institute of Technology.
|
||||
* Copyright (C) 2007-2011 by Daniel Stenberg
|
||||
* Copyright (C) 2007-2010 by Daniel Stenberg
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
@@ -19,6 +19,8 @@
|
||||
#define ARES__H
|
||||
|
||||
#include "ares_version.h" /* c-ares version defines */
|
||||
#include "ares_build.h" /* c-ares build definitions */
|
||||
#include "ares_rules.h" /* c-ares rules enforcement */
|
||||
|
||||
/*
|
||||
* Define WIN32 when build target is Win32 API
|
||||
@@ -29,56 +31,6 @@
|
||||
# define WIN32
|
||||
#endif
|
||||
|
||||
/*************************** libuv patch ***************/
|
||||
|
||||
/*
|
||||
* We want to avoid autoconf altogether since there are a finite number of
|
||||
* operating systems and simply build c-ares. Therefore we do not want the
|
||||
* configurations provided by ares_build.h since we are always statically
|
||||
* linking c-ares into libuv. Having a system dependent ares_build.h forces
|
||||
* all users of ares.h to include the correct ares_build.h. We do not care
|
||||
* about the linking checks provided by ares_rules.h. This would complicate
|
||||
* the libuv build process.
|
||||
*/
|
||||
|
||||
|
||||
#if defined(WIN32)
|
||||
/* Configure process defines this to 1 when it finds out that system */
|
||||
/* header file ws2tcpip.h must be included by the external interface. */
|
||||
/* #undef CARES_PULL_WS2TCPIP_H */
|
||||
# include <winsock2.h>
|
||||
# include <ws2tcpip.h>
|
||||
# include <windows.h>
|
||||
|
||||
#else /* Not Windows */
|
||||
|
||||
# include <sys/time.h>
|
||||
# include <sys/types.h>
|
||||
# include <sys/socket.h>
|
||||
#endif
|
||||
|
||||
#if 0
|
||||
/* The size of `long', as computed by sizeof. */
|
||||
#define CARES_SIZEOF_LONG 4
|
||||
#endif
|
||||
|
||||
/* Integral data type used for ares_socklen_t. */
|
||||
#define CARES_TYPEOF_ARES_SOCKLEN_T socklen_t
|
||||
|
||||
#if 0
|
||||
/* The size of `ares_socklen_t', as computed by sizeof. */
|
||||
#define CARES_SIZEOF_ARES_SOCKLEN_T 4
|
||||
#endif
|
||||
|
||||
/* Data type definition of ares_socklen_t. */
|
||||
typedef int ares_socklen_t;
|
||||
|
||||
#if 0 /* libuv disabled */
|
||||
#include "ares_rules.h" /* c-ares rules enforcement */
|
||||
#endif
|
||||
|
||||
/*********************** end libuv patch ***************/
|
||||
|
||||
#include <sys/types.h>
|
||||
|
||||
/* HP-UX systems version 9, 10 and 11 lack sys/select.h and so does oldish
|
||||
@@ -96,12 +48,6 @@ typedef int ares_socklen_t;
|
||||
# include <netinet/in.h>
|
||||
# include <sys/socket.h>
|
||||
# include <tcp.h>
|
||||
#elif defined(_WIN32_WCE)
|
||||
# ifndef WIN32_LEAN_AND_MEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
# endif
|
||||
# include <windows.h>
|
||||
# include <winsock.h>
|
||||
#elif defined(WIN32)
|
||||
# ifndef WIN32_LEAN_AND_MEAN
|
||||
# define WIN32_LEAN_AND_MEAN
|
||||
@@ -87,14 +87,7 @@ int ares_expand_name(const unsigned char *encoded, const unsigned char *abuf,
|
||||
* Since this function strips trailing dots though, it becomes ""
|
||||
*/
|
||||
q[0] = '\0';
|
||||
|
||||
/* indirect root label (like 0xc0 0x0c) is 2 bytes long (stupid, but
|
||||
valid) */
|
||||
if ((*encoded & INDIR_MASK) == INDIR_MASK)
|
||||
*enclen = 2;
|
||||
else
|
||||
*enclen = 1; /* the caller should move one byte to get past this */
|
||||
|
||||
*enclen = 1; /* the caller should move one byte to get past this */
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
|
||||
@@ -21,7 +21,6 @@
|
||||
#endif
|
||||
|
||||
#include "ares.h"
|
||||
#include "ares_nowarn.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
int ares_fds(ares_channel channel, fd_set *read_fds, fd_set *write_fds)
|
||||
@@ -28,9 +28,6 @@ void ares_free_hostent(struct hostent *host)
|
||||
{
|
||||
char **p;
|
||||
|
||||
if (!host)
|
||||
return;
|
||||
|
||||
free((char *)(host->h_name));
|
||||
for (p = host->h_aliases; *p; p++)
|
||||
free(*p);
|
||||
@@ -42,7 +42,6 @@
|
||||
|
||||
#include "ares.h"
|
||||
#include "inet_net_pton.h"
|
||||
#include "ares_platform.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifdef WATT32
|
||||
@@ -187,13 +186,7 @@ static int file_lookup(struct ares_addr *addr, struct hostent **host)
|
||||
|
||||
#ifdef WIN32
|
||||
char PATH_HOSTS[MAX_PATH];
|
||||
win_platform platform;
|
||||
|
||||
PATH_HOSTS[0] = '\0';
|
||||
|
||||
platform = ares__getplatform();
|
||||
|
||||
if (platform == WIN_NT) {
|
||||
if (IS_NT()) {
|
||||
char tmp[MAX_PATH];
|
||||
HKEY hkeyHosts;
|
||||
|
||||
@@ -207,10 +200,8 @@ static int file_lookup(struct ares_addr *addr, struct hostent **host)
|
||||
RegCloseKey(hkeyHosts);
|
||||
}
|
||||
}
|
||||
else if (platform == WIN_9X)
|
||||
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
||||
else
|
||||
return ARES_ENOTFOUND;
|
||||
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
||||
|
||||
strcat(PATH_HOSTS, WIN_PATH_HOSTS);
|
||||
|
||||
@@ -48,7 +48,6 @@
|
||||
#include "ares.h"
|
||||
#include "inet_net_pton.h"
|
||||
#include "bitncmp.h"
|
||||
#include "ares_platform.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifdef WATT32
|
||||
@@ -194,11 +193,11 @@ static void host_callback(void *arg, int status, int timeouts,
|
||||
else if (hquery->sent_family == AF_INET6)
|
||||
{
|
||||
status = ares_parse_aaaa_reply(abuf, alen, &host, NULL, NULL);
|
||||
if ((status == ARES_ENODATA || status == ARES_EBADRESP) &&
|
||||
hquery->want_family == AF_UNSPEC) {
|
||||
if (status == ARES_ENODATA || status == ARES_EBADRESP) {
|
||||
/* The query returned something but either there were no AAAA
|
||||
records (e.g. just CNAME) or the response was malformed. Try
|
||||
looking up A instead. */
|
||||
looking up A instead. We should possibly limit this
|
||||
attempt-next logic to AF_UNSPEC lookups only. */
|
||||
hquery->sent_family = AF_INET;
|
||||
ares_search(hquery->channel, hquery->name, C_IN, T_A,
|
||||
host_callback, hquery);
|
||||
@@ -210,10 +209,11 @@ static void host_callback(void *arg, int status, int timeouts,
|
||||
end_hquery(hquery, status, host);
|
||||
}
|
||||
else if ((status == ARES_ENODATA || status == ARES_EBADRESP ||
|
||||
status == ARES_ETIMEOUT) && (hquery->sent_family == AF_INET6 &&
|
||||
hquery->want_family == AF_UNSPEC))
|
||||
status == ARES_ETIMEOUT) && hquery->sent_family == AF_INET6)
|
||||
{
|
||||
/* The AAAA query yielded no useful result. Now look up an A instead. */
|
||||
/* The AAAA query yielded no useful result. Now look up an A instead.
|
||||
We should possibly limit this attempt-next logic to AF_UNSPEC lookups
|
||||
only. */
|
||||
hquery->sent_family = AF_INET;
|
||||
ares_search(hquery->channel, hquery->name, C_IN, T_A, host_callback,
|
||||
hquery);
|
||||
@@ -344,13 +344,7 @@ static int file_lookup(const char *name, int family, struct hostent **host)
|
||||
|
||||
#ifdef WIN32
|
||||
char PATH_HOSTS[MAX_PATH];
|
||||
win_platform platform;
|
||||
|
||||
PATH_HOSTS[0] = '\0';
|
||||
|
||||
platform = ares__getplatform();
|
||||
|
||||
if (platform == WIN_NT) {
|
||||
if (IS_NT()) {
|
||||
char tmp[MAX_PATH];
|
||||
HKEY hkeyHosts;
|
||||
|
||||
@@ -364,10 +358,8 @@ static int file_lookup(const char *name, int family, struct hostent **host)
|
||||
RegCloseKey(hkeyHosts);
|
||||
}
|
||||
}
|
||||
else if (platform == WIN_9X)
|
||||
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
||||
else
|
||||
return ARES_ENOTFOUND;
|
||||
GetWindowsDirectory(PATH_HOSTS, MAX_PATH);
|
||||
|
||||
strcat(PATH_HOSTS, WIN_PATH_HOSTS);
|
||||
|
||||
@@ -58,7 +58,6 @@
|
||||
#include "ares.h"
|
||||
#include "ares_ipv6.h"
|
||||
#include "inet_ntop.h"
|
||||
#include "ares_nowarn.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
struct nameinfo_query {
|
||||
@@ -188,7 +187,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa,
|
||||
if (sa->sa_family == AF_INET)
|
||||
{
|
||||
niquery->family = AF_INET;
|
||||
memcpy(&niquery->addr.addr4, addr, sizeof(struct in_addr));
|
||||
memcpy(&niquery->addr.addr4, addr, sizeof(addr));
|
||||
ares_gethostbyaddr(channel, &addr->sin_addr,
|
||||
sizeof(struct in_addr), AF_INET,
|
||||
nameinfo_callback, niquery);
|
||||
@@ -196,7 +195,7 @@ void ares_getnameinfo(ares_channel channel, const struct sockaddr *sa,
|
||||
else
|
||||
{
|
||||
niquery->family = AF_INET6;
|
||||
memcpy(&niquery->addr.addr6, addr6, sizeof(struct ares_in6_addr));
|
||||
memcpy(&niquery->addr.addr6, addr6, sizeof(addr6));
|
||||
ares_gethostbyaddr(channel, &addr6->sin6_addr,
|
||||
sizeof(struct ares_in6_addr), AF_INET6,
|
||||
nameinfo_callback, niquery);
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
* Copyright (C) 2007-2011 by Daniel Stenberg
|
||||
* Copyright (C) 2007-2010 by Daniel Stenberg
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
@@ -17,6 +17,10 @@
|
||||
|
||||
#include "ares_setup.h"
|
||||
|
||||
#ifdef USE_WINSOCK
|
||||
#include <iphlpapi.h>
|
||||
#endif
|
||||
|
||||
#ifdef HAVE_SYS_PARAM_H
|
||||
#include <sys/param.h>
|
||||
#endif
|
||||
@@ -59,19 +63,17 @@
|
||||
#include <string.h>
|
||||
#include <ctype.h>
|
||||
#include <time.h>
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <sys/system_properties.h>
|
||||
#endif
|
||||
|
||||
#include <errno.h>
|
||||
#include "ares.h"
|
||||
#include "inet_net_pton.h"
|
||||
#include "ares_library_init.h"
|
||||
#include "ares_nowarn.h"
|
||||
#include "ares_platform.h"
|
||||
#include "inet_ntop.h"
|
||||
#include "ares_private.h"
|
||||
|
||||
#ifdef ANDROID
|
||||
#include <sys/system_properties.h>
|
||||
#endif
|
||||
|
||||
#ifdef WATT32
|
||||
#undef WIN32 /* Redefined in MingW/MSVC headers */
|
||||
#endif
|
||||
@@ -100,7 +102,7 @@ static int config_lookup(ares_channel channel, const char *str,
|
||||
const char *bindch, const char *filech);
|
||||
static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
const char *str);
|
||||
static char *try_config(char *s, const char *opt, char scc);
|
||||
static char *try_config(char *s, const char *opt);
|
||||
#endif
|
||||
|
||||
#define ARES_CONFIG_CHECK(x) (x->lookups && x->nsort > -1 && \
|
||||
@@ -361,7 +363,7 @@ int ares_save_options(ares_channel channel, struct ares_options *options,
|
||||
ipv4_nservers++;
|
||||
}
|
||||
if (ipv4_nservers) {
|
||||
options->servers = malloc(ipv4_nservers * sizeof(struct in_addr));
|
||||
options->servers = malloc(ipv4_nservers * sizeof(struct server_state));
|
||||
if (!options->servers)
|
||||
return ARES_ENOMEM;
|
||||
for (i = j = 0; i < channel->nservers; i++)
|
||||
@@ -593,198 +595,73 @@ static int get_res_interfaces_nt(HKEY hKey, const char *subkey, char **obuf)
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* The desired output for this method is that we set "ret_buf" to
|
||||
* something like:
|
||||
*
|
||||
* 192.168.0.1,dns01.my.domain,fe80::200:f8ff:fe21:67cf
|
||||
*
|
||||
* The only ordering requirement is that primary servers are listed
|
||||
* before secondary. There is no requirement that IPv4 addresses should
|
||||
* necessarily be before IPv6.
|
||||
*
|
||||
* Note that ret_size should ideally be big enough to hold around
|
||||
* 2-3 IPv4 and 2-3 IPv6 addresses.
|
||||
*
|
||||
* Finally, we need to return the total number of DNS servers located.
|
||||
*/
|
||||
static int get_iphlpapi_dns_info (char *ret_buf, size_t ret_size)
|
||||
{
|
||||
const size_t ipv4_size = INET_ADDRSTRLEN + 1; /* +1 for ',' at end */
|
||||
const size_t ipv6_size = INET6_ADDRSTRLEN + 12; /* +12 for "%0123456789," at end */
|
||||
size_t left = ret_size;
|
||||
char *ret = ret_buf;
|
||||
int count = 0;
|
||||
FIXED_INFO *fi, *newfi;
|
||||
DWORD size = sizeof (*fi);
|
||||
IP_ADDR_STRING *ipAddr;
|
||||
int i, count = 0;
|
||||
int debug = 0;
|
||||
size_t ip_size = sizeof("255.255.255.255,")-1;
|
||||
size_t left = ret_size;
|
||||
char *ret = ret_buf;
|
||||
HRESULT res;
|
||||
|
||||
/* Use the GetAdaptersAddresses method if it's available, otherwise
|
||||
fall back to GetNetworkParams. */
|
||||
if (ares_fpGetAdaptersAddresses != ZERO_NULL)
|
||||
fi = malloc(size);
|
||||
if (!fi)
|
||||
return 0;
|
||||
|
||||
res = (*ares_fpGetNetworkParams) (fi, &size);
|
||||
if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
|
||||
goto quit;
|
||||
|
||||
newfi = realloc(fi, size);
|
||||
if (!newfi)
|
||||
goto quit;
|
||||
|
||||
fi = newfi;
|
||||
res = (*ares_fpGetNetworkParams) (fi, &size);
|
||||
if (res != ERROR_SUCCESS)
|
||||
goto quit;
|
||||
|
||||
if (debug)
|
||||
{
|
||||
const ULONG working_buf_size = 15000;
|
||||
IP_ADAPTER_ADDRESSES *pFirstEntry = NULL;
|
||||
IP_ADAPTER_ADDRESSES *pEntry = NULL;
|
||||
ULONG bufSize = 0;
|
||||
ULONG result = 0;
|
||||
|
||||
/* According to MSDN, the recommended way to do this is to use a temporary
|
||||
buffer of 15K, to "dramatically reduce the chance that the GetAdaptersAddresses
|
||||
method returns ERROR_BUFFER_OVERFLOW" */
|
||||
pFirstEntry = ( IP_ADAPTER_ADDRESSES * ) malloc( working_buf_size );
|
||||
bufSize = working_buf_size;
|
||||
if( !pFirstEntry )
|
||||
return 0;
|
||||
|
||||
/* Call the method one time */
|
||||
result = ( *ares_fpGetAdaptersAddresses )( AF_UNSPEC, 0, 0, pFirstEntry, &bufSize );
|
||||
if( result == ERROR_BUFFER_OVERFLOW )
|
||||
{
|
||||
/* Reallocate, bufSize should now be set to the required size */
|
||||
pFirstEntry = ( IP_ADAPTER_ADDRESSES * ) realloc( pFirstEntry, bufSize );
|
||||
if( !pFirstEntry )
|
||||
return 0;
|
||||
|
||||
/* Call the method a second time */
|
||||
result = ( *ares_fpGetAdaptersAddresses )( AF_UNSPEC, 0, 0, pFirstEntry, &bufSize );
|
||||
if( result == ERROR_BUFFER_OVERFLOW )
|
||||
{
|
||||
/* Reallocate, bufSize should now be set to the required size */
|
||||
pFirstEntry = ( IP_ADAPTER_ADDRESSES * ) realloc( pFirstEntry, bufSize );
|
||||
if( !pFirstEntry )
|
||||
return 0;
|
||||
|
||||
/* Call the method a third time. The maximum number of times we're going to do
|
||||
this is 3. Three shall be the number thou shalt count, and the number of the
|
||||
counting shall be three. Five is right out. */
|
||||
result = ( *ares_fpGetAdaptersAddresses )( AF_UNSPEC, 0, 0, pFirstEntry, &bufSize );
|
||||
}
|
||||
}
|
||||
|
||||
/* Check the current result for failure */
|
||||
if( result != ERROR_SUCCESS )
|
||||
{
|
||||
free( pFirstEntry );
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* process the results */
|
||||
for( pEntry = pFirstEntry ; pEntry != NULL ; pEntry = pEntry->Next )
|
||||
{
|
||||
IP_ADAPTER_DNS_SERVER_ADDRESS* pDNSAddr = pEntry->FirstDnsServerAddress;
|
||||
for( ; pDNSAddr != NULL ; pDNSAddr = pDNSAddr->Next )
|
||||
{
|
||||
struct sockaddr *pGenericAddr = pDNSAddr->Address.lpSockaddr;
|
||||
size_t stringlen = 0;
|
||||
|
||||
if( pGenericAddr->sa_family == AF_INET && left > ipv4_size )
|
||||
{
|
||||
/* Handle the v4 case */
|
||||
struct sockaddr_in *pIPv4Addr = ( struct sockaddr_in * ) pGenericAddr;
|
||||
ares_inet_ntop( AF_INET, &pIPv4Addr->sin_addr, ret, ipv4_size - 1 ); /* -1 for comma */
|
||||
|
||||
/* Append a comma to the end, THEN NULL. Should be OK because we
|
||||
already tested the size at the top of the if statement. */
|
||||
stringlen = strlen( ret );
|
||||
ret[ stringlen ] = ',';
|
||||
ret[ stringlen + 1 ] = '\0';
|
||||
ret += stringlen + 1;
|
||||
left -= ret - ret_buf;
|
||||
++count;
|
||||
}
|
||||
else if( pGenericAddr->sa_family == AF_INET6 && left > ipv6_size )
|
||||
{
|
||||
/* Handle the v6 case */
|
||||
struct sockaddr_in6 *pIPv6Addr = ( struct sockaddr_in6 * ) pGenericAddr;
|
||||
ares_inet_ntop( AF_INET6, &pIPv6Addr->sin6_addr, ret, ipv6_size - 1 ); /* -1 for comma */
|
||||
|
||||
stringlen = strlen( ret );
|
||||
|
||||
/* Windows apparently always reports some IPv6 DNS servers that
|
||||
prefixed with fec0:0:0:ffff. These ususally do not point to
|
||||
working DNS servers, so we ignore them. */
|
||||
if (strncmp(ret, "fec0:0:0:ffff:", 14) != 0) {
|
||||
/* Append a comma to the end, THEN NULL. Should be OK because we
|
||||
already tested the size at the top of the if statement. */
|
||||
ret[ stringlen ] = ',';
|
||||
ret[ stringlen + 1 ] = '\0';
|
||||
ret += stringlen + 1;
|
||||
left -= ret - ret_buf;
|
||||
++count;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if( pFirstEntry )
|
||||
free( pFirstEntry );
|
||||
if (ret > ret_buf)
|
||||
ret[-1] = '\0';
|
||||
return count;
|
||||
printf ("Host Name: %s\n", fi->HostName);
|
||||
printf ("Domain Name: %s\n", fi->DomainName);
|
||||
printf ("DNS Servers:\n"
|
||||
" %s (primary)\n", fi->DnsServerList.IpAddress.String);
|
||||
}
|
||||
else
|
||||
if (strlen(fi->DnsServerList.IpAddress.String) > 0 &&
|
||||
inet_addr(fi->DnsServerList.IpAddress.String) != INADDR_NONE &&
|
||||
left > ip_size)
|
||||
{
|
||||
FIXED_INFO *fi, *newfi;
|
||||
DWORD size = sizeof (*fi);
|
||||
IP_ADDR_STRING *ipAddr;
|
||||
int i;
|
||||
int debug = 0;
|
||||
HRESULT res;
|
||||
|
||||
fi = malloc(size);
|
||||
if (!fi)
|
||||
return 0;
|
||||
|
||||
res = (*ares_fpGetNetworkParams) (fi, &size);
|
||||
if ((res != ERROR_BUFFER_OVERFLOW) && (res != ERROR_SUCCESS))
|
||||
goto quit;
|
||||
|
||||
newfi = realloc(fi, size);
|
||||
if (!newfi)
|
||||
goto quit;
|
||||
|
||||
fi = newfi;
|
||||
res = (*ares_fpGetNetworkParams) (fi, &size);
|
||||
if (res != ERROR_SUCCESS)
|
||||
goto quit;
|
||||
ret += sprintf (ret, "%s,", fi->DnsServerList.IpAddress.String);
|
||||
left -= ret - ret_buf;
|
||||
count++;
|
||||
}
|
||||
|
||||
for (i = 0, ipAddr = fi->DnsServerList.Next; ipAddr && left > ip_size;
|
||||
ipAddr = ipAddr->Next, i++)
|
||||
{
|
||||
if (inet_addr(ipAddr->IpAddress.String) != INADDR_NONE)
|
||||
{
|
||||
ret += sprintf (ret, "%s,", ipAddr->IpAddress.String);
|
||||
left -= ret - ret_buf;
|
||||
count++;
|
||||
}
|
||||
if (debug)
|
||||
{
|
||||
printf ("Host Name: %s\n", fi->HostName);
|
||||
printf ("Domain Name: %s\n", fi->DomainName);
|
||||
printf ("DNS Servers:\n"
|
||||
" %s (primary)\n", fi->DnsServerList.IpAddress.String);
|
||||
}
|
||||
if (strlen(fi->DnsServerList.IpAddress.String) > 0 &&
|
||||
inet_addr(fi->DnsServerList.IpAddress.String) != INADDR_NONE &&
|
||||
left > ipv4_size)
|
||||
{
|
||||
ret += sprintf (ret, "%s,", fi->DnsServerList.IpAddress.String);
|
||||
left -= ret - ret_buf;
|
||||
++count;
|
||||
}
|
||||
|
||||
for (i = 0, ipAddr = fi->DnsServerList.Next; ipAddr && left > ipv4_size;
|
||||
ipAddr = ipAddr->Next, i++)
|
||||
{
|
||||
if (inet_addr(ipAddr->IpAddress.String) != INADDR_NONE)
|
||||
{
|
||||
ret += sprintf (ret, "%s,", ipAddr->IpAddress.String);
|
||||
left -= ret - ret_buf;
|
||||
++count;
|
||||
}
|
||||
if (debug)
|
||||
printf (" %s (secondary %d)\n", ipAddr->IpAddress.String, i+1);
|
||||
}
|
||||
printf (" %s (secondary %d)\n", ipAddr->IpAddress.String, i+1);
|
||||
}
|
||||
|
||||
quit:
|
||||
if (fi)
|
||||
free(fi);
|
||||
if (fi)
|
||||
free(fi);
|
||||
|
||||
if (debug && left <= ipv4_size)
|
||||
printf ("Too many nameservers. Truncating to %d addressess", count);
|
||||
if (ret > ret_buf)
|
||||
ret[-1] = '\0';
|
||||
return count;
|
||||
}
|
||||
if (debug && left <= ip_size)
|
||||
printf ("Too many nameservers. Truncating to %d addressess", count);
|
||||
if (ret > ret_buf)
|
||||
ret[-1] = '\0';
|
||||
return count;
|
||||
}
|
||||
#endif
|
||||
|
||||
@@ -827,8 +704,7 @@ DhcpNameServer
|
||||
DWORD data_type;
|
||||
DWORD bytes;
|
||||
DWORD result;
|
||||
char buf[512];
|
||||
win_platform platform;
|
||||
char buf[256];
|
||||
|
||||
if (channel->nservers > -1) /* don't override ARES_OPT_SERVER */
|
||||
return ARES_SUCCESS;
|
||||
@@ -840,9 +716,7 @@ DhcpNameServer
|
||||
goto okay;
|
||||
}
|
||||
|
||||
platform = ares__getplatform();
|
||||
|
||||
if (platform == WIN_NT)
|
||||
if (IS_NT())
|
||||
{
|
||||
if (RegOpenKeyEx(
|
||||
HKEY_LOCAL_MACHINE, WIN_NS_NT_KEY, 0,
|
||||
@@ -876,7 +750,7 @@ DhcpNameServer
|
||||
RegCloseKey(mykey);
|
||||
}
|
||||
}
|
||||
else if (platform == WIN_9X)
|
||||
else
|
||||
{
|
||||
if (RegOpenKeyEx(
|
||||
HKEY_LOCAL_MACHINE, WIN_NS_9X, 0,
|
||||
@@ -958,10 +832,7 @@ DhcpNameServer
|
||||
return ARES_ENOMEM;
|
||||
|
||||
for (i = 0; def_nameservers[i]; i++)
|
||||
{
|
||||
servers[i].addr.addrV4.s_addr = htonl(def_nameservers[i]);
|
||||
servers[i].addr.family = AF_INET;
|
||||
}
|
||||
servers[i].addr.addrV4.s_addr = htonl(def_nameservers[i]);
|
||||
status = ARES_EOF;
|
||||
|
||||
#elif defined(ANDROID)
|
||||
@@ -985,19 +856,17 @@ DhcpNameServer
|
||||
if (fp) {
|
||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||
{
|
||||
if ((p = try_config(line, "domain", ';')))
|
||||
if ((p = try_config(line, "domain")))
|
||||
status = config_domain(channel, p);
|
||||
else if ((p = try_config(line, "lookup", ';')) && !channel->lookups)
|
||||
else if ((p = try_config(line, "lookup")) && !channel->lookups)
|
||||
status = config_lookup(channel, p, "bind", "file");
|
||||
else if ((p = try_config(line, "search", ';')))
|
||||
else if ((p = try_config(line, "search")))
|
||||
status = set_search(channel, p);
|
||||
else if ((p = try_config(line, "nameserver", ';')) &&
|
||||
channel->nservers == -1)
|
||||
else if ((p = try_config(line, "nameserver")) && channel->nservers == -1)
|
||||
status = config_nameserver(&servers, &nservers, p);
|
||||
else if ((p = try_config(line, "sortlist", ';')) &&
|
||||
channel->nsort == -1)
|
||||
else if ((p = try_config(line, "sortlist")) && channel->nsort == -1)
|
||||
status = config_sortlist(&sortlist, &nsort, p);
|
||||
else if ((p = try_config(line, "options", ';')))
|
||||
else if ((p = try_config(line, "options")))
|
||||
status = set_options(channel, p);
|
||||
else
|
||||
status = ARES_SUCCESS;
|
||||
@@ -1027,9 +896,8 @@ DhcpNameServer
|
||||
if (fp) {
|
||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||
{
|
||||
if ((p = try_config(line, "hosts:", '\0')) && !channel->lookups)
|
||||
/* ignore errors */
|
||||
(void)config_lookup(channel, p, "dns", "files");
|
||||
if ((p = try_config(line, "hosts:")) && !channel->lookups)
|
||||
status = config_lookup(channel, p, "dns", "files");
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
@@ -1055,9 +923,8 @@ DhcpNameServer
|
||||
if (fp) {
|
||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||
{
|
||||
if ((p = try_config(line, "order", '\0')) && !channel->lookups)
|
||||
/* ignore errors */
|
||||
(void)config_lookup(channel, p, "bind", "hosts");
|
||||
if ((p = try_config(line, "order")) && !channel->lookups)
|
||||
status = config_lookup(channel, p, "bind", "hosts");
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
@@ -1083,9 +950,8 @@ DhcpNameServer
|
||||
if (fp) {
|
||||
while ((status = ares__read_line(fp, &line, &linesize)) == ARES_SUCCESS)
|
||||
{
|
||||
if ((p = try_config(line, "hosts=", '\0')) && !channel->lookups)
|
||||
/* ignore errors */
|
||||
(void)config_lookup(channel, p, "bind", "local");
|
||||
if ((p = try_config(line, "hosts=")) && !channel->lookups)
|
||||
status = config_lookup(channel, p, "bind", "local");
|
||||
}
|
||||
fclose(fp);
|
||||
}
|
||||
@@ -1176,13 +1042,10 @@ static int init_by_defaults(ares_channel channel)
|
||||
channel->nservers = 1;
|
||||
}
|
||||
|
||||
#if defined(USE_WINSOCK)
|
||||
#define toolong(x) (x == -1) && (SOCKERRNO == WSAEFAULT)
|
||||
#elif defined(ENAMETOOLONG)
|
||||
#define toolong(x) (x == -1) && ((SOCKERRNO == ENAMETOOLONG) || \
|
||||
(SOCKERRNO == EINVAL))
|
||||
#ifdef ENAMETOOLONG
|
||||
#define toolong(x) (x == -1) && ((ENAMETOOLONG == errno) || (EINVAL == errno))
|
||||
#else
|
||||
#define toolong(x) (x == -1) && (SOCKERRNO == EINVAL)
|
||||
#define toolong(x) (x == -1) && (EINVAL == errno)
|
||||
#endif
|
||||
|
||||
if (channel->ndomains == -1) {
|
||||
@@ -1424,9 +1287,9 @@ static int config_sortlist(struct apattern **sortlist, int *nsort,
|
||||
if (!sortlist_alloc(sortlist, nsort, &pat))
|
||||
return ARES_ENOMEM;
|
||||
}
|
||||
else if (ipbufpfx[0] &&
|
||||
(bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addrV4,
|
||||
sizeof(pat.addrV4))) > 0)
|
||||
if (ipbufpfx[0] &&
|
||||
(bits = ares_inet_net_pton(AF_INET, ipbufpfx, &pat.addrV4,
|
||||
sizeof(pat.addrV4))) > 0)
|
||||
{
|
||||
pat.type = PATTERN_CIDR;
|
||||
pat.mask.bits = (unsigned short)bits;
|
||||
@@ -1563,7 +1426,7 @@ static const char *try_option(const char *p, const char *q, const char *opt)
|
||||
}
|
||||
|
||||
#if !defined(WIN32) && !defined(WATT32)
|
||||
static char *try_config(char *s, const char *opt, char scc)
|
||||
static char *try_config(char *s, const char *opt)
|
||||
{
|
||||
size_t len;
|
||||
char *p;
|
||||
@@ -1573,17 +1436,10 @@ static char *try_config(char *s, const char *opt, char scc)
|
||||
/* no line or no option */
|
||||
return NULL;
|
||||
|
||||
/* Hash '#' character is always used as primary comment char, additionally
|
||||
a not-NUL secondary comment char will be considered when specified. */
|
||||
|
||||
/* trim line comment */
|
||||
p = s;
|
||||
if(scc)
|
||||
while (*p && (*p != '#') && (*p != scc))
|
||||
p++;
|
||||
else
|
||||
while (*p && (*p != '#'))
|
||||
p++;
|
||||
while (*p && (*p != '#'))
|
||||
p++;
|
||||
*p = '\0';
|
||||
|
||||
/* trim trailing whitespace */
|
||||
@@ -26,7 +26,6 @@
|
||||
#ifdef USE_WINSOCK
|
||||
fpGetNetworkParams_t ares_fpGetNetworkParams = ZERO_NULL;
|
||||
fpSystemFunction036_t ares_fpSystemFunction036 = ZERO_NULL;
|
||||
fpGetAdaptersAddresses_t ares_fpGetAdaptersAddresses = ZERO_NULL;
|
||||
#endif
|
||||
|
||||
/* library-private global vars with source visibility restricted to this file */
|
||||
@@ -57,15 +56,6 @@ static int ares_win32_init(void)
|
||||
return ARES_EADDRGETNETWORKPARAMS;
|
||||
}
|
||||
|
||||
ares_fpGetAdaptersAddresses = (fpGetAdaptersAddresses_t)
|
||||
GetProcAddress(hnd_iphlpapi, "GetAdaptersAddresses");
|
||||
if (!ares_fpGetAdaptersAddresses)
|
||||
{
|
||||
/* This can happen on clients before WinXP, I don't
|
||||
think it should be an error, unless we don't want to
|
||||
support Windows 2000 anymore */
|
||||
}
|
||||
|
||||
/*
|
||||
* When advapi32.dll is unavailable or advapi32.dll has no SystemFunction036,
|
||||
* also known as RtlGenRandom, which is the case for Windows versions prior
|
||||
@@ -3,7 +3,7 @@
|
||||
|
||||
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
* Copyright (C) 2004-2011 by Daniel Stenberg
|
||||
* Copyright (C) 2004-2009 by Daniel Stenberg
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
@@ -23,18 +23,15 @@
|
||||
#ifdef USE_WINSOCK
|
||||
|
||||
#include <iphlpapi.h>
|
||||
#include "ares_iphlpapi.h"
|
||||
|
||||
typedef DWORD (WINAPI *fpGetNetworkParams_t) (FIXED_INFO*, DWORD*);
|
||||
typedef BOOLEAN (APIENTRY *fpSystemFunction036_t) (void*, ULONG);
|
||||
typedef ULONG (WINAPI *fpGetAdaptersAddresses_t) ( ULONG, ULONG, void*, IP_ADAPTER_ADDRESSES*, ULONG* );
|
||||
|
||||
/* Forward-declaration of variables defined in ares_library_init.c */
|
||||
/* that are global and unique instances for whole c-ares library. */
|
||||
|
||||
extern fpGetNetworkParams_t ares_fpGetNetworkParams;
|
||||
extern fpSystemFunction036_t ares_fpSystemFunction036;
|
||||
extern fpGetAdaptersAddresses_t ares_fpGetAdaptersAddresses;
|
||||
|
||||
#endif /* USE_WINSOCK */
|
||||
|
||||
70
deps/c-ares/ares_nowarn.c
vendored
Normal file
70
deps/c-ares/ares_nowarn.c
vendored
Normal file
@@ -0,0 +1,70 @@
|
||||
|
||||
/* Copyright (C) 2010 by Daniel Stenberg
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
* notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting
|
||||
* documentation, and that the name of M.I.T. not be used in
|
||||
* advertising or publicity pertaining to distribution of the
|
||||
* software without specific, written prior permission.
|
||||
* M.I.T. makes no representations about the suitability of
|
||||
* this software for any purpose. It is provided "as is"
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
|
||||
#include "ares_setup.h"
|
||||
|
||||
#include "ares_nowarn.h"
|
||||
|
||||
#if (SIZEOF_INT == 2)
|
||||
# define CARES_MASK_SINT 0x7FFF
|
||||
# define CARES_MASK_UINT 0xFFFF
|
||||
#elif (SIZEOF_INT == 4)
|
||||
# define CARES_MASK_SINT 0x7FFFFFFF
|
||||
# define CARES_MASK_UINT 0xFFFFFFFF
|
||||
#elif (SIZEOF_INT == 8)
|
||||
# define CARES_MASK_SINT 0x7FFFFFFFFFFFFFFF
|
||||
# define CARES_MASK_UINT 0xFFFFFFFFFFFFFFFF
|
||||
#elif (SIZEOF_INT == 16)
|
||||
# define CARES_MASK_SINT 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
||||
# define CARES_MASK_UINT 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF
|
||||
#endif
|
||||
|
||||
/*
|
||||
** size_t to signed int
|
||||
*/
|
||||
|
||||
int aresx_uztosi(size_t uznum)
|
||||
{
|
||||
#ifdef __INTEL_COMPILER
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:810) /* conversion may lose significant bits */
|
||||
#endif
|
||||
|
||||
return (int)(uznum & (size_t) CARES_MASK_SINT);
|
||||
|
||||
#ifdef __INTEL_COMPILER
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
}
|
||||
|
||||
/*
|
||||
** signed long to signed int
|
||||
*/
|
||||
|
||||
int aresx_sltosi(long slnum)
|
||||
{
|
||||
#ifdef __INTEL_COMPILER
|
||||
# pragma warning(push)
|
||||
# pragma warning(disable:810) /* conversion may lose significant bits */
|
||||
#endif
|
||||
|
||||
return (int)(slnum & (long) CARES_MASK_SINT);
|
||||
|
||||
#ifdef __INTEL_COMPILER
|
||||
# pragma warning(pop)
|
||||
#endif
|
||||
}
|
||||
24
deps/c-ares/ares_nowarn.h
vendored
Normal file
24
deps/c-ares/ares_nowarn.h
vendored
Normal file
@@ -0,0 +1,24 @@
|
||||
#ifndef HEADER_CARES_NOWARN_H
|
||||
#define HEADER_CARES_NOWARN_H
|
||||
|
||||
|
||||
/* Copyright (C) 2010 by Daniel Stenberg
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
* fee is hereby granted, provided that the above copyright
|
||||
* notice appear in all copies and that both that copyright
|
||||
* notice and this permission notice appear in supporting
|
||||
* documentation, and that the name of M.I.T. not be used in
|
||||
* advertising or publicity pertaining to distribution of the
|
||||
* software without specific, written prior permission.
|
||||
* M.I.T. makes no representations about the suitability of
|
||||
* this software for any purpose. It is provided "as is"
|
||||
* without express or implied warranty.
|
||||
*/
|
||||
|
||||
int aresx_uztosi(size_t uznum);
|
||||
|
||||
int aresx_sltosi(long slnum);
|
||||
|
||||
#endif /* HEADER_CARES_NOWARN_H */
|
||||
@@ -1,6 +1,6 @@
|
||||
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
* Copyright (C) 2008-2011 by Daniel Stenberg
|
||||
* Copyright (C) 2008-2010 by Daniel Stenberg
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
* software and its documentation for any purpose and without
|
||||
@@ -135,10 +135,12 @@ int ares_set_servers(ares_channel channel,
|
||||
int ares_set_servers_csv(ares_channel channel,
|
||||
const char* _csv)
|
||||
{
|
||||
size_t i;
|
||||
int i;
|
||||
char* csv = NULL;
|
||||
char* ptr;
|
||||
char* start_host;
|
||||
long port;
|
||||
bool found_port;
|
||||
int rv = ARES_SUCCESS;
|
||||
struct ares_addr_node *servers = NULL;
|
||||
struct ares_addr_node *last = NULL;
|
||||
@@ -163,6 +165,7 @@ int ares_set_servers_csv(ares_channel channel,
|
||||
}
|
||||
|
||||
start_host = csv;
|
||||
found_port = false;
|
||||
for (ptr = csv; *ptr; ptr++) {
|
||||
if (*ptr == ',') {
|
||||
char* pp = ptr - 1;
|
||||
@@ -183,8 +186,9 @@ int ares_set_servers_csv(ares_channel channel,
|
||||
pp--;
|
||||
}
|
||||
if ((pp != start_host) && ((pp + 1) < ptr)) {
|
||||
/* Found it. Parse over the port number */
|
||||
(void)strtol(pp + 1, NULL, 10);
|
||||
/* Found it. */
|
||||
found_port = true;
|
||||
port = strtol(pp + 1, NULL, 10);
|
||||
*pp = 0; /* null terminate host */
|
||||
}
|
||||
/* resolve host, try ipv4 first, rslt is in network byte order */
|
||||
@@ -229,6 +233,7 @@ int ares_set_servers_csv(ares_channel channel,
|
||||
}
|
||||
|
||||
/* Set up for next one */
|
||||
found_port = false;
|
||||
start_host = ptr + 1;
|
||||
}
|
||||
}
|
||||
@@ -132,7 +132,6 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
aptr += len;
|
||||
if (aptr + RRFIXEDSZ > abuf + alen)
|
||||
{
|
||||
free(rr_name);
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
@@ -150,7 +149,6 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
{
|
||||
if (aptr + sizeof(struct in_addr) > abuf + alen)
|
||||
{
|
||||
free(rr_name);
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
@@ -161,7 +159,6 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
struct ares_addrttl * const at = &addrttls[naddrs];
|
||||
if (aptr + sizeof(struct in_addr) > abuf + alen)
|
||||
{
|
||||
free(rr_name);
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
@@ -241,8 +238,6 @@ int ares_parse_a_reply(const unsigned char *abuf, int alen,
|
||||
for (i = 0; i < naddrs; i++)
|
||||
hostent->h_addr_list[i] = (char *) &addrs[i];
|
||||
hostent->h_addr_list[naddrs] = NULL;
|
||||
if (!naddrs && addrs)
|
||||
free(addrs);
|
||||
*host = hostent;
|
||||
return ARES_SUCCESS;
|
||||
}
|
||||
@@ -132,7 +132,6 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
aptr += len;
|
||||
if (aptr + RRFIXEDSZ > abuf + alen)
|
||||
{
|
||||
free(rr_name);
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
@@ -150,7 +149,6 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
{
|
||||
if (aptr + sizeof(struct ares_in6_addr) > abuf + alen)
|
||||
{
|
||||
free(rr_name);
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
@@ -161,7 +159,6 @@ int ares_parse_aaaa_reply(const unsigned char *abuf, int alen,
|
||||
struct ares_addr6ttl * const at = &addrttls[naddrs];
|
||||
if (aptr + sizeof(struct ares_in6_addr) > abuf + alen)
|
||||
{
|
||||
free(rr_name);
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
@@ -47,7 +47,7 @@
|
||||
|
||||
int
|
||||
ares_parse_mx_reply (const unsigned char *abuf, int alen,
|
||||
struct ares_mx_reply **mx_out)
|
||||
struct ares_mx_reply **mx_out)
|
||||
{
|
||||
unsigned int qdcount, ancount, i;
|
||||
const unsigned char *aptr, *vptr;
|
||||
@@ -134,7 +134,7 @@ ares_parse_mx_reply (const unsigned char *abuf, int alen,
|
||||
mx_last = mx_curr;
|
||||
|
||||
vptr = aptr;
|
||||
mx_curr->priority = DNS__16BIT(vptr);
|
||||
mx_curr->priority = ntohs (*((unsigned short *)vptr));
|
||||
vptr += sizeof(unsigned short);
|
||||
|
||||
status = ares_expand_name (vptr, abuf, alen, &mx_curr->host, &len);
|
||||
@@ -1,3 +1,5 @@
|
||||
/* $Id */
|
||||
|
||||
/* Copyright 1998 by the Massachusetts Institute of Technology.
|
||||
*
|
||||
* Permission to use, copy, modify, and distribute this
|
||||
@@ -103,7 +105,6 @@ int ares_parse_ns_reply( const unsigned char* abuf, int alen,
|
||||
if ( aptr + RRFIXEDSZ > abuf + alen )
|
||||
{
|
||||
status = ARES_EBADRESP;
|
||||
free(rr_name);
|
||||
break;
|
||||
}
|
||||
rr_type = DNS_RR_TYPE( aptr );
|
||||
@@ -118,7 +119,6 @@ int ares_parse_ns_reply( const unsigned char* abuf, int alen,
|
||||
&len);
|
||||
if ( status != ARES_SUCCESS )
|
||||
{
|
||||
free(rr_name);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -99,7 +99,6 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
||||
aptr += len;
|
||||
if (aptr + RRFIXEDSZ > abuf + alen)
|
||||
{
|
||||
free(rr_name);
|
||||
status = ARES_EBADRESP;
|
||||
break;
|
||||
}
|
||||
@@ -115,17 +114,13 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
||||
status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
|
||||
&len);
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
free(rr_name);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
if (hostname)
|
||||
free(hostname);
|
||||
hostname = rr_data;
|
||||
aliases[aliascnt] = malloc((strlen(rr_data)+1) * sizeof(char));
|
||||
aliases[aliascnt] = malloc((strlen(rr_data)+1) * sizeof(char *));
|
||||
if (!aliases[aliascnt])
|
||||
{
|
||||
free(rr_name);
|
||||
status = ARES_ENOMEM;
|
||||
break;
|
||||
}
|
||||
@@ -136,7 +131,6 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
||||
alias_alloc *= 2;
|
||||
ptr = realloc(aliases, alias_alloc * sizeof(char *));
|
||||
if(!ptr) {
|
||||
free(rr_name);
|
||||
status = ARES_ENOMEM;
|
||||
break;
|
||||
}
|
||||
@@ -150,10 +144,7 @@ int ares_parse_ptr_reply(const unsigned char *abuf, int alen, const void *addr,
|
||||
status = ares__expand_name_for_response(aptr, abuf, alen, &rr_data,
|
||||
&len);
|
||||
if (status != ARES_SUCCESS)
|
||||
{
|
||||
free(rr_name);
|
||||
break;
|
||||
}
|
||||
break;
|
||||
free(ptrname);
|
||||
ptrname = rr_data;
|
||||
}
|
||||
@@ -139,11 +139,11 @@ ares_parse_srv_reply (const unsigned char *abuf, int alen,
|
||||
srv_last = srv_curr;
|
||||
|
||||
vptr = aptr;
|
||||
srv_curr->priority = DNS__16BIT(vptr);
|
||||
srv_curr->priority = ntohs (*((unsigned short *)vptr));
|
||||
vptr += sizeof(unsigned short);
|
||||
srv_curr->weight = DNS__16BIT(vptr);
|
||||
srv_curr->weight = ntohs (*((unsigned short *)vptr));
|
||||
vptr += sizeof(unsigned short);
|
||||
srv_curr->port = DNS__16BIT(vptr);
|
||||
srv_curr->port = ntohs (*((unsigned short *)vptr));
|
||||
vptr += sizeof(unsigned short);
|
||||
|
||||
status = ares_expand_name (vptr, abuf, alen, &srv_curr->host, &len);
|
||||
@@ -52,6 +52,7 @@
|
||||
|
||||
#if defined(WIN32) && !defined(WATT32)
|
||||
|
||||
#define IS_NT() ((int)GetVersion() > 0)
|
||||
#define WIN_NS_9X "System\\CurrentControlSet\\Services\\VxD\\MSTCP"
|
||||
#define WIN_NS_NT_KEY "System\\CurrentControlSet\\Services\\Tcpip\\Parameters"
|
||||
#define NAMESERVER "NameServer"
|
||||
@@ -88,11 +89,6 @@
|
||||
#include "ares_ipv6.h"
|
||||
#include "ares_llist.h"
|
||||
|
||||
#ifndef HAVE_GETENV
|
||||
# include "ares_getenv.h"
|
||||
# define getenv(ptr) ares_getenv(ptr)
|
||||
#endif
|
||||
|
||||
#ifndef HAVE_STRDUP
|
||||
# include "ares_strdup.h"
|
||||
# define strdup(ptr) ares_strdup(ptr)
|
||||
@@ -203,7 +199,7 @@ struct query {
|
||||
void *arg;
|
||||
|
||||
/* Query status */
|
||||
int try_count; /* Number of times we tried this query already. */
|
||||
int try; /* Number of times we tried this query already. */
|
||||
int server; /* Server this query has last been sent to. */
|
||||
struct query_server_info *server_info; /* per-server state */
|
||||
int using_tcp;
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user