[or-cvs] r8799: Implement status event backend logic. (in tor/trunk: . doc src/or)

nickm at seul.org nickm at seul.org
Mon Oct 23 05:25:08 UTC 2006


Author: nickm
Date: 2006-10-23 01:24:57 -0400 (Mon, 23 Oct 2006)
New Revision: 8799

Modified:
   tor/trunk/
   tor/trunk/doc/TODO
   tor/trunk/src/or/control.c
   tor/trunk/src/or/or.h
Log:
 r9347 at Kushana:  nickm | 2006-10-23 01:24:48 -0400
 Implement status event backend logic.



Property changes on: tor/trunk
___________________________________________________________________
 svk:merge ticket from /tor/trunk [r9347] on c95137ef-5f19-0410-b913-86e773d04f59

Modified: tor/trunk/doc/TODO
===================================================================
--- tor/trunk/doc/TODO	2006-10-23 04:52:56 UTC (rev 8798)
+++ tor/trunk/doc/TODO	2006-10-23 05:24:57 UTC (rev 8799)
@@ -44,10 +44,10 @@
     reintroduce Lasse's attacks from the Oakland paper.
   - enumerate events of important things that occur in tor, so vidalia can
     react.
-N   - Backend implementation
+    o Backend implementation
 R   - Actually list all the events (notice and warn log messages are a good
       place to look.)  Divide messages into categories, perhaps.
-N   - Specify general event system
+R   - Specify general event system
 R   - Specify actual events.
 
 N . Have (and document) a BEGIN_DIR relay cell that means "Connect to your
@@ -220,7 +220,7 @@
   - Design next-version protocol for connections
 
 For blocking-resistance scheme:
-  X allow ordinary-looking ssl for dir connections. need a new dirport
+  o allow ordinary-looking ssl for dir connections. need a new dirport
     for this, or can we handle both ssl and non-ssl, or should we
     entirely switch to ssl in certain cases?
 d - need to figure out how to fetch status of a few servers from the BDA

Modified: tor/trunk/src/or/control.c
===================================================================
--- tor/trunk/src/or/control.c	2006-10-23 04:52:56 UTC (rev 8798)
+++ tor/trunk/src/or/control.c	2006-10-23 05:24:57 UTC (rev 8799)
@@ -83,7 +83,10 @@
 #define EVENT_AUTHDIR_NEWDESCS 0x000D
 #define EVENT_DESCCHANGED      0x000E
 #define EVENT_NS               0x000F
