10 #include <netinet/in.h>
11 #include <arpa/inet.h>
14 #include <sys/sendfile.h>
20 static inline int error(const char *n)
26 static int usage(char *name)
28 fprintf(stderr, "%s: file target port\n", name);
32 static int do_sf(int filefd, int sockfd)
37 if (fstat(filefd, &sb) < 0)
38 return error("stat input file");
42 if (lseek(filefd, 0, SEEK_SET) < 0)
43 return error("lseek");
46 ret = sendfile(sockfd, filefd, NULL, sb.st_size);
48 return error("sendfile");
58 static int parse_options(int argc, char *argv[])
62 while ((c = getopt(argc, argv, "l")) != -1) {
76 int main(int argc, char *argv[])
78 struct sockaddr_in addr;
80 int fd, filefd, index;
83 return usage(argv[0]);
85 index = parse_options(argc, argv);
86 if (index == -1 || index + 1 > argc)
87 return usage(argv[0]);
89 filefd = open(argv[index], O_RDONLY);
91 return error("open input file");
93 port = atoi(argv[index + 2]);
95 memset(&addr, 0, sizeof(addr));
96 addr.sin_family = AF_INET;
97 addr.sin_port = htons(port);
99 if (inet_aton(argv[index + 1], &addr.sin_addr) != 1) {
100 struct hostent *hent = gethostbyname(argv[index + 1]);
103 return error("gethostbyname");
105 memcpy(&addr.sin_addr, hent->h_addr, 4);
108 printf("Connecting to %s/%d\n", argv[index + 1], port);
110 fd = socket(AF_INET, SOCK_STREAM, 0);
112 return error("socket");
114 if (connect(fd, (struct sockaddr *) &addr, sizeof(addr)) < 0)
115 return error("connect");
118 if (do_sf(filefd, fd))