modules/script/scriptnet.c File Reference

#include <eggdrop/eggdrop.h>
#include "egg_script_internal.h"

Go to the source code of this file.

Data Structures

struct  script_net_info

Typedefs

typedef struct script_net_info script_net_info_t

Functions

static void script_net_info_add (script_net_info_t *info)
static void script_net_info_remove (script_net_info_t *info)
static int script_net_takeover (int idx)
static int script_net_listen (script_var_t *retval, int port)
static int script_net_open (const char *host, int port, int timeout)
static int script_net_close (int idx)
static int script_net_write (int idx, const char *text, int len)
static int script_net_linemode (int nargs, int idx, int onoff)
static int script_net_handler (int idx, const char *event, script_callback_t *handler)
static int script_net_info (script_var_t *retval, int idx, char *what)
static int script_net_throttle (int idx, int speedin, int speedout)
static int script_net_throttle_set (void *client_data, int idx, int speed)
static int on_connect (void *client_data, int idx, const char *peer_ip, int peer_port)
static int on_eof (void *client_data, int idx, int err, const char *errmsg)
static int on_newclient (void *client_data, int idx, int newidx, const char *peer_ip, int peer_port)
static int on_read (void *client_data, int idx, char *data, int len)
static int on_written (void *client_data, int idx, int len, int remaining)
static int on_delete (event_owner_t *owner, void *client_data)
void script_event_cleanup (egg_module_t *module)
static script_net_info_tscript_net_info_lookup (int idx)

Variables

static const char rcsid [] = "$Id: scriptnet.c,v 1.13 2008-10-17 15:57:43 sven Exp $"
static script_net_info_tscript_net_info_head = NULL
static sockbuf_handler_t sock_handler
event_owner_t socket_owner
script_command_t script_net_cmds []


Typedef Documentation


Function Documentation

static int on_connect ( void *  client_data,
int  idx,
const char *  peer_ip,
int  peer_port 
) [static]

Definition at line 282 of file scriptnet.c.

References script_callback_b::callback, and script_net_info::on_connect.

00283 {
00284   script_net_info_t *info = client_data;
00285 
00286   if (info->on_connect) info->on_connect->callback(info->on_connect, idx, peer_ip, peer_port);
00287   return(0);
00288 }

static int on_delete ( event_owner_t owner,
void *  client_data 
) [static]

Definition at line 329 of file scriptnet.c.

References script_callback_b::callback, script_net_info::idx, script_net_info::on_connect, script_net_info::on_delete, event_owner_b::on_delete, script_net_info::on_eof, script_net_info::on_newclient, script_net_info::on_read, script_net_info::on_written, script_callback_b::owner, and script_net_info_remove().

00330 {
00331   script_net_info_t *info = client_data;
00332 
00333   if (info->on_connect && info->on_connect->owner && info->on_connect->owner->on_delete) info->on_connect->owner->on_delete(info->on_connect->owner, info->on_connect);
00334   if (info->on_eof && info->on_eof->owner && info->on_eof->owner->on_delete) info->on_eof->owner->on_delete(info->on_eof->owner, info->on_eof);
00335   if (info->on_newclient && info->on_newclient->owner && info->on_newclient->owner->on_delete) info->on_newclient->owner->on_delete(info->on_newclient->owner, info->on_newclient);
00336   if (info->on_read && info->on_read->owner && info->on_read->owner->on_delete) info->on_read->owner->on_delete(info->on_read->owner, info->on_read);
00337   if (info->on_written && info->on_written->owner && info->on_written->owner->on_delete) info->on_written->owner->on_delete(info->on_written->owner, info->on_written);
00338 
00339   if (info->on_delete) {
00340     info->on_delete->callback(info->on_delete, info->idx);
00341     if (info->on_delete && info->on_delete->owner && info->on_delete->owner->on_delete) info->on_delete->owner->on_delete(info->on_delete->owner, info->on_delete);
00342   }
00343   script_net_info_remove(info);
00344   free(info);
00345   return(0);
00346 }

