| @@ -0,0 +1 @@ | ||
| ref: refs/heads/master |
| @@ -0,0 +1,6 @@ | ||
| [core] | ||
| repositoryformatversion = 0 | ||
| filemode = true | ||
| bare = true | ||
| [remote "origin"] | ||
| url = https://github.com/agentgoblin/stunagmon |
| @@ -0,0 +1 @@ | ||
| Unnamed repository; edit this file 'description' to name the repository. |
| @@ -0,0 +1,15 @@ | ||
| #!/bin/sh | ||
| # | ||
| # An example hook script to check the commit log message taken by | ||
| # applypatch from an e-mail message. | ||
| # | ||
| # The hook should exit with non-zero status after issuing an | ||
| # appropriate message if it wants to stop the commit. The hook is | ||
| # allowed to edit the commit message file. | ||
| # | ||
| # To enable this hook, rename this file to "applypatch-msg". | ||
|
|
||
| . git-sh-setup | ||
| test -x "$GIT_DIR/hooks/commit-msg" && | ||
| exec "$GIT_DIR/hooks/commit-msg" ${1+"$@"} | ||
| : |
| @@ -0,0 +1,24 @@ | ||
| #!/bin/sh | ||
| # | ||
| # An example hook script to check the commit log message. | ||
| # Called by "git commit" with one argument, the name of the file | ||
| # that has the commit message. The hook should exit with non-zero | ||
| # status after issuing an appropriate message if it wants to stop the | ||
| # commit. The hook is allowed to edit the commit message file. | ||
| # | ||
| # To enable this hook, rename this file to "commit-msg". | ||
|
|
||
| # Uncomment the below to add a Signed-off-by line to the message. | ||
| # Doing this in a hook is a bad idea in general, but the prepare-commit-msg | ||
| # hook is more suited to it. | ||
| # | ||
| # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') | ||
| # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" | ||
|
|
||
| # This example catches duplicate Signed-off-by lines. | ||
|
|
||
| test "" = "$(grep '^Signed-off-by: ' "$1" | | ||
| sort | uniq -c | sed -e '/^[ ]*1[ ]/d')" || { | ||
| echo >&2 Duplicate Signed-off-by lines. | ||
| exit 1 | ||
| } |
| @@ -0,0 +1,8 @@ | ||
| #!/bin/sh | ||
| # | ||
| # An example hook script to prepare a packed repository for use over | ||
| # dumb transports. | ||
| # | ||
| # To enable this hook, rename this file to "post-update". | ||
|
|
||
| exec git update-server-info |
| @@ -0,0 +1,14 @@ | ||
| #!/bin/sh | ||
| # | ||
| # An example hook script to verify what is about to be committed | ||
| # by applypatch from an e-mail message. | ||
| # | ||
| # The hook should exit with non-zero status after issuing an | ||
| # appropriate message if it wants to stop the commit. | ||
| # | ||
| # To enable this hook, rename this file to "pre-applypatch". | ||
|
|
||
| . git-sh-setup | ||
| test -x "$GIT_DIR/hooks/pre-commit" && | ||
| exec "$GIT_DIR/hooks/pre-commit" ${1+"$@"} | ||
| : |
| @@ -0,0 +1,49 @@ | ||
| #!/bin/sh | ||
| # | ||
| # An example hook script to verify what is about to be committed. | ||
| # Called by "git commit" with no arguments. The hook should | ||
| # exit with non-zero status after issuing an appropriate message if | ||
| # it wants to stop the commit. | ||
| # | ||
| # To enable this hook, rename this file to "pre-commit". | ||
|
|
||
| if git rev-parse --verify HEAD >/dev/null 2>&1 | ||
| then | ||
| against=HEAD | ||
| else | ||
| # Initial commit: diff against an empty tree object | ||
| against=4b825dc642cb6eb9a060e54bf8d69288fbee4904 | ||
| fi | ||
|
|
||
| # If you want to allow non-ASCII filenames set this variable to true. | ||
| allownonascii=$(git config --bool hooks.allownonascii) | ||
|
|
||
| # Redirect output to stderr. | ||
| exec 1>&2 | ||
|
|
||
| # Cross platform projects tend to avoid non-ASCII filenames; prevent | ||
| # them from being added to the repository. We exploit the fact that the | ||
| # printable range starts at the space character and ends with tilde. | ||
| if [ "$allownonascii" != "true" ] && | ||
| # Note that the use of brackets around a tr range is ok here, (it's | ||
| # even required, for portability to Solaris 10's /usr/bin/tr), since | ||
| # the square bracket bytes happen to fall in the designated range. | ||
| test $(git diff --cached --name-only --diff-filter=A -z $against | | ||
| LC_ALL=C tr -d '[ -~]\0' | wc -c) != 0 | ||
| then | ||
| cat <<\EOF | ||
| Error: Attempt to add a non-ASCII file name. | ||
| This can cause problems if you want to work with people on other platforms. | ||
| To be portable it is advisable to rename the file. | ||
| If you know what you are doing you can disable this check using: | ||
| git config hooks.allownonascii true | ||
| EOF | ||
| exit 1 | ||
| fi | ||
|
|
||
| # If there are whitespace errors, print the offending file names and fail. | ||
| exec git diff-index --check --cached $against -- |
| @@ -0,0 +1,54 @@ | ||
| #!/bin/sh | ||
|
|
||
| # An example hook script to verify what is about to be pushed. Called by "git | ||
| # push" after it has checked the remote status, but before anything has been | ||
| # pushed. If this script exits with a non-zero status nothing will be pushed. | ||
| # | ||
| # This hook is called with the following parameters: | ||
| # | ||
| # $1 -- Name of the remote to which the push is being done | ||
| # $2 -- URL to which the push is being done | ||
| # | ||
| # If pushing without using a named remote those arguments will be equal. | ||
| # | ||
| # Information about the commits which are being pushed is supplied as lines to | ||
| # the standard input in the form: | ||
| # | ||
| # <local ref> <local sha1> <remote ref> <remote sha1> | ||
| # | ||
| # This sample shows how to prevent push of commits where the log message starts | ||
| # with "WIP" (work in progress). | ||
|
|
||
| remote="$1" | ||
| url="$2" | ||
|
|
||
| z40=0000000000000000000000000000000000000000 | ||
|
|
||
| IFS=' ' | ||
| while read local_ref local_sha remote_ref remote_sha | ||
| do | ||
| if [ "$local_sha" = $z40 ] | ||
| then | ||
| # Handle delete | ||
| : | ||
| else | ||
| if [ "$remote_sha" = $z40 ] | ||
| then | ||
| # New branch, examine all commits | ||
| range="$local_sha" | ||
| else | ||
| # Update to existing branch, examine new commits | ||
| range="$remote_sha..$local_sha" | ||
| fi | ||
|
|
||
| # Check for WIP commit | ||
| commit=`git rev-list -n 1 --grep '^WIP' "$range"` | ||
| if [ -n "$commit" ] | ||
| then | ||
| echo "Found WIP commit in $local_ref, not pushing" | ||
| exit 1 | ||
| fi | ||
| fi | ||
| done | ||
|
|
||
| exit 0 |
| @@ -0,0 +1,169 @@ | ||
| #!/bin/sh | ||
| # | ||
| # Copyright (c) 2006, 2008 Junio C Hamano | ||
| # | ||
| # The "pre-rebase" hook is run just before "git rebase" starts doing | ||
| # its job, and can prevent the command from running by exiting with | ||
| # non-zero status. | ||
| # | ||
| # The hook is called with the following parameters: | ||
| # | ||
| # $1 -- the upstream the series was forked from. | ||
| # $2 -- the branch being rebased (or empty when rebasing the current branch). | ||
| # | ||
| # This sample shows how to prevent topic branches that are already | ||
| # merged to 'next' branch from getting rebased, because allowing it | ||
| # would result in rebasing already published history. | ||
|
|
||
| publish=next | ||
| basebranch="$1" | ||
| if test "$#" = 2 | ||
| then | ||
| topic="refs/heads/$2" | ||
| else | ||
| topic=`git symbolic-ref HEAD` || | ||
| exit 0 ;# we do not interrupt rebasing detached HEAD | ||
| fi | ||
|
|
||
| case "$topic" in | ||
| refs/heads/??/*) | ||
| ;; | ||
| *) | ||
| exit 0 ;# we do not interrupt others. | ||
| ;; | ||
| esac | ||
|
|
||
| # Now we are dealing with a topic branch being rebased | ||
| # on top of master. Is it OK to rebase it? | ||
|
|
||
| # Does the topic really exist? | ||
| git show-ref -q "$topic" || { | ||
| echo >&2 "No such branch $topic" | ||
| exit 1 | ||
| } | ||
|
|
||
| # Is topic fully merged to master? | ||
| not_in_master=`git rev-list --pretty=oneline ^master "$topic"` | ||
| if test -z "$not_in_master" | ||
| then | ||
| echo >&2 "$topic is fully merged to master; better remove it." | ||
| exit 1 ;# we could allow it, but there is no point. | ||
| fi | ||
|
|
||
| # Is topic ever merged to next? If so you should not be rebasing it. | ||
| only_next_1=`git rev-list ^master "^$topic" ${publish} | sort` | ||
| only_next_2=`git rev-list ^master ${publish} | sort` | ||
| if test "$only_next_1" = "$only_next_2" | ||
| then | ||
| not_in_topic=`git rev-list "^$topic" master` | ||
| if test -z "$not_in_topic" | ||
| then | ||
| echo >&2 "$topic is already up-to-date with master" | ||
| exit 1 ;# we could allow it, but there is no point. | ||
| else | ||
| exit 0 | ||
| fi | ||
| else | ||
| not_in_next=`git rev-list --pretty=oneline ^${publish} "$topic"` | ||
| /usr/bin/perl -e ' | ||
| my $topic = $ARGV[0]; | ||
| my $msg = "* $topic has commits already merged to public branch:\n"; | ||
| my (%not_in_next) = map { | ||
| /^([0-9a-f]+) /; | ||
| ($1 => 1); | ||
| } split(/\n/, $ARGV[1]); | ||
| for my $elem (map { | ||
| /^([0-9a-f]+) (.*)$/; | ||
| [$1 => $2]; | ||
| } split(/\n/, $ARGV[2])) { | ||
| if (!exists $not_in_next{$elem->[0]}) { | ||
| if ($msg) { | ||
| print STDERR $msg; | ||
| undef $msg; | ||
| } | ||
| print STDERR " $elem->[1]\n"; | ||
| } | ||
| } | ||
| ' "$topic" "$not_in_next" "$not_in_master" | ||
| exit 1 | ||
| fi | ||
|
|
||
| <<\DOC_END | ||
| This sample hook safeguards topic branches that have been | ||
| published from being rewound. | ||
| The workflow assumed here is: | ||
| * Once a topic branch forks from "master", "master" is never | ||
| merged into it again (either directly or indirectly). | ||
| * Once a topic branch is fully cooked and merged into "master", | ||
| it is deleted. If you need to build on top of it to correct | ||
| earlier mistakes, a new topic branch is created by forking at | ||
| the tip of the "master". This is not strictly necessary, but | ||
| it makes it easier to keep your history simple. | ||
| * Whenever you need to test or publish your changes to topic | ||
| branches, merge them into "next" branch. | ||
| The script, being an example, hardcodes the publish branch name | ||
| to be "next", but it is trivial to make it configurable via | ||
| $GIT_DIR/config mechanism. | ||
| With this workflow, you would want to know: | ||
| (1) ... if a topic branch has ever been merged to "next". Young | ||
| topic branches can have stupid mistakes you would rather | ||
| clean up before publishing, and things that have not been | ||
| merged into other branches can be easily rebased without | ||
| affecting other people. But once it is published, you would | ||
| not want to rewind it. | ||
| (2) ... if a topic branch has been fully merged to "master". | ||
| Then you can delete it. More importantly, you should not | ||
| build on top of it -- other people may already want to | ||
| change things related to the topic as patches against your | ||
| "master", so if you need further changes, it is better to | ||
| fork the topic (perhaps with the same name) afresh from the | ||
| tip of "master". | ||
| Let's look at this example: | ||
| o---o---o---o---o---o---o---o---o---o "next" | ||
| / / / / | ||
| / a---a---b A / / | ||
| / / / / | ||
| / / c---c---c---c B / | ||
| / / / \ / | ||
| / / / b---b C \ / | ||
| / / / / \ / | ||
| ---o---o---o---o---o---o---o---o---o---o---o "master" | ||
| A, B and C are topic branches. | ||
| * A has one fix since it was merged up to "next". | ||
| * B has finished. It has been fully merged up to "master" and "next", | ||
| and is ready to be deleted. | ||
| * C has not merged to "next" at all. | ||
| We would want to allow C to be rebased, refuse A, and encourage | ||
| B to be deleted. | ||
| To compute (1): | ||
| git rev-list ^master ^topic next | ||
| git rev-list ^master next | ||
| if these match, topic has not merged in next at all. | ||
| To compute (2): | ||
| git rev-list master..topic | ||
| if this is empty, it is fully merged to "master". | ||
| DOC_END |
| @@ -0,0 +1,36 @@ | ||
| #!/bin/sh | ||
| # | ||
| # An example hook script to prepare the commit log message. | ||
| # Called by "git commit" with the name of the file that has the | ||
| # commit message, followed by the description of the commit | ||
| # message's source. The hook's purpose is to edit the commit | ||
| # message file. If the hook fails with a non-zero status, | ||
| # the commit is aborted. | ||
| # | ||
| # To enable this hook, rename this file to "prepare-commit-msg". | ||
|
|
||
| # This hook includes three examples. The first comments out the | ||
| # "Conflicts:" part of a merge commit. | ||
| # | ||
| # The second includes the output of "git diff --name-status -r" | ||
| # into the message, just before the "git status" output. It is | ||
| # commented because it doesn't cope with --amend or with squashed | ||
| # commits. | ||
| # | ||
| # The third example adds a Signed-off-by line to the message, that can | ||
| # still be edited. This is rarely a good idea. | ||
|
|
||
| case "$2,$3" in | ||
| merge,) | ||
| /usr/bin/perl -i.bak -ne 's/^/# /, s/^# #/#/ if /^Conflicts/ .. /#/; print' "$1" ;; | ||
|
|
||
| # ,|template,) | ||
| # /usr/bin/perl -i.bak -pe ' | ||
| # print "\n" . `git diff --cached --name-status -r` | ||
| # if /^#/ && $first++ == 0' "$1" ;; | ||
|
|
||
| *) ;; | ||
| esac | ||
|
|
||
| # SOB=$(git var GIT_AUTHOR_IDENT | sed -n 's/^\(.*>\).*$/Signed-off-by: \1/p') | ||
| # grep -qs "^$SOB" "$1" || echo "$SOB" >> "$1" |
| @@ -0,0 +1,128 @@ | ||
| #!/bin/sh | ||
| # | ||
| # An example hook script to blocks unannotated tags from entering. | ||
| # Called by "git receive-pack" with arguments: refname sha1-old sha1-new | ||
| # | ||
| # To enable this hook, rename this file to "update". | ||
| # | ||
| # Config | ||
| # ------ | ||
| # hooks.allowunannotated | ||
| # This boolean sets whether unannotated tags will be allowed into the | ||
| # repository. By default they won't be. | ||
| # hooks.allowdeletetag | ||
| # This boolean sets whether deleting tags will be allowed in the | ||
| # repository. By default they won't be. | ||
| # hooks.allowmodifytag | ||
| # This boolean sets whether a tag may be modified after creation. By default | ||
| # it won't be. | ||
| # hooks.allowdeletebranch | ||
| # This boolean sets whether deleting branches will be allowed in the | ||
| # repository. By default they won't be. | ||
| # hooks.denycreatebranch | ||
| # This boolean sets whether remotely creating branches will be denied | ||
| # in the repository. By default this is allowed. | ||
| # | ||
|
|
||
| # --- Command line | ||
| refname="$1" | ||
| oldrev="$2" | ||
| newrev="$3" | ||
|
|
||
| # --- Safety check | ||
| if [ -z "$GIT_DIR" ]; then | ||
| echo "Don't run this script from the command line." >&2 | ||
| echo " (if you want, you could supply GIT_DIR then run" >&2 | ||
| echo " $0 <ref> <oldrev> <newrev>)" >&2 | ||
| exit 1 | ||
| fi | ||
|
|
||
| if [ -z "$refname" -o -z "$oldrev" -o -z "$newrev" ]; then | ||
| echo "usage: $0 <ref> <oldrev> <newrev>" >&2 | ||
| exit 1 | ||
| fi | ||
|
|
||
| # --- Config | ||
| allowunannotated=$(git config --bool hooks.allowunannotated) | ||
| allowdeletebranch=$(git config --bool hooks.allowdeletebranch) | ||
| denycreatebranch=$(git config --bool hooks.denycreatebranch) | ||
| allowdeletetag=$(git config --bool hooks.allowdeletetag) | ||
| allowmodifytag=$(git config --bool hooks.allowmodifytag) | ||
|
|
||
| # check for no description | ||
| projectdesc=$(sed -e '1q' "$GIT_DIR/description") | ||
| case "$projectdesc" in | ||
| "Unnamed repository"* | "") | ||
| echo "*** Project description file hasn't been set" >&2 | ||
| exit 1 | ||
| ;; | ||
| esac | ||
|
|
||
| # --- Check types | ||
| # if $newrev is 0000...0000, it's a commit to delete a ref. | ||
| zero="0000000000000000000000000000000000000000" | ||
| if [ "$newrev" = "$zero" ]; then | ||
| newrev_type=delete | ||
| else | ||
| newrev_type=$(git cat-file -t $newrev) | ||
| fi | ||
|
|
||
| case "$refname","$newrev_type" in | ||
| refs/tags/*,commit) | ||
| # un-annotated tag | ||
| short_refname=${refname##refs/tags/} | ||
| if [ "$allowunannotated" != "true" ]; then | ||
| echo "*** The un-annotated tag, $short_refname, is not allowed in this repository" >&2 | ||
| echo "*** Use 'git tag [ -a | -s ]' for tags you want to propagate." >&2 | ||
| exit 1 | ||
| fi | ||
| ;; | ||
| refs/tags/*,delete) | ||
| # delete tag | ||
| if [ "$allowdeletetag" != "true" ]; then | ||
| echo "*** Deleting a tag is not allowed in this repository" >&2 | ||
| exit 1 | ||
| fi | ||
| ;; | ||
| refs/tags/*,tag) | ||
| # annotated tag | ||
| if [ "$allowmodifytag" != "true" ] && git rev-parse $refname > /dev/null 2>&1 | ||
| then | ||
| echo "*** Tag '$refname' already exists." >&2 | ||
| echo "*** Modifying a tag is not allowed in this repository." >&2 | ||
| exit 1 | ||
| fi | ||
| ;; | ||
| refs/heads/*,commit) | ||
| # branch | ||
| if [ "$oldrev" = "$zero" -a "$denycreatebranch" = "true" ]; then | ||
| echo "*** Creating a branch is not allowed in this repository" >&2 | ||
| exit 1 | ||
| fi | ||
| ;; | ||
| refs/heads/*,delete) | ||
| # delete branch | ||
| if [ "$allowdeletebranch" != "true" ]; then | ||
| echo "*** Deleting a branch is not allowed in this repository" >&2 | ||
| exit 1 | ||
| fi | ||
| ;; | ||
| refs/remotes/*,commit) | ||
| # tracking branch | ||
| ;; | ||
| refs/remotes/*,delete) | ||
| # delete tracking branch | ||
| if [ "$allowdeletebranch" != "true" ]; then | ||
| echo "*** Deleting a tracking branch is not allowed in this repository" >&2 | ||
| exit 1 | ||
| fi | ||
| ;; | ||
| *) | ||
| # Anything else (is there anything else?) | ||
| echo "*** Update hook: unknown type of update to ref $refname of type $newrev_type" >&2 | ||
| exit 1 | ||
| ;; | ||
| esac | ||
|
|
||
| # --- Finished | ||
| exit 0 |
| @@ -0,0 +1,6 @@ | ||
| # git ls-files --others --exclude-from=.git/info/exclude | ||
| # Lines that start with '#' are comments. | ||
| # For a project mostly in C, the following would be a good set of | ||
| # exclude patterns (uncomment them if you want to use them): | ||
| # *.[oa] | ||
| # *~ |
| @@ -0,0 +1,2 @@ | ||
| # pack-refs with: peeled fully-peeled | ||
| 808c8b59821fae4f8ce6a4f8ddacae5642fdce9d refs/heads/master |
| @@ -0,0 +1,349 @@ | ||
| #include <cassert> | ||
| #include <cstdio> | ||
| #include <cstring> | ||
| #include <errno.h> | ||
| #include <iostream> | ||
| #include <cstdlib> | ||
| #include <time.h> | ||
|
|
||
| #ifdef WIN32 | ||
|
|
||
| #include <winsock2.h> | ||
| #include <stdlib.h> | ||
| #include <io.h> | ||
|
|
||
| #else | ||
|
|
||
| #include <arpa/inet.h> | ||
| #include <stdlib.h> | ||
| #include <unistd.h> | ||
| #include <fcntl.h> | ||
| #include <netinet/in.h> | ||
| #include <sys/socket.h> | ||
| #include <sys/types.h> | ||
| #include <netdb.h> | ||
| #include <string.h> | ||
| #include <unistd.h> | ||
|
|
||
| #endif | ||
|
|
||
| #include <string.h> | ||
|
|
||
| #include "udp.h" | ||
|
|
||
| using namespace std; | ||
|
|
||
|
|
||
| Socket | ||
| openPort( unsigned short port, unsigned int interfaceIp, bool verbose ) | ||
| { | ||
| Socket fd; | ||
|
|
||
| fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_UDP); | ||
| if ( fd == INVALID_SOCKET ) | ||
| { | ||
| int err = getErrno(); | ||
| cerr << "Could not create a UDP socket:" << err << endl; | ||
| return INVALID_SOCKET; | ||
| } | ||
|
|
||
| struct sockaddr_in addr; | ||
| memset((char*) &(addr),0, sizeof((addr))); | ||
| addr.sin_family = AF_INET; | ||
| addr.sin_addr.s_addr = htonl(INADDR_ANY); | ||
| addr.sin_port = htons(port); | ||
|
|
||
| if ( (interfaceIp != 0) && | ||
| ( interfaceIp != 0x100007f ) ) | ||
| { | ||
| addr.sin_addr.s_addr = htonl(interfaceIp); | ||
| if (verbose ) | ||
| { | ||
| clog << "Binding to interface " | ||
| << hex << "0x" << htonl(interfaceIp) << dec << endl; | ||
| } | ||
| } | ||
|
|
||
| if ( bind( fd,(struct sockaddr*)&addr, sizeof(addr)) != 0 ) | ||
| { | ||
| int e = getErrno(); | ||
|
|
||
| switch (e) | ||
| { | ||
| case 0: | ||
| { | ||
| cerr << "Could not bind socket" << endl; | ||
| return INVALID_SOCKET; | ||
| } | ||
| case EADDRINUSE: | ||
| { | ||
| cerr << "Port " << port << " for receiving UDP is in use" << endl; | ||
| return INVALID_SOCKET; | ||
| } | ||
| break; | ||
| case EADDRNOTAVAIL: | ||
| { | ||
| if ( verbose ) | ||
| { | ||
| cerr << "Cannot assign requested address" << endl; | ||
| } | ||
| return INVALID_SOCKET; | ||
| } | ||
| break; | ||
| default: | ||
| { | ||
| cerr << "Could not bind UDP receive port" | ||
| << "Error=" << e << " " << strerror(e) << endl; | ||
| return INVALID_SOCKET; | ||
| } | ||
| break; | ||
| } | ||
| } | ||
| if ( verbose ) | ||
| { | ||
| clog << "Opened port " << port << " with fd " << fd << endl; | ||
| } | ||
|
|
||
| assert( fd != INVALID_SOCKET ); | ||
|
|
||
| return fd; | ||
| } | ||
|
|
||
|
|
||
| bool | ||
| getMessage( Socket fd, char* buf, int* len, | ||
| unsigned int* srcIp, unsigned short* srcPort, | ||
| bool verbose) | ||
| { | ||
| assert( fd != INVALID_SOCKET ); | ||
|
|
||
| int originalSize = *len; | ||
| assert( originalSize > 0 ); | ||
|
|
||
| struct sockaddr_in from; | ||
| int fromLen = sizeof(from); | ||
|
|
||
| *len = recvfrom(fd, | ||
| buf, | ||
| originalSize, | ||
| 0, | ||
| (struct sockaddr *)&from, | ||
| (socklen_t*)&fromLen); | ||
|
|
||
| if ( *len == SOCKET_ERROR ) | ||
| { | ||
| int err = getErrno(); | ||
|
|
||
| switch (err) | ||
| { | ||
| case ENOTSOCK: | ||
| cerr << "Error fd not a socket" << endl; | ||
| break; | ||
| case ECONNRESET: | ||
| cerr << "Error connection reset - host not reachable" << endl; | ||
| break; | ||
|
|
||
| default: | ||
| cerr << "Socket Error=" << err << endl; | ||
| } | ||
|
|
||
| return false; | ||
| } | ||
|
|
||
| if ( *len < 0 ) | ||
| { | ||
| clog << "socket closed? negative len" << endl; | ||
| return false; | ||
| } | ||
|
|
||
| if ( *len == 0 ) | ||
| { | ||
| clog << "socket closed? zero len" << endl; | ||
| return false; | ||
| } | ||
|
|
||
| *srcPort = ntohs(from.sin_port); | ||
| *srcIp = ntohl(from.sin_addr.s_addr); | ||
|
|
||
| if ( (*len)+1 >= originalSize ) | ||
| { | ||
| if (verbose) | ||
| { | ||
| clog << "Received a message that was too large" << endl; | ||
| } | ||
| return false; | ||
| } | ||
| buf[*len]=0; | ||
|
|
||
| return true; | ||
| } | ||
|
|
||
|
|
||
| bool | ||
| sendMessage( Socket fd, char* buf, int l, | ||
| unsigned int dstIp, unsigned short dstPort, | ||
| bool verbose) | ||
| { | ||
| assert( fd != INVALID_SOCKET ); | ||
|
|
||
| int s; | ||
| if ( dstPort == 0 ) | ||
| { | ||
| // sending on a connected port | ||
| assert( dstIp == 0 ); | ||
|
|
||
| s = send(fd,buf,l,0); | ||
| } | ||
| else | ||
| { | ||
| assert( dstIp != 0 ); | ||
| assert( dstPort != 0 ); | ||
|
|
||
| struct sockaddr_in to; | ||
| int toLen = sizeof(to); | ||
| memset(&to,0,toLen); | ||
|
|
||
| to.sin_family = AF_INET; | ||
| to.sin_port = htons(dstPort); | ||
| to.sin_addr.s_addr = htonl(dstIp); | ||
|
|
||
| s = sendto(fd, buf, l, 0,(sockaddr*)&to, toLen); | ||
| } | ||
|
|
||
| if ( s == SOCKET_ERROR ) | ||
| { | ||
| int e = getErrno(); | ||
| switch (e) | ||
| { | ||
| case ECONNREFUSED: | ||
| case EHOSTDOWN: | ||
| case EHOSTUNREACH: | ||
| { | ||
| // quietly ignore this | ||
| } | ||
| break; | ||
| case EAFNOSUPPORT: | ||
| { | ||
| cerr << "err EAFNOSUPPORT in send" << endl; | ||
| } | ||
| break; | ||
| default: | ||
| { | ||
| cerr << "err " << e << " " << strerror(e) << " in send" << endl; | ||
| } | ||
| } | ||
| return false; | ||
| } | ||
|
|
||
| if ( s == 0 ) | ||
| { | ||
| cerr << "no data sent in send" << endl; | ||
| return false; | ||
| } | ||
|
|
||
| if ( s != l ) | ||
| { | ||
| if (verbose) | ||
| { | ||
| cerr << "only " << s << " out of " << l << " bytes sent" << endl; | ||
| } | ||
| return false; | ||
| } | ||
|
|
||
| return true; | ||
| } | ||
|
|
||
|
|
||
| void | ||
| initNetwork() | ||
| { | ||
| #ifdef WIN32 | ||
| WORD wVersionRequested = MAKEWORD( 2, 2 ); | ||
| WSADATA wsaData; | ||
| int err; | ||
|
|
||
| err = WSAStartup( wVersionRequested, &wsaData ); | ||
| if ( err != 0 ) | ||
| { | ||
| // could not find a usable WinSock DLL | ||
| cerr << "Could not load winsock" << endl; | ||
| assert(0); // is this is failing, try a different version that 2.2, 1.0 or later will likely work | ||
| exit(1); | ||
| } | ||
|
|
||
| /* Confirm that the WinSock DLL supports 2.2.*/ | ||
| /* Note that if the DLL supports versions greater */ | ||
| /* than 2.2 in addition to 2.2, it will still return */ | ||
| /* 2.2 in wVersion since that is the version we */ | ||
| /* requested. */ | ||
|
|
||
| if ( LOBYTE( wsaData.wVersion ) != 2 || | ||
| HIBYTE( wsaData.wVersion ) != 2 ) | ||
| { | ||
| /* Tell the user that we could not find a usable */ | ||
| /* WinSock DLL. */ | ||
| WSACleanup( ); | ||
| cerr << "Bad winsock verion" << endl; | ||
| assert(0); // is this is failing, try a different version that 2.2, 1.0 or later will likely work | ||
| exit(1); | ||
| } | ||
| #endif | ||
| } | ||
|
|
||
|
|
||
| /* ==================================================================== | ||
| * The Vovida Software License, Version 1.0 | ||
| * | ||
| * Copyright (c) 2000 Vovida Networks, 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: | ||
| * | ||
| * 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 names "VOCAL", "Vovida Open Communication Application Library", | ||
| * and "Vovida Open Communication Application Library (VOCAL)" must | ||
| * not be used to endorse or promote products derived from this | ||
| * software without prior written permission. For written | ||
| * permission, please contact vocal@vovida.org. | ||
| * | ||
| * 4. Products derived from this software may not be called "VOCAL", nor | ||
| * may "VOCAL" appear in their name, without prior written | ||
| * permission of Vovida Networks, Inc. | ||
| * | ||
| * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED | ||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||
| * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND | ||
| * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA | ||
| * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES | ||
| * IN EXCESS OF $1,000, NOR FOR ANY 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 software consists of voluntary contributions made by Vovida | ||
| * Networks, Inc. and many individuals on behalf of Vovida Networks, | ||
| * Inc. For more information on Vovida Networks, Inc., please see | ||
| * <http://www.vovida.org/>. | ||
| * | ||
| */ | ||
|
|
||
| // Local Variables: | ||
| // mode:c++ | ||
| // c-file-style:"ellemtel" | ||
| // c-file-offsets:((case-label . +)) | ||
| // indent-tabs-mode:nil | ||
| // End: |
| @@ -0,0 +1,156 @@ | ||
| #ifndef udp_h | ||
| #define udp_h | ||
|
|
||
|
|
||
| #ifdef __MACH__ | ||
| typedef int socklen_t; | ||
| #endif | ||
|
|
||
| #include <errno.h> | ||
|
|
||
| #ifdef WIN32 | ||
|
|
||
| #include <winsock2.h> | ||
| #include <io.h> | ||
|
|
||
| typedef int socklen_t; | ||
| typedef SOCKET Socket; | ||
|
|
||
| #define EWOULDBLOCK WSAEWOULDBLOCK | ||
| #define EINPROGRESS WSAEINPROGRESS | ||
| #define EALREADY WSAEALREADY | ||
| #define ENOTSOCK WSAENOTSOCK | ||
| #define EDESTADDRREQ WSAEDESTADDRREQ | ||
| #define EMSGSIZE WSAEMSGSIZE | ||
| #define EPROTOTYPE WSAEPROTOTYPE | ||
| #define ENOPROTOOPT WSAENOPROTOOPT | ||
| #define EPROTONOSUPPORT WSAEPROTONOSUPPORT | ||
| #define ESOCKTNOSUPPORT WSAESOCKTNOSUPPORT | ||
| #define EOPNOTSUPP WSAEOPNOTSUPP | ||
| #define EPFNOSUPPORT WSAEPFNOSUPPORT | ||
| #define EAFNOSUPPORT WSAEAFNOSUPPORT | ||
| #define EADDRINUSE WSAEADDRINUSE | ||
| #define EADDRNOTAVAIL WSAEADDRNOTAVAIL | ||
| #define ENETDOWN WSAENETDOWN | ||
| #define ENETUNREACH WSAENETUNREACH | ||
| #define ENETRESET WSAENETRESET | ||
| #define ECONNABORTED WSAECONNABORTED | ||
| #define ECONNRESET WSAECONNRESET | ||
| #define ENOBUFS WSAENOBUFS | ||
| #define EISCONN WSAEISCONN | ||
| #define ENOTCONN WSAENOTCONN | ||
| #define ESHUTDOWN WSAESHUTDOWN | ||
| #define ETOOMANYREFS WSAETOOMANYREFS | ||
| #define ETIMEDOUT WSAETIMEDOUT | ||
| #define ECONNREFUSED WSAECONNREFUSED | ||
| #define ELOOP WSAELOOP | ||
| #define EHOSTDOWN WSAEHOSTDOWN | ||
| #define EHOSTUNREACH WSAEHOSTUNREACH | ||
| #define EPROCLIM WSAEPROCLIM | ||
| #define EUSERS WSAEUSERS | ||
| #define EDQUOT WSAEDQUOT | ||
| #define ESTALE WSAESTALE | ||
| #define EREMOTE WSAEREMOTE | ||
|
|
||
| typedef LONGLONG Int64; | ||
| inline int getErrno() { return WSAGetLastError(); } | ||
|
|
||
| #else | ||
|
|
||
| typedef int Socket; | ||
| static const Socket INVALID_SOCKET = -1; | ||
| static const int SOCKET_ERROR = -1; | ||
|
|
||
| inline int closesocket( Socket fd ) { return close(fd); }; | ||
|
|
||
| inline int getErrno() { return errno; } | ||
|
|
||
| #define WSANOTINITIALISED EPROTONOSUPPORT | ||
|
|
||
| #endif | ||
|
|
||
| /// Open a UDP socket to receive on the given port - if port is 0, pick a a | ||
| /// port, if interfaceIp!=0 then use ONLY the interface specified instead of | ||
| /// all of them | ||
| Socket | ||
| openPort( unsigned short port, unsigned int interfaceIp, | ||
| bool verbose); | ||
|
|
||
|
|
||
| /// recive a UDP message | ||
| bool | ||
| getMessage( Socket fd, char* buf, int* len, | ||
| unsigned int* srcIp, unsigned short* srcPort, | ||
| bool verbose); | ||
|
|
||
|
|
||
| /// send a UDP message | ||
| bool | ||
| sendMessage( Socket fd, char* msg, int len, | ||
| unsigned int dstIp, unsigned short dstPort, | ||
| bool verbose); | ||
|
|
||
|
|
||
| /// set up network - does nothing in unix but needed for windows | ||
| void | ||
| initNetwork(); | ||
|
|
||
|
|
||
| /* ==================================================================== | ||
| * The Vovida Software License, Version 1.0 | ||
| * | ||
| * Copyright (c) 2000 Vovida Networks, 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: | ||
| * | ||
| * 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 names "VOCAL", "Vovida Open Communication Application Library", | ||
| * and "Vovida Open Communication Application Library (VOCAL)" must | ||
| * not be used to endorse or promote products derived from this | ||
| * software without prior written permission. For written | ||
| * permission, please contact vocal@vovida.org. | ||
| * | ||
| * 4. Products derived from this software may not be called "VOCAL", nor | ||
| * may "VOCAL" appear in their name, without prior written | ||
| * permission of Vovida Networks, Inc. | ||
| * | ||
| * THIS SOFTWARE IS PROVIDED "AS IS" AND ANY EXPRESSED OR IMPLIED | ||
| * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES | ||
| * OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE, TITLE AND | ||
| * NON-INFRINGEMENT ARE DISCLAIMED. IN NO EVENT SHALL VOVIDA | ||
| * NETWORKS, INC. OR ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT DAMAGES | ||
| * IN EXCESS OF $1,000, NOR FOR ANY 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 software consists of voluntary contributions made by Vovida | ||
| * Networks, Inc. and many individuals on behalf of Vovida Networks, | ||
| * Inc. For more information on Vovida Networks, Inc., please see | ||
| * <http://www.vovida.org/>. | ||
| * | ||
| */ | ||
|
|
||
| // Local Variables: | ||
| // mode:c++ | ||
| // c-file-style:"ellemtel" | ||
| // c-file-offsets:((case-label . +)) | ||
| // indent-tabs-mode:nil | ||
| // End: | ||
|
|
||
| #endif |