finally put this under version control
This commit is contained in:
commit
55f357eb88
9 changed files with 1583 additions and 0 deletions
119
mvwtimg.c
Normal file
119
mvwtimg.c
Normal file
|
@ -0,0 +1,119 @@
|
|||
#include <stdio.h>
|
||||
#include <string.h>
|
||||
#include <skalibs/buffer.h>
|
||||
#include <skalibs/skamisc.h>
|
||||
#include <skalibs/stralloc.h>
|
||||
#include <skalibs/strerr.h>
|
||||
#include <skalibs/djbunix.h>
|
||||
#include <skalibs/exec.h>
|
||||
|
||||
#define USAGE "mvwtimg host path filename"
|
||||
#define HTTPOK "HTTP/1.1 200 OK"
|
||||
|
||||
int
|
||||
download(int infd, char *path)
|
||||
{
|
||||
int outfd;
|
||||
|
||||
outfd = open_trunc(path);
|
||||
if (outfd < 0)
|
||||
return -1;
|
||||
|
||||
if (fd_cat(infd, outfd) < 0) {
|
||||
fd_close(outfd);
|
||||
return -1;
|
||||
}
|
||||
|
||||
fd_sync(outfd);
|
||||
fd_close(outfd);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
fdgetln(int fd, stralloc *sa, int sep)
|
||||
{
|
||||
char s[1];
|
||||
ssize_t r;
|
||||
|
||||
sa->len = 0;
|
||||
for (;;) {
|
||||
r = fd_read(fd, s, 1);
|
||||
if (r < 0)
|
||||
return -1;
|
||||
if (s[0] == EOF)
|
||||
break;
|
||||
stralloc_append(sa, s[0]);
|
||||
if (s[0] == sep)
|
||||
break;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
http_recv_header(int fd)
|
||||
{
|
||||
stralloc sa = STRALLOC_ZERO;
|
||||
|
||||
if (fdgetln(fd, &sa, '\n') < 0)
|
||||
return -1;
|
||||
if (sa.len < sizeof(HTTPOK) || !strncmp(sa.s, HTTPOK, sizeof(HTTPOK)))
|
||||
return -1;
|
||||
sa.len = 0;
|
||||
|
||||
for (;;) {
|
||||
if (fdgetln(fd, &sa, '\n') < 0)
|
||||
return -1;
|
||||
if (!strncmp(sa.s, "\r\n", 2)) {
|
||||
break;
|
||||
}
|
||||
sa.len = 0;
|
||||
}
|
||||
|
||||
stralloc_free(&sa);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
http_send(int fd, char *path, char *host)
|
||||
{
|
||||
char buf[BUFFER_OUTSIZE];
|
||||
|
||||
buffer b = BUFFER_INIT(&buffer_write, fd, buf, BUFFER_OUTSIZE);
|
||||
|
||||
buffer_putsnoflush(&b, "GET ");
|
||||
buffer_putsnoflush(&b, path);
|
||||
buffer_putsnoflush(&b, " HTTP/1.0\r\n");
|
||||
buffer_putsnoflush(&b, "Host: ");
|
||||
buffer_putsnoflush(&b, host);
|
||||
buffer_putsnoflush(&b, "\r\nConnection: close\r\n");
|
||||
buffer_putsnoflush(&b, "User-Agent: mvwt\r\n\r\n");
|
||||
buffer_flush(&b);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int
|
||||
main(int argc, char *argv[])
|
||||
{
|
||||
PROG = "mvwtimg";
|
||||
|
||||
if (argc != 4)
|
||||
strerr_dieusage(100, USAGE);
|
||||
|
||||
if (http_send(7, argv[2], argv[1]) < 0)
|
||||
strerr_diefu(111, "send http request");
|
||||
if (http_recv_header(6) < 0)
|
||||
strerr_diefu(111, "recieve image header");
|
||||
if (download(6, argv[3]) < 0)
|
||||
strerr_diefu(111, "downloading and saving image");
|
||||
fd_shutdown(7, 1);
|
||||
fd_close(7);
|
||||
fd_shutdown(6, 0);
|
||||
fd_close(6);
|
||||
|
||||
char const *hsetroot_argv[] = { "hsetroot", "-cover", argv[3], 0 };
|
||||
xexec(hsetroot_argv);
|
||||
return 0;
|
||||
}
|
Loading…
Add table
Add a link
Reference in a new issue