static int on_eof ( void *  client_data,
int  idx,
int  err,
const char *  errmsg 
) [static]

Definition at line 290 of file scriptnet.c.

References script_callback_b::callback, script_net_info::on_eof, and sockbuf_delete().

00291 {
00292   script_net_info_t *info = client_data;
00293 
00294   if (info->on_eof) info->on_eof->callback(info->on_eof, idx, err, errmsg);
00295   sockbuf_delete(idx);
00296   return(0);
00297 }

static int on_newclient ( void *  client_data,
int  idx,
int  newidx,
const char *  peer_ip,
int  peer_port 
) [static]

Definition at line 299 of file scriptnet.c.

References script_callback_b::callback, and script_net_info::on_newclient.

00300 {
00301   script_net_info_t *info = client_data;
00302 
00303   if (info->on_newclient) info->on_newclient->callback(info->on_newclient, idx, newidx, peer_ip, peer_port);
00304   return(0);
00305 }

static int on_read ( void *  client_data,
int  idx,
char *  data,
int  len 
) [static]

Definition at line 307 of file scriptnet.c.

References byte_array_b::bytes, script_callback_b::callback, byte_array_b::do_free, byte_array_b::len, and script_net_info::on_read.

00308 {
00309   script_net_info_t *info = client_data;
00310   byte_array_t bytes;
00311 
00312   if (info->on_read) {
00313     bytes.bytes = data;
00314     bytes.len = len;
00315     bytes.do_free = 0;
00316     info->on_read->callback(info->on_read, idx, &bytes, len);
00317   }
00318   return(0);
00319 }

static int on_written ( void *  client_data,
int  idx,
int  len,
int  remaining 
) [static]

Definition at line 321 of file scriptnet.c.

References script_callback_b::callback, and script_net_info::on_written.

00322 {
00323   script_net_info_t *info = client_data;
00324 
00325   if (info->on_written) info->on_written->callback(info->on_written, idx, len, remaining);
00326   return(0);
00327 }

void script_event_cleanup ( egg_module_t module  ) 

Definition at line 73 of file scriptnet.c.

References script_net_info::idx, event_owner_b::module, script_net_info::next, NULL, script_net_info::on_connect, script_net_info::on_delete, event_owner_b::on_delete, script_net_info::on_eof, script_net_info::on_newclient, script_net_info::on_read, script_net_info::on_written, script_callback_b::owner, and sockbuf_delete().

00073                                                 {
00074   script_net_info_t *i, *next;
00075 
00076   for (i = script_net_info_head; i; i = next) {
00077     next = i->next;
00078     if (i->on_connect && i->on_connect->owner && i->on_connect->owner->module == module) {
00079       if (i->on_connect->owner->on_delete) i->on_connect->owner->on_delete(i->on_connect->owner, i->on_connect);
00080       i->on_connect = NULL;
00081     }
00082     if (i->on_eof && i->on_eof->owner && i->on_eof->owner->module == module) {
00083       if (i->on_eof->owner->on_delete) i->on_eof->owner->on_delete(i->on_eof->owner, i->on_eof);
00084       i->on_eof = NULL;
00085     }
00086     if (i->on_newclient && i->on_newclient->owner && i->on_newclient->owner->module == module) {
00087       if (i->on_newclient->owner->on_delete) i->on_newclient->owner->on_delete(i->on_newclient->owner, i->on_newclient);
00088       i->on_newclient = NULL;
00089     }
00090     if (i->on_read && i->on_read->owner && i->on_read->owner->module == module) {
00091       if (i->on_read->owner->on_delete) i->on_read->owner->on_delete(i->on_read->owner, i->on_read);
00092       i->on_read = NULL;
00093     }
00094     if (i->on_written && i->on_written->owner && i->on_written->owner->module == module) {
00095       if (i->on_written->owner->on_delete) i->on_written->owner->on_delete(i->on_written->owner, i->on_written);
00096       i->on_written = NULL;
00097     }
00098     if (i->on_delete && i->on_delete->owner && i->on_delete->owner->module == module) {
00099       if (i->on_delete->owner->on_delete) i->on_delete->owner->on_delete(i->on_delete->owner, i->on_delete);
00100       i->on_delete = NULL;
00101     }
00102     if (!i->on_connect && !i->on_eof && !i->on_newclient && !i->on_read && !i->on_written && !i->on_delete) sockbuf_delete(i->idx);
00103   }
00104 }

