Commit bbd5d85d authored by Seblu's avatar Seblu

Utilisation de sll

parent 29e81753
......@@ -16,18 +16,22 @@
bin_PROGRAMS= slc
slc_SOURCES= src/slc.hh \
src/slc.cc \
slc_SOURCES= src/slc.cc \
src/options.cc \
src/engine.cc \
src/screen.cc \
src/history.cc \
src/sll/connection.cc \
src/sll/error.cc
noinst_SOURCES= src/slc.hh \
src/options.hh \
src/engine.hh \
src/screen.hh \
src/screen.cc \
src/connection.hh \
src/connection.cc \
src/history.hh \
src/history.cc \
src/error.hh \
src/error.cc
src/sll/error.hh \
src/sll/connection.hh
CLEANFILES= *~ '\#*' .*.swp .*~
......
/*
This file is part of SLC.
Copyright (C) 2008 Sebastien LUTTRINGER <contact@seblu.net>
SLC is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
SLC is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SLC; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <netdb.h>
#include <errno.h>
#include <poll.h>
#include "slc.hh"
#include "options.hh"
#include "connection.hh"
#include "screen.hh"
#include "error.hh"
pthread_mutex_t mtx_socket = PTHREAD_MUTEX_INITIALIZER;
Connection::Connection() : socket_(0) {}
bool Connection::connected() const {
return socket_ > 0;
}
void Connection::start() {
if (connected())
return;
// make connection
connect_(O.server.c_str(), O.port);
// send login info
// send pass info
// Start reader thread
pthread_create(&g_thread_reader, 0, thread_reader, 0);
}
void Connection::stop() {
if (!connected())
return;
disconnect_();
}
void Connection::connect_(const char *addr, int port) {
struct sockaddr_in daddr;
struct hostent *h;
// Check no existing connexion
assert(socket_ == 0);
// retrieve remote host info
h = gethostbyname(addr);
if (h == 0) {
S << "Unable to resolve: " << addr << ": " << hstrerror(h_errno) << ".\n";
return;
}
// create socket
pthread_mutex_lock(&mtx_socket);
socket_ = socket(PF_INET, SOCK_STREAM, 0);
if (socket_ == -1) {
S << "Unable to create socket: " << strerror(errno) << ".\n";
socket_ = 0;
pthread_mutex_unlock(&mtx_socket);
return;
}
pthread_mutex_unlock(&mtx_socket);
daddr.sin_family = AF_INET;
daddr.sin_port = htons(port);
daddr.sin_addr = *((struct in_addr *) h->h_addr);
memset(daddr.sin_zero, '\0', sizeof daddr.sin_zero);
S << "Connecting to " << h->h_name << " (" << inet_ntoa(*(struct in_addr*)h->h_addr)
<< ") on port " << port << "...\n";
// connect
pthread_mutex_lock(&mtx_socket);
int con = connect(socket_, (struct sockaddr *) &daddr, sizeof daddr);
pthread_mutex_unlock(&mtx_socket);
if (con == -1) {
disconnect_();
S << "Unable to connect: " << strerror(errno) << ".\n";
return;
}
S << "Connected to " << h->h_name << " (" << inet_ntoa(*(struct in_addr*)h->h_addr)
<< ") on port " << port << ".\n";
}
void Connection::disconnect_() {
assert(socket_ > 0);
pthread_mutex_lock(&mtx_socket);
close(socket_);
socket_ = 0;
pthread_mutex_unlock(&mtx_socket);
}
void Connection::send(const string &data) {
send(data.c_str(), data.length());
}
void Connection::send(const char* buf, size_t len) {
assert(socket_ > 0);
pthread_mutex_lock(&mtx_socket);
write(socket_, buf, len);
pthread_mutex_unlock(&mtx_socket);
}
void Connection::sendln(const string &data) {
sendln(data.c_str(), data.length());
}
void Connection::sendln(const char* buf, size_t len) {
assert(socket_ > 0);
pthread_mutex_lock(&mtx_socket);
write(socket_, buf, len);
write(socket_, "\n", 1);
pthread_mutex_unlock(&mtx_socket);
}
string Connection::recvln() {
assert(socket > 0);
do {
// check EOL char
size_t offset = rbuf_.find('\n');
if (offset != string::npos) {
string s = rbuf_.substr(0, offset);
rbuf_.erase(0, offset + 1);
return s;
}
// wait incoming data
static struct pollfd spfd[1] = {{socket_, POLLIN|POLLPRI|POLLHUP|POLLERR, 0}};
poll(spfd, 1, -1);
// lock before read
pthread_mutex_lock(&mtx_socket);
// read data
static char local_buf[MAX_LINE_SIZE];
int ret = ::recv(socket_, local_buf, MAX_LINE_SIZE, MSG_DONTWAIT);
// unlock
pthread_mutex_unlock(&mtx_socket);
if (ret == -1) {
disconnect_();
*local_buf = 0;
}
else local_buf[ret] = 0;
// add read data in buffer
rbuf_ += local_buf;
} while (1);
assert(1);
}
......@@ -18,7 +18,6 @@
#include "slc.hh"
#include "history.hh"
#include "error.hh"
History::History() : max_size_(100) {}
......
......@@ -23,9 +23,8 @@
#include "slc.hh"
#include "screen.hh"
#include "options.hh"
#include "error.hh"
#include "history.hh"
#include "connection.hh"
#include "sll/connection.hh"
/*
*********************************************************************************
......@@ -529,11 +528,11 @@ void Screen::cmd_exec(const char *s) {
}
else if (!strcmp(s, "/logout")) {
S << s << "\n";
C.stop();
//C.stop();
}
else if (!strcmp(s, "/login")) {
S << s << "\n";
C.start();
//C.start();
}
else
S << s << ": Unkown command.\n";
......
......@@ -16,15 +16,16 @@
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#include <getopt.h>
#include "slc.hh"
#include "options.hh"
#include "screen.hh"
#include "history.hh"
#include "error.hh"
#include "connection.hh"
#include "sll/connection.hh"
#include "engine.hh"
#include <getopt.h>
Engine E;
Screen S;
Options O;
History H;
......@@ -52,20 +53,11 @@ int main(int argc, char *argv[])
// load cmd history
H.load(O.history_file);
// Create graphic env
S.init();
// Showing login screen. Retrieve user/pass.
S.login();
// Showing dialog screen
S.dialog();
// start connexion
C.start();
// Starting engine
E.on();
// Treat keyboards events
S.eventsloop();
// Stoping engine
E.off();
// Save history
H.save(O.history_file);
......
......@@ -19,41 +19,13 @@
#ifndef SLC_HH
# define SLC_HH
# define _REENTRANT
# include <cassert>
# include <ios>
# include <iostream>
# include <fstream>
# include <sstream>
# include <pthread.h>
# include <string.h>
typedef std::string string;
typedef std::stringstream sstream;
typedef std::ostream ostream;
typedef std::ifstream ifstream;
typedef std::ofstream ofstream;
enum {
ERR_OK = 0,
ERR_USAGE = 1,
ERR_BADPARAM = 2,
ERR_FILE = 3,
ERR_NET = 4,
ERR_PROTO = 5,
ERR_AUTH = 6,
ERR_SCREENSZ = 7,
ERR_NOMEM = 41,
ERR_UNKNOWN = 42
};
# include "sll/slm.hh"
# include "sll/error.hh"
// -----------------------------------------------------------------------------
// Gonstant
// -----------------------------------------------------------------------------
static const string VERSION = "1";
static const int MAX_LINE_SIZE = 512;
static const int MAX_CONF_LINE_SIZE = 2048;
static const string RCV_DATA = "<< ";
static const string SND_DATA = ">> ";
......@@ -66,11 +38,13 @@ class Options;
class Screen;
class History;
class Connection;
class Engine;
extern Options O;
extern Screen S;
extern History H;
extern Connection C;
extern Engine E;
extern pthread_t g_thread_reader;
......@@ -80,5 +54,6 @@ extern pthread_t g_thread_reader;
int main(int, char **);
void *thread_reader(void *);
void login();
#endif
This diff is collapsed.
/*
This file is part of SLS.
Copyright (C) 2008 Sebastien LUTTRINGER <contact@seblu.net>
SLS is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
SLS is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SLS; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef CONNECTION_HH
# define CONNECTION_HH
# include <pthread.h>
class Connection {
// class methods
public:
unsigned long int getconnid();
// public methods
public:
Connection(int fd = -1);
virtual ~Connection();
void connect(const char *addr, int port);
void listen(int port, int max);
void disconnect();
bool connected();
Connection *accept();
// send methods
inline void send(const string &data);
void send(const char* buf, size_t len);
inline void sendln(const string &data);
void sendln(const char* buf, size_t len);
// recv methods
string recvln();
// info methods
string getlocalip();
int getlocalport();
string getremoteip();
int getremoteport();
unsigned long int getid();
int getsocket();
// protected methods
protected:
void socket_();
void disconnect_();
inline void setallinfo_();
void setlocalip_();
void setlocalport_();
void setremoteip_();
void setremoteport_();
// Protected datas
protected:
int socket_fd_; // connection socket
// storage of info about connection
int local_port_;
int remote_port_;
string local_ip_;
string remote_ip_;
unsigned long int id_;
string rbuf_; // read buffer
string wbuf_; // write buffer
pthread_mutex_t c_mutex_; // connection mutex
pthread_mutex_t r_mutex_; // read mutex
pthread_mutex_t w_mutex_; // write mutex
};
# include "connection.hxx"
#endif
/*
This file is part of SLC.
This file is part of SLL.
Copyright (C) 2008 Sebastien LUTTRINGER <contact@seblu.net>
SLC is free software; you can redistribute it and/or modify
SLL is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
SLC is distributed in the hope that it will be useful,
SLL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SLC; if not, write to the Free Software
along with SLLo; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef CONNECTION_HH
# define CONNECTION_HH
class Connection {
public:
Connection();
bool connected() const;
void start();
void stop();
void send(const string &data);
void send(const char* buf, size_t len);
void sendln(const string &data);
void sendln(const char* buf, size_t len);
string recvln();
private:
void connect_(const char *addr, int port);
void disconnect_();
private:
int socket_;
string rbuf_;
};
#endif
/*******************************************************************************
** Public method
******************************************************************************/
/**
* Send @param data on socket
*/
void Connection::send(const string &data) {
send(data.c_str(), data.length());
}
/**
* Send @param data followed by '\n' on socket
*/
void Connection::sendln(const string &data) {
sendln(data.c_str(), data.length());
}
/*******************************************************************************
** Protected method
******************************************************************************/
/**
* Set all information about a connection
*/
void Connection::setallinfo_() {
setlocalip_();
setlocalport_();
setremoteip_();
setremoteport_();
}
/*
This file is part of SLC.
This file is part of SLL.
Copyright (C) 2008 Sebastien LUTTRINGER <contact@seblu.net>
SLC is free software; you can redistribute it and/or modify
SLL is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
SLC is distributed in the hope that it will be useful,
SLL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SLC; if not, write to the Free Software
along with SLL; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
......@@ -75,6 +75,23 @@ void Error::code(int v)
val_ = v;
}
/*!
** Concatenate @param s before error message
*/
void Error::prefix(const string &s) {
string buf = s + msg_.str();
msg_.str("");
msg_ << buf;
}
/*!
** Concatenate @param s to errror message
*/
void Error::suffix(const string &s) {
msg_ << s;
}
/*!
** Copy operator
*/
......@@ -124,3 +141,4 @@ Error &operator>>(Error &e, const string &s)
e.msg_ << buf;
return e;
}
/*
This file is part of SLC.
This file is part of SLL.
Copyright (C) 2008 Sebastien LUTTRINGER <contact@seblu.net>
SLC is free software; you can redistribute it and/or modify
SLL is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
SLC is distributed in the hope that it will be useful,
SLL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SLC; if not, write to the Free Software
along with SLL; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef ERROR_HH
# define ERROR_HH
# include <ios>
# include <iostream>
# include <sstream>
typedef std::string string;
typedef std::stringstream sstream;
typedef std::ostream ostream;
# include "slm.hh"
class Error
{
public:
Error(int i, string s = "");
Error(const Error &e);
void print() const;
string message() const;
void suffix(const string &);
void prefix(const string &);
int code() const;
void code(int);
Error &operator=(const Error &rhs);
friend ostream &operator<<(ostream &o, const Error &e);
friend Error &operator<<(Error &e, const string &s);
friend Error &operator>>(Error &e, const string &s);
friend Error &operator<<(Error &e, int val);
protected:
sstream msg_;
int val_;
......
/*
This file is part of SLL.
Copyright (C) 2008 Sebastien LUTTRINGER <contact@seblu.net>
SLL is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; version 2 of the License.
SLL is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with SLL; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
#ifndef SLM_HH
# define SLM_HH
# define _REENTRANT
# include <cassert>
# include <ios>
# include <iostream>
# include <fstream>
# include <sstream>
typedef std::string string;
typedef std::stringstream sstream;
typedef std::ostream ostream;
typedef std::ifstream ifstream;
typedef std::ofstream ofstream;
enum {
ERR_NO = 0,
ERR_USAGE = 1,
ERR_BADPARAM = 2,
ERR_FILE = 3,
ERR_NET = 4,
ERR_PROTO = 5,
ERR_AUTH = 6,
ERR_DB = 7,
ERR_SRV = 8,
ERR_THREAD = 9,
ERR_PARSE = 10,
ERR_SCREENSZ = 11,
ERR_NOMEM = 41,
ERR_UNKNOWN = 42
};
// -----------------------------------------------------------------------------
// Gonstant
// -----------------------------------------------------------------------------
static const string VERSION = (string) "testing.\nCompiled: " + __DATE__ + " " + __TIME__ + ".";
//static const string VERSION = "1.0";
static const int MAX_LINE_SIZE = 512;
#endif
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment