-- Leo's gemini proxy

-- Connecting to git.thebackupbox.net:1965...

-- Connected

-- Sending request

-- Meta line: 20 text/gemini

repo: urcd
action: commit
revision:
path_from:
revision_from: 956af231d0e198b6c3874f3126d9be4ff9c6c1a4:
path_to:
revision_to:

git.thebackupbox.net

urcd

git://git.thebackupbox.net/urcd

commit 956af231d0e198b6c3874f3126d9be4ff9c6c1a4
Author: root <root@d3v11.ano>
Date:   Tue Jan 29 06:54:15 2013 +0000

    [urcd, urc2sd] try_write(fd, buffer) # bugfix for errno 32

diff --git a/src/urc2sd.pyx b/src/urc2sd.pyx

index 75784099422718b47120d4a0a251451ea917f7d9..

index ..9bed31dc6ad41535a07068539442fcbe307a0b1d 100644

--- a/src/urc2sd.pyx
+++ b/src/urc2sd.pyx
@@ -79,22 +79,28 @@ def server_poll():
     (256*len( client_POLLIN.poll(0)))
   ))

+def try_write(fd,buffer):
+  try:
+    os.write(fd,buffer)
+  except:
+    sock_close(15,0)
+
 def EOF():
   global EOF

   for cmd in auto_cmd:
     time.sleep(len(auto_cmd))
-    os.write(wr,cmd+'\n')
+    try_write(wr,cmd+'\n')

   for dst in channels:
     time.sleep(len(channels))
-    os.write(wr,'JOIN '+dst+'\n')
+    try_write(wr,'JOIN '+dst+'\n')

   del EOF
   EOF = 0

-os.write(wr,'USER '+nick+' '+nick+' '+nick+' :'+nick+'\n')
-os.write(wr,'NICK '+nick+'\n')
+try_write(wr,'USER '+nick+' '+nick+' '+nick+' :'+nick+'\n')
+try_write(wr,'NICK '+nick+'\n')

 while 1:
   if client_poll():
@@ -156,7 +162,7 @@ while 1:
     # PING
     if re.search('^PING :?.+$',buffer.upper()):
       dst = buffer.split(' ',1)[1]
-      os.write(wr,'PONG '+dst+'\n')
+      try_write(wr,'PONG '+dst+'\n')
       continue

     # :nick!user@serv JOIN :#channel
@@ -181,7 +187,7 @@ while 1:

     if re.search('^:.+ 433 .+ '+re.escape(nick),buffer):
       nick+='_'
-      os.write(wr,'NICK '+nick+'\n')
+      try_write(wr,'NICK '+nick+'\n')
       continue

     # :oper!user@serv KICK #channel nick :msg
@@ -199,7 +205,7 @@ while 1:

       if buffer.split(' ')[3].lower() == nick.lower():
         dst = buffer.split(' ')[2].lower()
-        os.write(wr,'JOIN '+dst+'\n')
+        try_write(wr,'JOIN '+dst+'\n')
         channels.remove(dst)

       continue
@@ -208,7 +214,7 @@ while 1:
     if re.search('^:['+RE+']+!['+RE+'.]+@['+RE+'.]+ INVITE '+re.escape(nick).upper()+' :#['+RE+']+$',buffer.upper()):
       dst = buffer.split(':',2)[2].lower()
       if not dst in channels:
-        os.write(wr,'JOIN '+dst+'\n')
+        try_write(wr,'JOIN '+dst+'\n')
       continue

     EOF() if EOF else EOF
@@ -238,6 +244,6 @@ while 1:
         msg    = buffer.split(':',2)[2]
         buffer = cmd + ' ' + dst + ' :' + src + msg + '\n'

-        os.write(wr,buffer)
+        try_write(wr,buffer)

 sock_close(0,0)
diff --git a/src/urcd.pyx b/src/urcd.pyx

index c32adc2a4bcfc9c78684213766e4158382ab01c9..