static int script_net_close ( int  idx  )  [static]

Definition at line 169 of file scriptnet.c.

References sockbuf_delete().

00170 {
00171   return sockbuf_delete(idx);
00172 }

static int script_net_handler ( int  idx,
const char *  event,
script_callback_t handler 
) [static]

Definition at line 188 of file scriptnet.c.

References NULL, script_net_info::on_connect, event_owner_b::on_delete, script_net_info::on_delete, script_net_info::on_eof, script_net_info::on_newclient, script_net_info::on_read, script_net_info::on_written, script_callback_b::owner, script_net_info_lookup(), script_net_takeover(), and script_callback_b::syntax.

00189 {
00190   script_net_info_t *info;
00191   script_callback_t **replace = NULL;
00192   const char *newsyntax;
00193 
00194   /* See if it's already script-controlled. */
00195   info = script_net_info_lookup(idx);
00196   if (!info) {
00197     /* Nope, take it over. */
00198     script_net_takeover(idx);
00199     info = script_net_info_lookup(idx);
00200     if (!info) return(-1);
00201   }
00202 
00203   if (!strcasecmp(event, "connect")) {
00204     replace = &info->on_connect;
00205     newsyntax = "isi";
00206   }
00207   else if (!strcasecmp(event, "eof")) {
00208     replace = &info->on_eof;
00209     newsyntax = "iis";
00210   }
00211   else if (!strcasecmp(event, "newclient")) {
00212     replace = &info->on_newclient;
00213     newsyntax = "iisi";
00214   }
00215   else if (!strcasecmp(event, "read")) {
00216     replace = &info->on_read;
00217     newsyntax = "ibi";
00218   }
00219   else if (!strcasecmp(event, "written")) {
00220     replace = &info->on_written;
00221     newsyntax = "iii";
00222   }
00223   else if (!strcasecmp(event, "delete")) {
00224     replace = &info->on_delete;
00225     newsyntax = "i";
00226   }
00227   else {
00228     /* Invalid event type. */
00229     return(-2);
00230   }
00231 
00232   if (*replace && (*replace)->owner && (*replace)->owner->on_delete) (*replace)->owner->on_delete((*replace)->owner, *replace);
00233   if (callback) callback->syntax = strdup(newsyntax);
00234   *replace = callback;
00235   return(0);
00236 }

static int script_net_info ( script_var_t retval,
int  idx,
char *  what 
) [static]

Definition at line 238 of file scriptnet.c.

References sockbuf_stats_t::bytes_in, sockbuf_stats_t::bytes_out, sockbuf_stats_t::connected_at, sockbuf_stats_t::last_input_at, sockbuf_stats_t::last_output_at, script_var_b::len, NULL, sockbuf_stats_t::raw_bytes_in, sockbuf_stats_t::raw_bytes_left, sockbuf_stats_t::raw_bytes_out, SCRIPT_ARRAY, SCRIPT_FREE, script_int(), SCRIPT_INTEGER, script_list_append(), SCRIPT_VAR, egg_timeval::sec, sockbuf_stats_t::snapshot_in_cps, sockbuf_stats_t::snapshot_out_cps, sockbuf_get_stats(), sockbuf_stats_t::total_in_cps, sockbuf_stats_t::total_out_cps, script_var_b::type, and script_var_b::value.

