00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <libplumbing/config.h>
00019 #include <cstring>
00020 #include <libexplain/write.h>
00021
00022 #include <libplumbing/endpoint/chargen.h>
00023
00024
00025 plumbing::endpoint_chargen::~endpoint_chargen()
00026 {
00027 }
00028
00029
00030 plumbing::endpoint_chargen::endpoint_chargen(int a_fd) :
00031 endpoint(a_fd),
00032 sequence(0),
00033 data_size(0),
00034 data_position(0)
00035 {
00036 }
00037
00038
00039 plumbing::endpoint::pointer
00040 plumbing::endpoint_chargen::create(int a_fd)
00041 {
00042 return pointer(new endpoint_chargen(a_fd));
00043 }
00044
00045
00046 void
00047 plumbing::endpoint_chargen::process_read()
00048 {
00049
00050 char buffer[1024];
00051 ssize_t n = ::read(fd, buffer, sizeof(buffer));
00052 if (n == 0)
00053 kill_me_now();
00054 }
00055
00056
00057 int
00058 plumbing::endpoint_chargen::get_write_file_descriptor()
00059 {
00060 return fd;
00061 }
00062
00063
00064 void
00065 plumbing::endpoint_chargen::process_write()
00066 {
00067 if (data_position >= data_size)
00068 {
00069 for (int j = 0; j < 72; ++j)
00070 {
00071 data[j] = ' ' + (sequence + j) % 95;
00072 }
00073 data[72] = '\r';
00074 data[73] = '\n';
00075 ++sequence;
00076 data_size = 74;
00077 data_position = 0;
00078 }
00079 size_t nbytes = data_size - data_position;
00080 void *ptr = data + data_position;
00081 ssize_t n = ::write(fd, ptr, nbytes);
00082 if (n < 0)
00083 {
00084 fatal_error("%s", explain_write(fd, ptr, nbytes));
00085 kill_me_now();
00086 return;
00087 }
00088 if (n == 0)
00089 {
00090 kill_me_now();
00091 return;
00092 }
00093 data_position += n;
00094 }
00095
00096
00097