index ..ea5ac82739a045c6fdab31207e0dc78036eb5b4e 100644

--- a/src/urcd.pyx
+++ b/src/urcd.pyx
@@ -78,6 +78,12 @@ def server_poll():
     (256*len( client_POLLIN.poll(0)))
   ))

+def try_write(fd,buffer):
+  try:
+    os.write(fd,buffer)
+  except:
+    sock_close(15,0)
+
 while 1:
   if client_poll():

@@ -102,10 +108,10 @@ while 1:
         nick = buffer.split(' ')[1].lower()

         if len(nick)>NICKLEN:
-          os.write(wr,'ERROR : EMSGSIZE:NICKLEN='+str(NICKLEN)+'\n')
+          try_write(wr,'ERROR : EMSGSIZE:NICKLEN='+str(NICKLEN)+'\n')
           continue

-        os.write(wr,
+        try_write(wr,
           ':'+serv+' 001 '+nick+' :'+serv+'\n'
           ':'+serv+' 002 '+nick+' :'+nick+'!'+user+'@'+serv+'\n'
           ':'+serv+' 003 '+nick+' :'+serv+'\n'
@@ -115,10 +121,10 @@ while 1:
           ':'+nick+'!'+user+'@'+serv+' MODE '+nick+' +i\n'
         )

-        os.write(wr,':'+serv+' 375 '+nick+' :- '+serv+' MOTD -\n')
+        try_write(wr,':'+serv+' 375 '+nick+' :- '+serv+' MOTD -\n')
         for msg in motd:
-          os.write(wr,':'+serv+' 372 '+nick+' :- '+msg+'\n')
-        os.write(wr,':'+serv+' 376 '+nick+' :EOF MOTD\n')
+          try_write(wr,':'+serv+' 372 '+nick+' :- '+msg+'\n')
+        try_write(wr,':'+serv+' 376 '+nick+' :EOF MOTD\n')

         del motd

@@ -128,10 +134,10 @@ while 1:
       nick = buffer.split(' ')[1].lower()

       if len(nick)>NICKLEN:
-        os.write(wr,'ERROR : EMSGSIZE:NICKLEN='+str(NICKLEN)+'\n')
+        try_write(wr,'ERROR : EMSGSIZE:NICKLEN='+str(NICKLEN)+'\n')
         continue

-      os.write(wr,':'+src+'!'+user+'@'+serv+' NICK '+nick+'\n')
+      try_write(wr,':'+src+'!'+user+'@'+serv+' NICK '+nick+'\n')

       for dst in channel_struct.keys():
         if dst in channels:
@@ -149,24 +155,24 @@ while 1:

       cmd = buffer.split(' ',1)[0].upper()
       dst = buffer.split(' ',2)[1]
-      msg = re.split(' :?',buffer,2)[2] # onsams sucks
+      msg = re.split(' +:?',buffer,2)[2] # onsams sucks

       if dst[0] == '#':
         if len(dst)>CHANNELLEN:
-          os.write(wr,'ERROR : EMSGSIZE:CHANNELLEN='+str(CHANNELLEN)+'\n')
+          try_write(wr,'ERROR : EMSGSIZE:CHANNELLEN='+str(CHANNELLEN)+'\n')
           continue

       elif len(dst)>NICKLEN:
-        os.write(wr,'ERROR : EMSGSIZE:NICKLEN='+str(NICKLEN)+'\n')
+        try_write(wr,'ERROR : EMSGSIZE:NICKLEN='+str(NICKLEN)+'\n')
         continue

       if cmd == 'TOPIC':

         if len(msg)>TOPICLEN:
-          os.write(wr,'ERROR : EMSGSIZE:TOPICLEN='+str(TOPICLEN)+'\n')
+          try_write(wr,'ERROR : EMSGSIZE:TOPICLEN='+str(TOPICLEN)+'\n')
           continue

-        os.write(wr,':'+nick+'!'+user+'@'+serv+' '+cmd+' '+dst+' :'+msg+'\n')
+        try_write(wr,':'+nick+'!'+user+'@'+serv+' '+cmd+' '+dst+' :'+msg+'\n')

         if dst[0] == '#':

@@ -180,7 +186,7 @@ while 1:
             channel_struct[dst]['topic'] = msg

       if cmd == 'PART' and dst in channels:
-        os.write(wr,':'+nick+'!'+user+'@'+serv+' '+cmd+' '+dst+' :'+msg+'\n')
+        try_write(wr,':'+nick+'!'+user+'@'+serv+' '+cmd+' '+dst+' :'+msg+'\n')
         channels.remove(dst)
         channel_struct[dst]['names'].remove(nick)
         continue
@@ -197,10 +203,9 @@ while 1:
     # /PING
     if re.search('^PING :?.+$',buffer.upper()):

-      dst = re.split(' :?',buffer)[1]
+      dst = re.split(' +:?',buffer)[1]

-      os.write(wr,':'+serv+' PONG '+serv+' :'+dst+'\n')
-      #os.write(wr,'PONG '+dst+'\n') xchat sucks (mac)
+      try_write(wr,':'+serv+' PONG '+serv+' :'+dst+'\n') #try_write(wr,'PONG '+dst+'\n') xchat sucks (mac)
       continue

     # /MODE #channel [<arg>,...]
@@ -208,8 +213,8 @@ while 1:

       dst = buffer.split(' ')[1]

-      os.write(wr,':'+serv+' 324 '+nick+' '+dst+' +n\n')
-      os.write(wr,':'+serv+' 329 '+nick+' '+dst+' '+str(int(time.time()))+'\n')
+      try_write(wr,':'+serv+' 324 '+nick+' '+dst+' +n\n')
+      try_write(wr,':'+serv+' 329 '+nick+' '+dst+' '+str(int(time.time()))+'\n')

       continue

@@ -218,7 +223,7 @@ while 1:

       dst = buffer.split(' ')[1]

-      os.write(wr,':'+serv+' 221 '+dst+' :+i\n')
+      try_write(wr,':'+serv+' 221 '+dst+' :+i\n')
       continue

     # /MODE nick <arg>
@@ -227,17 +232,17 @@ while 1:

       dst = buffer.split(' ')[1]

-      os.write(wr,':'+nick+'!'+user+'@'+serv+' MODE '+nick+' +i\n')
+      try_write(wr,':'+nick+'!'+user+'@'+serv+' MODE '+nick+' +i\n')
       continue

     # /AWAY
     if re.search('^AWAY ?$',buffer.upper()):
-      os.write(wr,':'+serv+' 305 '+nick+' :WB, :-)\n')
+      try_write(wr,':'+serv+' 305 '+nick+' :WB, :-)\n')
       continue

     # /AWAY <msg>
     if re.search('^AWAY .+$',buffer.upper()):
-      os.write(wr,':'+serv+' 306 '+nick+' :HB, :-)\n')
+      try_write(wr,':'+serv+' 306 '+nick+' :HB, :-)\n')
       continue

     # /WHO
@@ -247,8 +252,8 @@ while 1:

       if dst in channel_struct.keys():
         for src in channel_struct[dst]['names']:
-          os.write(wr,':'+serv+' 352 '+nick+' '+dst+' '+src+' '+serv+' '+src+' '+src+' H :0 '+src+'\n')
-      os.write(wr,':'+serv+' 315 '+nick+' '+dst+' :EOF WHO\n')
+          try_write(wr,':'+serv+' 352 '+nick+' '+dst+' '+src+' '+serv+' '+src+' '+src+' H :0 '+src+'\n')
+      try_write(wr,':'+serv+' 315 '+nick+' '+dst+' :EOF WHO\n')
       continue

     # /INVITE
@@ -258,14 +263,14 @@ while 1:
       msg = buffer.split(' ')[2]

       if len(dst)>NICKLEN:
-        os.write(wr,'ERROR : EMSGSIZE:NICKLEN='+str(NICKLEN)+'\n')
+        try_write(wr,'ERROR : EMSGSIZE:NICKLEN='+str(NICKLEN)+'\n')
         continue

       elif len(msg)>CHANNELLEN:
-        os.write(wr,'ERROR : EMSGSIZE:CHANNELLEN='+str(CHANNELLEN)+'\n')
+        try_write(wr,'ERROR : EMSGSIZE:CHANNELLEN='+str(CHANNELLEN)+'\n')
         continue

-      os.write(wr,':'+serv+' 341 '+nick+' '+dst+' '+msg+'\n')
+      try_write(wr,':'+serv+' 341 '+nick+' '+dst+' '+msg+'\n')

       for path in os.listdir(root):
         try:
@@ -283,11 +288,11 @@ while 1:
       for dst in dst.split(','):

         if len(channels)>CHANLIMIT:
-          os.write(wr,'ERROR : EMSGSIZE:CHANLIMIT='+str(CHANLIMIT)+'\n')
+          try_write(wr,'ERROR : EMSGSIZE:CHANLIMIT='+str(CHANLIMIT)+'\n')
           continue

         if len(dst)>CHANNELLEN:
-          os.write(wr,'ERROR : EMSGSIZE:CHANNELLEN='+str(CHANNELLEN)+'\n')
+          try_write(wr,'ERROR : EMSGSIZE:CHANNELLEN='+str(CHANNELLEN)+'\n')
           continue

         if dst in channels:
@@ -305,19 +310,19 @@ while 1:
           channel_struct[dst]['names'].remove(nick)

         if channel_struct[dst]['topic']:
-          os.write(wr,':'+serv+' 332 '+nick+' '+dst+' :'+channel_struct[dst]['topic']+'\n')
+          try_write(wr,':'+serv+' 332 '+nick+' '+dst+' :'+channel_struct[dst]['topic']+'\n')

-        os.write(wr,':'+nick+'!'+user+'@'+serv+' JOIN :'+dst+'\n')
+        try_write(wr,':'+nick+'!'+user+'@'+serv+' JOIN :'+dst+'\n')

-        os.write(wr,':'+serv+' 353 '+nick+' = '+dst+' :'+nick+' ')
+        try_write(wr,':'+serv+' 353 '+nick+' = '+dst+' :'+nick+' ')
         for src in channel_struct[dst]['names']:
-          os.write(wr,src+' ')
-        os.write(wr,'\n')
+          try_write(wr,src+' ')
+        try_write(wr,'\n')

-        os.write(wr,':'+serv+' 366 '+nick+' '+dst+' :EOF NAMES\n')
+        try_write(wr,':'+serv+' 366 '+nick+' '+dst+' :EOF NAMES\n')

         if len(channel_struct[dst]['names'])==CHANLIMIT:
-          os.write(wr,':'+channel_struct[dst]['names'][0]+'!'+channel_struct[dst]['names'][0]+'@'+serv+' PART '+dst+'\n')
+          try_write(wr,':'+channel_struct[dst]['names'][0]+'!'+channel_struct[dst]['names'][0]+'@'+serv+' PART '+dst+'\n')

         channel_struct[dst]['names'].append(nick)

@@ -330,7 +335,7 @@ while 1:

       for dst in dst.split(','):
         if dst in channels:
-          os.write(wr,':'+nick+'!'+user+'@'+serv+' PART '+dst+' :\n')
+          try_write(wr,':'+nick+'!'+user+'@'+serv+' PART '+dst+' :\n')
           channels.remove(dst)
           channel_struct[dst]['names'].remove(nick)
       continue
@@ -338,18 +343,18 @@ while 1:
     # /LIST
     if re.search('^LIST',buffer.upper()):

-      os.write(wr,':'+serv+' 321 '+nick+' channel :users name\n')
+      try_write(wr,':'+serv+' 321 '+nick+' channel :users name\n')

       for dst in channel_struct.keys():

         if len(channel_struct[dst]['names']):

-          os.write(wr,':'+serv+' 322 '+nick+' '+dst+' '+str(len(channel_struct[dst]['names']))+' :[+n] ')
+          try_write(wr,':'+serv+' 322 '+nick+' '+dst+' '+str(len(channel_struct[dst]['names']))+' :[+n] ')
           if channel_struct[dst]['topic']:
-            os.write(wr,channel_struct[dst]['topic'])
-          os.write(wr,'\n')
+            try_write(wr,channel_struct[dst]['topic'])
+          try_write(wr,'\n')

-      os.write(wr,':'+serv+' 323 '+nick+' :EOF LIST\n')
+      try_write(wr,':'+serv+' 323 '+nick+' :EOF LIST\n')
       continue

     # /QUIT
@@ -364,7 +369,7 @@ while 1:
       buffer = str({str():buffer})[6:][:len(str({str():buffer})[6:])-2]
       buffer = buffer.replace("\\'","'")
       buffer = buffer.replace('\\\\','\\')
-      os.write(wr,':'+serv+' NOTICE '+nick+' :ERROR: '+buffer+'\n')
+      try_write(wr,':'+serv+' NOTICE '+nick+' :ERROR: '+buffer+'\n')

   while server_poll():

@@ -426,19 +431,19 @@ while 1:

           if src != nick and src in channel_struct[dst]['names']:
             channel_struct[dst]['names'].remove(src)
-            os.write(wr,buffer)
+            try_write(wr,buffer)
           continue

         if src != nick and not src in channel_struct[dst]['names']:

           if dst in channels:

-            os.write(wr,buffer.split(' ',1)[0]+' JOIN :'+dst+'\n')
+            try_write(wr,buffer.split(' ',1)[0]+' JOIN :'+dst+'\n')

             if len(channel_struct[dst]['names'])==CHANLIMIT:

               if nick != channel_struct[dst]['names'][0]:
-                os.write(wr,':'+channel_struct[dst]['names'][0]+'!'+channel_struct[dst]['names'][0]+'@'+serv+' PART '+dst+'\n')
+                try_write(wr,':'+channel_struct[dst]['names'][0]+'!'+channel_struct[dst]['names'][0]+'@'+serv+' PART '+dst+'\n')
               else:
                 channel_struct[dst]['names'].append(nick)

@@ -448,7 +453,7 @@ while 1:
         continue

       if dst == nick or dst in channels:
-        os.write(wr,buffer)
+        try_write(wr,buffer)

     # JOIN
     elif re.search('^:['+RE+']+!['+RE+'.]+@['+RE+'.]+ JOIN :#['+RE+']+$',buffer.upper()):
@@ -484,12 +489,12 @@ while 1:

         if dst in channels:

-          os.write(wr,buffer)
+          try_write(wr,buffer)

           if len(channel_struct[dst]['names'])==CHANLIMIT:

             if nick != channel_struct[dst]['names'][0]:
-              os.write(wr,':'+channel_struct[dst]['names'][0]+'!'+channel_struct[dst]['names'][0]+'@'+serv+' PART '+dst+'\n')
+              try_write(wr,':'+channel_struct[dst]['names'][0]+'!'+channel_struct[dst]['names'][0]+'@'+serv+' PART '+dst+'\n')
             else:
               channel_struct[dst]['names'].append(nick)

@@ -514,7 +519,7 @@ while 1:
           channel_struct[dst]['names'].remove(src)

           if cmd == '\x01' and dst in channels:
-            os.write(wr,buffer)
+            try_write(wr,buffer)
             cmd = '\x00'

     # KICK
@@ -557,6 +562,6 @@ while 1:
         dst = buffer.split(' ',3)[2].lower()

         if dst in channels:
-          os.write(wr,buffer)
+          try_write(wr,buffer)

 sock_close(0,0)

-----END OF PAGE-----

-- Response ended

-- Page fetched on Sun Jun 2 17:02:25 2024