00239 {
00240   sockbuf_stats_t *stats = NULL;
00241 
00242   sockbuf_get_stats(idx, &stats);
00243   retval->type = SCRIPT_INTEGER;
00244   if (!stats) return(0);
00245 
00246   if (!strcasecmp(what, "all")) {
00247     retval->type = SCRIPT_ARRAY | SCRIPT_FREE | SCRIPT_VAR;
00248     retval->len = 0;
00249     script_list_append(retval, script_int(stats->connected_at.sec));
00250     script_list_append(retval, script_int(stats->last_input_at.sec));
00251     script_list_append(retval, script_int(stats->last_output_at.sec));
00252     script_list_append(retval, script_int(stats->raw_bytes_in));
00253     script_list_append(retval, script_int(stats->raw_bytes_out));
00254     script_list_append(retval, script_int(stats->raw_bytes_left));
00255     script_list_append(retval, script_int(stats->bytes_in));
00256     script_list_append(retval, script_int(stats->bytes_out));
00257     script_list_append(retval, script_int(stats->total_in_cps));
00258     script_list_append(retval, script_int(stats->snapshot_in_cps));
00259     script_list_append(retval, script_int(stats->total_out_cps));
00260     script_list_append(retval, script_int(stats->snapshot_out_cps));
00261   }
00262   else if (!strcasecmp(what, "raw_bytes_left")) retval->value = (void *)(int)stats->raw_bytes_left;
00263   else if (!strcasecmp(what, "raw_bytes_in")) retval->value = (void *)(int)stats->raw_bytes_in;
00264   else if (!strcasecmp(what, "raw_bytes_out")) retval->value = (void *)(int)stats->raw_bytes_out;
00265   return(0);
00266 }

static void script_net_info_add ( script_net_info_t info  )  [static]

Definition at line 129 of file scriptnet.c.

References script_net_info::next, NULL, and script_net_info::prev.

Referenced by script_net_takeover().

00130 {
00131   info->next = script_net_info_head;
00132   info->prev = NULL;
00133   if (script_net_info_head) script_net_info_head->prev = info;
00134   script_net_info_head = info;
00135 }

static script_net_info_t* script_net_info_lookup ( int  idx  )  [static]

Definition at line 119 of file scriptnet.c.

References script_net_info::idx, and script_net_info::next.

Referenced by script_net_handler().

00120 {
00121   script_net_info_t *info;
00122 
00123   for (info = script_net_info_head; info; info = info->next) {
00124     if (info->idx == idx) break;
00125   }
00126   return(info);
00127 }

static void script_net_info_remove ( script_net_info_t info  )  [static]

Definition at line 137 of file scriptnet.c.

References script_net_info::next, and script_net_info::prev.

Referenced by on_delete().

00138 {
00139   if (info->prev) info->prev->next = info->next;
00140   else script_net_info_head = info->next;
00141 
00142   if (info->next) info->next->prev = info->prev;
00143 }

static int script_net_linemode ( int  nargs,
int  idx,
int  onoff 
) [static]

Definition at line 181 of file scriptnet.c.

References linemode_check(), linemode_off(), and linemode_on().

00182 {
00183   if (nargs == 1) return linemode_check(idx);
00184   if (onoff) return linemode_on(idx);
00185   else return linemode_off(idx);
00186 }

static int script_net_listen ( script_var_t retval,
int  port 
) [static]

Definition at line 146 of file scriptnet.c.

References egg_listen(), script_net_info::idx, script_var_b::len, SCRIPT_ARRAY, SCRIPT_FREE, script_int(), script_list_append(), script_net_takeover(), SCRIPT_VAR, and script_var_b::type.

00147 {
00148   int idx, real_port;
00149 
00150   retval->type = SCRIPT_ARRAY | SCRIPT_FREE | SCRIPT_VAR;
00151   retval->len = 0;
00152 
00153   idx = egg_listen(port, &real_port);
00154   script_net_takeover(idx);
00155   script_list_append(retval, script_int(idx));
00156   script_list_append(retval, script_int(real_port));
00157   return(0);
00158 }

static int script_net_open ( const char *  host,
int  port,
int  timeout 
) [static]

Definition at line 160 of file scriptnet.c.

References egg_connect(), script_net_info::idx, and script_net_takeover().

00161 {
00162   int idx;
00163 
00164   idx = egg_connect(host, port, timeout);
00165   script_net_takeover(idx);
00166   return(idx);
00167 }