-#define _EVENT_MAX             0x000F
+#define EVENT_STATUS_CLIENT    0x0010
+#define EVENT_STATUS_SERVER    0x0011
+#define EVENT_STATUS_GENERAL   0x0012
+#define _EVENT_MAX             0x0012
 /* If _EVENT_MAX ever hits 0x0020, we need to make the mask wider. */
 
 /** Array mapping from message type codes to human-readable message
@@ -1054,6 +1057,12 @@
           event_code = EVENT_DESCCHANGED;
         else if (!strcasecmp(ev, "NS"))
           event_code = EVENT_NS;
+        else if (!strcasecmp(ev, "STATUS_GENERAL"))
+          event_code = EVENT_STATUS_GENERAL;
+        else if (!strcasecmp(ev, "STATUS_CLIENT"))
+          event_code = EVENT_STATUS_CLIENT;
+        else if (!strcasecmp(ev, "STATUS_SERVER"))
+          event_code = EVENT_STATUS_SERVER;
         else {
           connection_printf_to_buf(conn, "552 Unrecognized event \"%s\"\r\n",
                                    ev);
@@ -2408,10 +2417,10 @@
       else if (!strcasecmp(arg, "EXTENDED_EVENTS")) /* <- documented */
         extended_events = 1;
       else if (!strcasecmp(arg, "EXTENDED_FORMAT")) {
-        /* remove this in 0.1.2.4; EXTENDED_FORMAT only ever worked for a little
-         * while during 0.1.2.2-alpha-dev. */
+        /* remove this in 0.1.2.4; EXTENDED_FORMAT only ever worked for a
+         * little while during 0.1.2.2-alpha-dev. */
         log_warn(LD_GENERAL,
-                 "EXTENDED_FORMAT is deprecated; use EXTENDED_EVENTS instead.");
+                "EXTENDED_FORMAT is deprecated; use EXTENDED_EVENTS instead.");
         extended_events = 1;
       } else {
         connection_printf_to_buf(conn, "552 Unrecognized feature \"%s\"\r\n",
@@ -3399,6 +3408,7 @@
   return 0;
 }
 
+/* DOCDOC */
 int
 control_event_networkstatus_changed_single(local_routerstatus_t *rs)
 {
@@ -3424,6 +3434,96 @@
   return 0;
 }
 
+/* DOCDOC */
+static int
+control_event_status(int type, int severity, const char *format, va_list args)
+{
+  char format_buf[160];
+  const char *status, *sev;
+
+  switch (type) {
+    case EVENT_STATUS_GENERAL:
+      status = "STATUS_GENERAL";
+      break;
+    case EVENT_STATUS_CLIENT:
+      status = "STATUS_CLIENT";
+      break;
+    case EVENT_STATUS_SERVER:
+      status = "STATUS_SEVER";
+      break;
+    default:
+      log_warn(LD_BUG, "Unrecognized status type %d", type);
+      return -1;
+  }
+  switch (severity) {
+    case LOG_NOTICE:
+      sev = "NOTICE";
+      break;
+    case LOG_WARN:
+      sev = "WARN";
+      break;
+    case LOG_ERR:
+      sev = "ERR";
+      break;
+    default:
+      log_warn(LD_BUG, "Unrecognized status severity %d", severity);
+      return -1;
+  }
+  if (tor_snprintf(format_buf, sizeof(format_buf), "650 %s %s %s\r\n",
+                   status, sev, format)<0) {
+    log_warn(LD_BUG, "Format string too long.");
+    return -1;
+  }
+
+  send_control1_event_impl(type, ALL_NAMES|ALL_FORMATS, 0, format_buf, args);
+  return 0;
+}
+
+/* DOCDOC */
+int
+control_event_general_status(int severity, const char *format, ...)
+{
+  va_list ap;
+  int r;
+  if (!EVENT_IS_INTERESTING1(EVENT_STATUS_GENERAL))
+    return 0;
+
+  va_start(ap, format);
+  r = control_event_status(EVENT_STATUS_GENERAL, severity, format, ap);
+  va_end(ap);
+  return r;
+}
+
+/* DOCDOC */
+int
+control_event_client_status(int severity, const char *format, ...)
+{
+  va_list ap;
+  int r;
+  if (!EVENT_IS_INTERESTING1(EVENT_STATUS_CLIENT))
+    return 0;
+
+  va_start(ap, format);
+  r = control_event_status(EVENT_STATUS_CLIENT, severity, format, ap);
+  va_end(ap);
+  return r;
+}
+
+/* DOCDOC */
+int
+control_event_server_status(int severity, const char *format, ...)
+{
+  va_list ap;
+  int r;
+  if (!EVENT_IS_INTERESTING1(EVENT_STATUS_SERVER))
+    return 0;
+
+  va_start(ap, format);
+  r = control_event_status(EVENT_STATUS_SERVER, severity, format, ap);
+  va_end(ap);
+  return r;
+}
+
 /** Choose a random authentication cookie and write it to disk.
  * Anybody who can read the cookie from disk will be considered
  * authorized to use the control connection. */

Modified: tor/trunk/src/or/or.h
===================================================================
--- tor/trunk/src/or/or.h	2006-10-23 04:52:56 UTC (rev 8798)
+++ tor/trunk/src/or/or.h	2006-10-23 05:24:57 UTC (rev 8799)
@@ -2121,6 +2121,12 @@
 int control_event_my_descriptor_changed(void);
 int control_event_networkstatus_changed(smartlist_t *statuses);
 int control_event_networkstatus_changed_single(local_routerstatus_t *rs);
+int control_event_general_status(int severity, const char *format, ...)
+  CHECK_PRINTF(2,3);
+int control_event_client_status(int severity, const char *format, ...)
+  CHECK_PRINTF(2,3);
+int control_event_server_status(int severity, const char *format, ...)
+  CHECK_PRINTF(2,3);
 
 int init_cookie_authentication(int enabled);
 int decode_hashed_password(char *buf, const char *hashed);



More information about the tor-commits mailing list