forked from ElementsProject/lightning
-
Notifications
You must be signed in to change notification settings - Fork 0
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
We need the following additional modules for the daemon: io, time, timer, pipecmd Signed-off-by: Rusty Russell <[email protected]>
- Loading branch information
1 parent
906a5e4
commit 888389e
Showing
105 changed files
with
18,347 additions
and
44 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1,3 +1,3 @@ | ||
CCAN imported from http://ccodearchive.net. | ||
|
||
CCAN version: init-2084-gb87f63c | ||
CCAN version: init-2136-g64e9e71 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1 @@ | ||
../../licenses/LGPL-2.1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,88 @@ | ||
Simple: | ||
step1(conn): read(conn), then step2 | ||
step2(conn): write(conn), then close | ||
|
||
Pass-through: | ||
step1(conn): read(conn), then step2 | ||
step2(conn): write(otherconn), then step1 | ||
|
||
Pass-through-and-connect: | ||
step1(conn): read(conn), then step2 | ||
step2(conn): connect(otherconn), then step3 | ||
step3(conn): write(otherconn), then step1 | ||
|
||
Chatroom: | ||
step1(conn): read(conn), then step2 | ||
step2(conn): for c in allcons: write(c). goto step1 | ||
|
||
Simple: | ||
|
||
void event(struct io_event *done) | ||
{ | ||
char *buf = done->priv; | ||
struct io_event *e; | ||
|
||
e = queue_read(done, done->conn, buf, 100); | ||
e = queue_write(e, done->conn, buf, 100); | ||
queue_close(e, done->conn); | ||
} | ||
|
||
Pass-through: | ||
struct passthru { | ||
char buf[100]; | ||
struct conn *rconn, *wconn; | ||
}; | ||
|
||
void event(struct io_event *done) | ||
{ | ||
struct passthru *p = done->priv; | ||
struct io_event *e; | ||
|
||
e = queue_read(done, p->rconn, p->buf, 100); | ||
e = queue_write(e, p->wconn, buf, 100); | ||
queue_event(e, event); | ||
} | ||
|
||
Chatroom: | ||
struct list_head clients; | ||
|
||
struct buffer { | ||
char buf[100]; | ||
unsigned int ref; | ||
}; | ||
|
||
struct client { | ||
struct list_node list; | ||
struct connection *conn; | ||
struct buffer *rbuf, *wbuf; | ||
}; | ||
|
||
void broadcast(struct io_event *done) | ||
{ | ||
struct client *i, *c = done->conn->priv; | ||
struct io_event *e; | ||
|
||
list_for_each(&clients, i, list) { | ||
e = queue_write(done, i->conn, c->buf->buf, 100); | ||
e->priv = c->buf; | ||
c->buf->ref++; | ||
queue_event(e, drop_ref); | ||
} | ||
|
||
|
||
|
||
void event(struct io_event *done) | ||
{ | ||
struct client *c = done->conn->priv; | ||
struct io_event *e; | ||
|
||
assert(c->conn == done->conn); | ||
c->buf = malloc(sizeof(*c->buf)); | ||
c->buf->ref = 0; | ||
e = queue_read(done, c->conn, c->buf->buf, 100); | ||
e = queue_event(e, broadcast); | ||
} | ||
|
||
|
||
step1(conn): read(conn), then step2 | ||
step2(conn): for c in allcons: write(c). goto step1 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,146 @@ | ||
#include "config.h" | ||
#include <stdio.h> | ||
#include <string.h> | ||
|
||
/** | ||
* io - simple library for asynchronous io handling. | ||
* | ||
* io provides a mechanism to write I/O servers with multiple | ||
* connections. Each callback indicates what I/O they plan next | ||
* (eg. read, write). It is also possible to write custom I/O | ||
* plans. | ||
* | ||
* Example: | ||
* // Given "tr A-Z a-z" outputs tr a-z a-z | ||
* #include <ccan/io/io.h> | ||
* #include <ccan/err/err.h> | ||
* #include <assert.h> | ||
* #include <stdlib.h> | ||
* #include <signal.h> | ||
* #include <sys/types.h> | ||
* #include <sys/wait.h> | ||
* #include <string.h> | ||
* | ||
* struct buffer { | ||
* bool finished; | ||
* size_t start, end, rlen, wlen; | ||
* char buf[4096]; | ||
* }; | ||
* | ||
* static void finish(struct io_conn *c, struct buffer *b) | ||
* { | ||
* // Mark us finished. | ||
* b->finished = true; | ||
* // Wake writer just in case it's asleep. | ||
* io_wake(b); | ||
* } | ||
* | ||
* static struct io_plan *read_in(struct io_conn *c, struct buffer *b) | ||
* { | ||
* // Add what we just read. | ||
* b->end += b->rlen; | ||
* assert(b->end <= sizeof(b->buf)); | ||
* | ||
* // If we just read something, wake writer. | ||
* if (b->rlen != 0) | ||
* io_wake(b); | ||
* | ||
* // If buffer is empty, return to start. | ||
* if (b->start == b->end) | ||
* b->start = b->end = 0; | ||
* | ||
* // No room? Wait for writer | ||
* if (b->end == sizeof(b->buf)) | ||
* return io_wait(c, b, read_in, b); | ||
* | ||
* return io_read_partial(c, b->buf + b->end, sizeof(b->buf) - b->end, | ||
* &b->rlen, read_in, b); | ||
* } | ||
* | ||
* static struct io_plan *write_out(struct io_conn *c, struct buffer *b) | ||
* { | ||
* // Remove what we just wrote. | ||
* b->start += b->wlen; | ||
* assert(b->start <= sizeof(b->buf)); | ||
* | ||
* // If we wrote something, wake writer. | ||
* if (b->wlen != 0) | ||
* io_wake(b); | ||
* | ||
* // Nothing to write? Wait for reader. | ||
* if (b->end == b->start) { | ||
* if (b->finished) | ||
* return io_close(c); | ||
* return io_wait(c, b, write_out, b); | ||
* } | ||
* | ||
* return io_write_partial(c, b->buf + b->start, b->end - b->start, | ||
* &b->wlen, write_out, b); | ||
* } | ||
* | ||
* // Feed a program our stdin, gather its stdout, print that at end. | ||
* int main(int argc, char *argv[]) | ||
* { | ||
* int tochild[2], fromchild[2]; | ||
* struct buffer to, from; | ||
* int status; | ||
* struct io_conn *reader; | ||
* | ||
* if (argc == 1) | ||
* errx(1, "Usage: runner <cmdline>..."); | ||
* | ||
* if (pipe(tochild) != 0 || pipe(fromchild) != 0) | ||
* err(1, "Creating pipes"); | ||
* | ||
* if (!fork()) { | ||
* // Child runs command. | ||
* close(tochild[1]); | ||
* close(fromchild[0]); | ||
* | ||
* dup2(tochild[0], STDIN_FILENO); | ||
* dup2(fromchild[1], STDOUT_FILENO); | ||
* execvp(argv[1], argv + 1); | ||
* exit(127); | ||
* } | ||
* | ||
* close(tochild[0]); | ||
* close(fromchild[1]); | ||
* signal(SIGPIPE, SIG_IGN); | ||
* | ||
* // Read from stdin, write to child. | ||
* memset(&to, 0, sizeof(to)); | ||
* reader = io_new_conn(NULL, STDIN_FILENO, read_in, &to); | ||
* io_set_finish(reader, finish, &to); | ||
* io_new_conn(NULL, tochild[1], write_out, &to); | ||
* | ||
* // Read from child, write to stdout. | ||
* reader = io_new_conn(NULL, fromchild[0], read_in, &from); | ||
* io_set_finish(reader, finish, &from); | ||
* io_new_conn(NULL, STDOUT_FILENO, write_out, &from); | ||
* | ||
* io_loop(NULL, NULL); | ||
* wait(&status); | ||
* | ||
* return WIFEXITED(status) ? WEXITSTATUS(status) : 2; | ||
* } | ||
* | ||
* License: LGPL (v2.1 or any later version) | ||
* Author: Rusty Russell <[email protected]> | ||
*/ | ||
int main(int argc, char *argv[]) | ||
{ | ||
if (argc != 2) | ||
return 1; | ||
|
||
if (strcmp(argv[1], "depends") == 0) { | ||
printf("ccan/container_of\n"); | ||
printf("ccan/list\n"); | ||
printf("ccan/tal\n"); | ||
printf("ccan/time\n"); | ||
printf("ccan/timer\n"); | ||
printf("ccan/typesafe_cb\n"); | ||
return 0; | ||
} | ||
|
||
return 1; | ||
} |
Oops, something went wrong.