summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNicolas Noble <nnoble@blizzard.com>2013-07-16 16:21:37 -0700
committerNicolas Noble <nnoble@blizzard.com>2013-07-16 16:21:37 -0700
commit71b4710c4834d747e44451bd7806c5ac4effbcc5 (patch)
tree6c9bbba961181c0c1716c41ee016190df25ae53c
parentf8dbc120c055fb61fa79f901cc2974d049d04f4f (diff)
Adding StdIO classes.
-rw-r--r--Makefile2
-rw-r--r--includes/StdIO.h40
-rw-r--r--src/StdIO.cc72
3 files changed, 114 insertions, 0 deletions
diff --git a/Makefile b/Makefile
index cbbaeed..77eda31 100644
--- a/Makefile
+++ b/Makefile
@@ -51,6 +51,8 @@ Buffer.cc \
BStream.cc \
ZHandle.cc \
\
+StdIO.cc \
+\
Task.cc \
TaskMan.cc \
\
diff --git a/includes/StdIO.h b/includes/StdIO.h
new file mode 100644
index 0000000..9b7e362
--- /dev/null
+++ b/includes/StdIO.h
@@ -0,0 +1,40 @@
+#pragma once
+
+#include <Handle.h>
+#include <Selectable.h>
+
+namespace Balau {
+
+// these classes might very well need to have their own
+// special version for win32; at least from a Handle.
+class StdIN : public Selectable {
+ public:
+ StdIN();
+ virtual const char * getName();
+ virtual void close() throw (GeneralException);
+ private:
+ virtual ssize_t recv(int sockfd, void *buf, size_t len, int flags);
+ virtual ssize_t send(int sockfd, const void *buf, size_t len, int flags);
+};
+
+class StdOUT : public Selectable {
+ public:
+ StdOUT();
+ virtual const char * getName();
+ virtual void close() throw (GeneralException);
+ private:
+ virtual ssize_t recv(int sockfd, void *buf, size_t len, int flags);
+ virtual ssize_t send(int sockfd, const void *buf, size_t len, int flags);
+};
+
+class StdERR : public Selectable {
+ public:
+ StdERR();
+ virtual const char * getName();
+ virtual void close() throw (GeneralException);
+ private:
+ virtual ssize_t recv(int sockfd, void *buf, size_t len, int flags);
+ virtual ssize_t send(int sockfd, const void *buf, size_t len, int flags);
+};
+
+};
diff --git a/src/StdIO.cc b/src/StdIO.cc
new file mode 100644
index 0000000..ccdeac2
--- /dev/null
+++ b/src/StdIO.cc
@@ -0,0 +1,72 @@
+#include "StdIO.h"
+
+/** stdin **/
+Balau::StdIN::StdIN() {
+ setFD(0);
+}
+
+const char * Balau::StdIN::getName() {
+ return "stdin";
+}
+
+void Balau::StdIN::close() throw (GeneralException) {
+ ::close(0);
+ internalClose();
+}
+
+ssize_t Balau::StdIN::recv(int sockfd, void *buf, size_t len, int flags) {
+ IAssert(sockfd == 0, "StdIN::recv called, but not on stdin");
+
+ return ::read(0, buf, len);
+}
+
+ssize_t Balau::StdIN::send(int sockfd, const void *buf, size_t len, int flags) {
+ return 0;
+}
+
+/** stdout **/
+Balau::StdOUT::StdOUT() {
+ setFD(1);
+}
+
+const char * Balau::StdOUT::getName() {
+ return "stdout";
+}
+
+void Balau::StdOUT::close() throw (GeneralException) {
+ ::close(1);
+ internalClose();
+}
+
+ssize_t Balau::StdOUT::recv(int sockfd, void *buf, size_t len, int flags) {
+ return 0;
+}
+
+ssize_t Balau::StdOUT::send(int sockfd, const void *buf, size_t len, int flags) {
+ IAssert(sockfd == 1, "StdOUT::send called, but not on stdout");
+ return ::write(1, buf, len);
+}
+
+/** stderr **/
+Balau::StdERR::StdERR() {
+ setFD(2);
+}
+
+const char * Balau::StdERR::getName() {
+ return "stderr";
+}
+
+void Balau::StdERR::close() throw (GeneralException) {
+ ::close(2);
+ internalClose();
+}
+
+ssize_t Balau::StdERR::recv(int sockfd, void *buf, size_t len, int flags) {
+ return 0;
+}
+
+ssize_t Balau::StdERR::send(int sockfd, const void *buf, size_t len, int flags) {
+ IAssert(sockfd == 2, "StdERR::send called, but not on stderr");
+ return ::write(2, buf, len);
+}
+