aboutsummaryrefslogtreecommitdiff
path: root/lib/timidity/utils/net.c
diff options
context:
space:
mode:
Diffstat (limited to 'lib/timidity/utils/net.c')
-rw-r--r--lib/timidity/utils/net.c262
1 files changed, 262 insertions, 0 deletions
diff --git a/lib/timidity/utils/net.c b/lib/timidity/utils/net.c
new file mode 100644
index 0000000000..b8f24b81ea
--- /dev/null
+++ b/lib/timidity/utils/net.c
@@ -0,0 +1,262 @@
+/*
+ TiMidity++ -- MIDI to WAVE converter and player
+ Copyright (C) 1999-2002 Masanao Izumo <mo@goice.co.jp>
+ Copyright (C) 1995 Tuukka Toivonen <tt@cgs.fi>
+
+ This program is free software; you can redistribute it and/or modify
+ it under the terms of the GNU General Public License as published by
+ the Free Software Foundation; either version 2 of the License, or
+ (at your option) any later version.
+
+ This program is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ GNU General Public License for more details.
+
+ You should have received a copy of the GNU General Public License
+ along with this program; if not, write to the Free Software
+ Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+
+*/
+
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif /* HAVE_CONFIG_H */
+#include <stdio.h>
+#include <stdlib.h>
+#if !defined(WINSOCK)
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include <netinet/in.h>
+#include <netdb.h>
+#include <arpa/inet.h> /* for inet_ntoa */
+#ifndef NO_STRING_H
+#include <string.h>
+#else
+#include <strings.h>
+#endif
+#endif
+
+#include "timidity.h"
+#include "common.h"
+#include "net.h"
+
+#ifndef INADDR_NONE
+#define INADDR_NONE 0xffffffff
+#endif /* INADDR_NONE */
+
+#if !defined(WINSOCK)
+#ifndef INVALID_SOCKET
+#define INVALID_SOCKET -1
+#endif /* INVALID_SOCKET */
+#ifndef SOCKET_ERROR
+#define SOCKET_ERROR -1
+#endif /* SOCKET_ERROR */
+#endif
+
+SOCKET open_socket(char *host, unsigned short port)
+{
+ SOCKET fd;
+ struct sockaddr_in in;
+
+#if defined(WINSOCK)
+ static int first = 1;
+ if(first) {
+ WSADATA dmy;
+ WSAStartup(MAKEWORD(1,1), &dmy);
+ first = 0;
+ }
+#endif
+
+ memset(&in, 0, sizeof(in));
+ if((in.sin_addr.s_addr = inet_addr(host)) == INADDR_NONE)
+ {
+ struct hostent *hp;
+ if((hp = gethostbyname(host)) == NULL)
+ return (SOCKET)-1;
+ memcpy(&in.sin_addr, hp->h_addr, hp->h_length);
+ }
+ in.sin_port = htons(port);
+ in.sin_family = AF_INET;
+
+ if((fd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == INVALID_SOCKET)
+ return (SOCKET)-1;
+
+ if(connect(fd, (struct sockaddr *)&in, sizeof(in)) == SOCKET_ERROR)
+ {
+ closesocket(fd);
+ return (SOCKET)-1;
+ }
+
+ return fd;
+}
+
+#if !defined(__W32__) || defined(__CYGWIN32__)
+long socket_write(SOCKET fd, char *buff, long bufsiz)
+{
+ return write(fd, buff, bufsiz);
+}
+
+int socket_shutdown(SOCKET fd, int how)
+{
+ return shutdown(fd, how);
+}
+
+FILE *socket_fdopen(SOCKET fd, char *mode)
+{
+ return fdopen(fd, mode);
+}
+
+char *socket_fgets(char *buff, int n, FILE *fp)
+{
+ return fgets(buff, n, fp);
+}
+
+int socket_fgetc(FILE *fp)
+{
+ return getc(fp);
+}
+
+long socket_fread(void *buff, long bufsiz, FILE *fp)
+{
+ return (long)fread(buff, 1, bufsiz, fp);
+}
+
+long socket_fwrite(void *buff, long bufsiz, FILE *fp)
+{
+ return (long)fwrite(buff, 1, bufsiz, fp);
+}
+
+int socket_fclose(FILE *fp)
+{
+ return fclose(fp);
+}
+
+int socket_fflush(FILE *fp)
+{
+ return fflush(fp);
+}
+#else /* __W32__ */
+
+#include "url.h"
+
+/* Fake FILE * */
+
+typedef struct _w32_fp_socket_t
+{
+ SOCKET fd; /* Now, It has only fd */
+} w32_fp_socket;
+#define W32_FP2SOCKET(fp) (((w32_fp_socket *)(fp))->fd)
+
+static long socket_safe_recv(SOCKET fd, char *buff, long bufsiz)
+{
+ fd_set fds;
+ int maxfd, n;
+
+ FD_ZERO(&fds);
+ FD_SET(fd, &fds);
+ maxfd = fd + 1;
+
+ n = select(maxfd, &fds, NULL, NULL, NULL);
+ if(n <= 0)
+ return n;
+ return recv(fd, buff, bufsiz, 0);
+}
+
+long socket_write(SOCKET fd, char *buff, long bufsiz)
+{
+ return send(fd, buff, bufsiz, 0);
+}
+
+int socket_shutdown(SOCKET fd, int how)
+{
+ return shutdown(fd, how);
+}
+
+#pragma argsused
+FILE *socket_fdopen(SOCKET fd, char *mode)
+{
+ FILE *fp;
+
+ /* w32_fp_socket fake FILE.
+ * `mode' argument is ignored.
+ */
+ if((fp = (FILE *)safe_malloc(sizeof(w32_fp_socket))) == NULL)
+ return NULL;
+ memset(fp, 0, sizeof(w32_fp_socket));
+ W32_FP2SOCKET(fp) = fd;
+ return fp;
+}
+
+static int socket_getc(SOCKET fd)
+{
+ int n;
+ unsigned char c;
+
+ n = socket_safe_recv(fd, (char *)&c, 1);
+ if(n <= 0)
+ return EOF;
+ return (int)c;
+}
+
+char *socket_fgets(char *buff, int n, FILE *fp)
+{
+ SOCKET fd = W32_FP2SOCKET(fp);
+ int len;
+
+ n--; /* for '\0' */
+ if(n == 0)
+ *buff = '\0';
+ if(n <= 0)
+ return buff;
+
+ len = 0;
+ while(len < n)
+ {
+ int c;
+ c = socket_getc(fd);
+ if(c == -1)
+ break;
+ buff[len++] = c;
+ if(c == url_newline_code)
+ break;
+ }
+ if(len == 0)
+ return NULL;
+ buff[len] = '\0';
+ return buff;
+}
+
+int socket_fgetc(FILE *fp)
+{
+ SOCKET fd = W32_FP2SOCKET(fp);
+ return socket_getc(fd);
+}
+
+long socket_fread(void *buff, long bufsiz, FILE *fp)
+{
+ SOCKET fd = W32_FP2SOCKET(fp);
+ return socket_safe_recv(fd, buff, bufsiz);
+}
+
+long socket_fwrite(void *buff, long bufsiz, FILE *fp)
+{
+ SOCKET fd = W32_FP2SOCKET(fp);
+ return socket_write(fd, buff, bufsiz);
+}
+
+int socket_fclose(FILE *fp)
+{
+ SOCKET fd = W32_FP2SOCKET(fp);
+ int ret;
+ ret = closesocket(fd);
+ free(fp);
+ return ret;
+}
+
+int socket_fflush(FILE *fp)
+{
+ return 0;
+}
+#endif