tcploader addded
[svpe-wii.git] / tcploader / pc / main.c
blobf10e8131697c78b18f3445973939bfd25553fdb7
1 #include <stdio.h>
2 #include <stdlib.h>
3 #include <string.h>
5 #ifdef __WIN32__
6 #include <windows.h>
7 #include <winsock.h>
8 #define close(s) closesocket(s)
9 #else
10 #include <sys/types.h>
11 #include <sys/socket.h>
12 #include <netinet/in.h>
13 #include <arpa/inet.h>
14 #include <unistd.h>
15 #include <netdb.h>
16 #endif
18 #define BUFFER_SIZE 1 << 10
19 #define PORT 8080
21 int write_data(int s, char *buf, int n)
23 int bcount;
24 int br;
25 bcount = 0;
26 br = 0;
27 while(bcount < n) {
28 if ((br = send(s,buf,n-bcount,0)) > 0) {
29 bcount += br;
30 buf += br;
32 else if (br < 0)
33 return br;
35 return (bcount);
38 int main(int argc, char *argv[])
40 FILE *fd;
41 char *buffer;
42 int i;
43 int size, size2;
44 int sock;
45 struct sockaddr_in addr;
46 #ifdef __WIN32__
47 WSADATA wsa;
48 #endif
50 if(argc != 3)
52 printf("usage: sendelf [wii ip] [file.elf]\n");
53 return -1;
56 #ifdef __WIN32__
57 if (WSAStartup(MAKEWORD(1, 1), &wsa))
59 printf("WSAStartup() failed, %lu\n", (unsigned long)GetLastError());
60 return EXIT_FAILURE;
62 #endif
64 fd = fopen(argv[2], "rb");
65 if(fd == NULL)
67 perror("fopen failed");
68 return -1;
71 #ifdef __WIN32__
72 addr.sin_addr.S_un.S_addr = inet_addr(argv[1]);
73 if(addr.sin_addr.S_un.S_addr == INADDR_NONE)
74 #else
75 if(inet_aton(argv[1], &addr.sin_addr) == 0)
76 #endif
78 perror("inet_aton failed");
79 fclose(fd);
80 return -1;
83 sock = socket(PF_INET, SOCK_STREAM, 0);
84 if(sock < 0)
86 perror("socket() failed");
87 fclose(fd);
88 return -1;
91 addr.sin_port = htons(PORT);
92 addr.sin_family = AF_INET;
94 printf("connecting to %s:%d\n", inet_ntoa(addr.sin_addr), PORT);
95 if(connect(sock, (struct sockaddr *)&addr, sizeof(addr)) == -1)
97 perror("connect() failed");
98 fclose(fd);
99 close(sock);
100 return -1;
103 fseek(fd, 0, SEEK_END);
104 size = ftell(fd);
105 fseek(fd, 0, SEEK_SET);
107 printf("size: %08X\n", size);
108 buffer = malloc(BUFFER_SIZE);
109 size2 = ((size & 0xFF000000) >> 24) |
110 ((size & 0x00FF0000) >> 8) |
111 ((size & 0x0000FF00) << 8) |
112 ((size & 0x000000FF) << 24);
113 printf("size2: %08X\n", size2);
114 memcpy(buffer, &size2, sizeof(size));
115 if((i = write_data(sock, buffer, sizeof(size))) < 0)
117 perror("send() failed");
118 fclose(fd);
119 close(sock);
120 return -1;
123 i = 0;
124 while(i < size)
126 memset(buffer, 0, BUFFER_SIZE);
127 printf("reading chunk #%d\n", i);
128 if(fread(buffer, size > BUFFER_SIZE ? BUFFER_SIZE : size, 1, fd) < 1)
130 perror("fread returned < 1");
131 /* fclose(fd);
132 close(sock);
133 return -1;*/
135 printf("%d/%d\n", i, size);
136 if(write_data(sock, buffer, BUFFER_SIZE) < 0)
138 perror("send() failed");
139 fclose(fd);
140 close(sock);
141 return -1;
143 i += BUFFER_SIZE;
146 printf("file sent successfully(?)\n");
147 fclose(fd);
148 close(sock);
150 return 0;