summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/connection.h30
-rw-r--r--include/inspircd.h1
-rw-r--r--include/users.h30
-rw-r--r--src/commands.cpp8
-rw-r--r--src/connection.cpp5
-rw-r--r--src/inspircd.cpp41
-rw-r--r--src/users.cpp1
7 files changed, 95 insertions, 21 deletions
diff --git a/include/connection.h b/include/connection.h
index e8af1b648..300a83d4a 100644
--- a/include/connection.h
+++ b/include/connection.h
@@ -79,6 +79,8 @@ class ircd_connector : public Extensible
*/
bool SetHostAddress(char* host, int port);
+ /** This string holds the ircd's version response
+ */
std::string version;
public:
@@ -169,12 +171,36 @@ class ircd_connector : public Extensible
*/
void CloseConnection();
+ /** This method adds text to the ircd connection's buffer
+ * There is no limitation on how much text of what line width may
+ * be added to this buffer. It is the sending server's responsibility
+ * to ensure sent data is kept within reasonable quanities.
+ */
void AddBuffer(std::string a);
+
+ /** This method returns true if the buffer contains at least one
+ * carriage return character, e.g. one line can be read from the
+ * buffer successfully.
+ */
bool BufferIsComplete();
+
+ /** This method clears the server's buffer by setting it to an empty string.
+ */
void ClearBuffer();
+
+ /** This method retrieves the first string from the tail end of the
+ * buffer and advances the tail end of the buffer past the returned
+ * string, in a similar manner to strtok().
+ */
std::string GetBuffer();
+ /** This method sets the version string of the remote server
+ */
void SetVersionString(std::string newversion);
+
+ /** This method returns the version string of the remote server.
+ * If the server has no version string an empty string is returned.
+ */
std::string GetVersionString();
};
@@ -303,10 +329,6 @@ class connection : public Extensible
*/
bool AddIncoming(int fd,char* targethost, int sourceport);
- /** This function is deprecated and may be removed in a later alpha/beta
- */
- long GenKey();
-
};
diff --git a/include/inspircd.h b/include/inspircd.h
index d5f149456..f0199e9dc 100644
--- a/include/inspircd.h
+++ b/include/inspircd.h
@@ -162,6 +162,7 @@ bool LoadModule(const char* filename);
bool UnloadModule(const char* filename);
char* ModuleError();
void NoticeAll(userrec *source, bool local_only, char* text, ...);
+void NoticeAllOpers(userrec *source, bool local_only, char* text, ...);
// mesh network functions
diff --git a/include/users.h b/include/users.h
index 0dfbc2223..73e1a1173 100644
--- a/include/users.h
+++ b/include/users.h
@@ -227,10 +227,32 @@ class userrec : public connection
*/
bool HasPermission(char* command);
- bool userrec::AddBuffer(std::string a);
- bool userrec::BufferIsReady();
- void userrec::ClearBuffer();
- std::string userrec::GetBuffer();
+ /** This method adds data to the buffer of the user.
+ * The buffer can grow to any size within limits of the available memory,
+ * managed by the size of a std::string, however if any individual line in
+ * the buffer grows over 600 bytes in length (which is 88 chars over the
+ * RFC-specified limit per line) then the method will return false and the
+ * text will not be inserted.
+ */
+ bool AddBuffer(std::string a);
+
+ /** This method returns true if the buffer contains at least one carriage return
+ * character (e.g. one complete line may be read)
+ */
+ bool BufferIsReady();
+
+ /** This function clears the entire buffer by setting it to an empty string.
+ */
+ void ClearBuffer();
+
+ /** This method returns the first available string at the tail end of the buffer
+ * and advances the tail end of the buffer past the string. This means it is
+ * a one way operation in a similar way to strtok(), and multiple calls return
+ * multiple lines if they are available. The results of this function if there
+ * are no lines to be read are unknown, always use BufferIsReady() to check if
+ * it is ok to read the buffer before calling GetBuffer().
+ */
+ std::string GetBuffer();
};
diff --git a/src/commands.cpp b/src/commands.cpp
index 05e0a951c..d66c21125 100644
--- a/src/commands.cpp
+++ b/src/commands.cpp
@@ -1876,9 +1876,13 @@ void handle_V(char token,char* params,serverrec* source,serverrec* reply, char*
if (user)
{
// notice all - only issuable by a server
- if (!strcmp(dest,"*"))
+ if (!strcmp(dest,"*"))
+ {
+ NoticeAll(user,true,"%s",text);
+ }
+ if (!strcmp(dest,"@*"))
{
- NoticeAll(user,true,"%s",text);
+ NoticeAllOpers(user,true,"%s",text);
}
else
{
diff --git a/src/connection.cpp b/src/connection.cpp
index 5cdd83f7f..debd3144f 100644
--- a/src/connection.cpp
+++ b/src/connection.cpp
@@ -546,8 +546,3 @@ bool connection::RecvPacket(std::deque<std::string> &messages, char* recvhost)
return false;
}
-long connection::GenKey()
-{
- return (random()*time(NULL));
-}
-
diff --git a/src/inspircd.cpp b/src/inspircd.cpp
index 2671de21b..2a15f265c 100644
--- a/src/inspircd.cpp
+++ b/src/inspircd.cpp
@@ -197,10 +197,6 @@ int portCount = 0, UDPportCount = 0, ports[MAXSOCKS];
int defaultRoute = 0;
char ModPath[MAXBUF];
-connection C;
-
-long MyKey = C.GenKey();
-
/* prototypes */
int has_channel(userrec *u, chanrec *c);
@@ -947,6 +943,41 @@ void WriteOpers(char* text, ...)
}
}
+void NoticeAllOpers(userrec *source, bool local_only, char* text, ...)
+{
+ if ((!text) || (!source))
+ {
+ log(DEFAULT,"*** BUG *** NoticeAllOpers was given an invalid parameter");
+ return;
+ }
+
+ char textbuffer[MAXBUF];
+ va_list argsPtr;
+ va_start (argsPtr, text);
+ vsnprintf(textbuffer, MAXBUF, text, argsPtr);
+ va_end(argsPtr);
+
+ for (std::vector<userrec*>::iterator i = all_opers.begin(); i != all_opers.end(); i++)
+ {
+ userrec* a = *i;
+ if ((a) && (a->fd != FD_MAGIC_NUMBER))
+ {
+ if (strchr(a->modes,'s'))
+ {
+ // send server notices to all with +s
+ WriteServ(a->fd,"NOTICE %s :*** Notice From %s: %s",a->nick,source->nick,textbuffer);
+ }
+ }
+ }
+
+ if (!local_only)
+ {
+ char buffer[MAXBUF];
+ snprintf(buffer,MAXBUF,"V %s @* :%s",source->nick,textbuffer);
+ NetSendToAll(buffer);
+ }
+}
+
// returns TRUE of any users on channel C occupy server 'servername'.
bool ChanAnyOnThisServer(chanrec *c,char* servername)
@@ -1181,7 +1212,7 @@ void NoticeAll(userrec *source, bool local_only, char* text, ...)
{
if ((!text) || (!source))
{
- log(DEFAULT,"*** BUG *** WriteOpers was given an invalid parameter");
+ log(DEFAULT,"*** BUG *** NoticeAll was given an invalid parameter");
return;
}
diff --git a/src/users.cpp b/src/users.cpp
index 0d305a3b7..7348c6db3 100644
--- a/src/users.cpp
+++ b/src/users.cpp
@@ -202,7 +202,6 @@ void userrec::ClearBuffer()
std::string userrec::GetBuffer()
{
- log(DEBUG,"GetBuffer\n%s\n",recvq.c_str());
char* line = (char*)recvq.c_str();
std::string ret = "";
while ((*line != '\n') && (strlen(line)))