static int script_net_takeover ( int  idx  )  [static]

Definition at line 107 of file scriptnet.c.

References script_net_info::idx, script_net_info_add(), and sockbuf_set_handler().

Referenced by script_net_handler(), script_net_listen(), and script_net_open().

00108 {
00109   script_net_info_t *info;
00110 
00111   info = calloc(1, sizeof(*info));
00112   info->idx = idx;
00113   script_net_info_add(info);
00114   sockbuf_set_handler(info->idx, &sock_handler, info, &socket_owner);
00115   return(0);
00116 }

static int script_net_throttle ( int  idx,
int  speedin,
int  speedout 
) [static]

Definition at line 268 of file scriptnet.c.

References throttle_on(), and throttle_set().

00269 {
00270   throttle_on(idx);
00271   if (speedin) throttle_set(idx, 0, speedin);
00272   if (speedout) throttle_set(idx, 1, speedout);
00273   return(0);
00274 }

static int script_net_throttle_set ( void *  client_data,
int  idx,
int  speed 
) [static]

Definition at line 276 of file scriptnet.c.

References throttle_set().

00277 {
00278   return throttle_set(idx, (int) client_data, speed);
00279 }

static int script_net_write ( int  idx,
const char *  text,
int  len 
) [static]

Definition at line 174 of file scriptnet.c.

References sockbuf_write().

00175 {
00176   if (len <= 0) len = strlen(text);
00177 
00178   return sockbuf_write(idx, text, len);
00179 }


Variable Documentation

const char rcsid[] = "$Id: scriptnet.c,v 1.13 2008-10-17 15:57:43 sven Exp $" [static]

Definition at line 21 of file scriptnet.c.

Initial value:

 {
  {"net", "takeover", script_net_takeover, NULL, 1, "i", "idx", SCRIPT_INTEGER, 0}, 
  {"net", "listen", script_net_listen, NULL, 1, "i", "port", 0, SCRIPT_PASS_RETVAL},  
  {"net", "open", script_net_open, NULL, 2, "sii", "host port ?timeout?", SCRIPT_INTEGER, SCRIPT_VAR_ARGS}, 
  {"net", "close", script_net_close, NULL, 1, "i", "idx", SCRIPT_INTEGER, 0}, 
  {"net", "write", script_net_write, NULL, 2, "isi", "idx text ?len?", SCRIPT_INTEGER, SCRIPT_VAR_ARGS},  
  {"net", "handler", script_net_handler, NULL, 2, "isc", "idx event callback", SCRIPT_INTEGER, SCRIPT_VAR_ARGS},  
  {"net", "linemode", script_net_linemode, NULL, 1, "ii", "idx ?on-off?", SCRIPT_INTEGER, SCRIPT_PASS_COUNT | SCRIPT_VAR_ARGS}, 
  {"net", "info", script_net_info, NULL, 2, "is", "idx what", 0, SCRIPT_PASS_RETVAL}, 
  {"net", "throttle", script_net_throttle, NULL, 3, "iii", "idx speed-in speed-out", SCRIPT_INTEGER, 0},  
  {"net", "throttle_in", script_net_throttle_set, (void *)0, 2, "ii", "idx speed", SCRIPT_INTEGER, SCRIPT_PASS_CDATA},  
  {"net", "throttle_out", script_net_throttle_set, (void *)1, 2, "ii", "idx speed", SCRIPT_INTEGER, SCRIPT_PASS_CDATA}, 
  {"net", "throttle_off", throttle_off, NULL, 1, "i", "idx", SCRIPT_INTEGER, 0},  
  {0}
}

Definition at line 348 of file scriptnet.c.

Definition at line 36 of file scriptnet.c.

Initial value:

Definition at line 61 of file scriptnet.c.

Initial value:

 {
  "script", NULL,
  NULL, NULL,
  on_delete
}

Definition at line 67 of file scriptnet.c.


Generated on Sun Nov 30 18:43:36 2008 for eggdrop1.9 by  doxygen 1.5.6