-- 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: 7d55e5c503b4bb909d1b9c4650e19458aab2f34c:
path_to:
revision_to:

git.thebackupbox.net

urcd

git://git.thebackupbox.net/urcd

commit 7d55e5c503b4bb909d1b9c4650e19458aab2f34c
Author: root <root@d3v11.ano>
Date:   Sun May 5 19:41:59 2013 +0000

    [urc2sd] pipe through ./stdout before prefix

diff --git a/bin/add-urcstream2hub b/bin/add-urcstream2hub

index 6afb7ed794c20c7aab8893da03626a5ff97152e5..

index ..540af7d4a9e5fe07a9913b58a7da110ce30c8f7f 100755

--- a/bin/add-urcstream2hub
+++ b/bin/add-urcstream2hub
@@ -6,6 +6,9 @@
 n=`ls /services | grep urcd-stream2hub | wc -l`

 mkdir -p /services/urcd-stream2hub$n
+mkdir -p /services/urcd-stream2hub$n/env
+
+echo '0.0' > /services/urcd-stream2hub$n/env/LIMIT

 echo '#!/bin/sh -e' > /services/urcd-stream2hub$n/run
 echo "exec ./urcstream2hub $2 ./urcstream $1" >> /services/urcd-stream2hub$n/run
diff --git a/src/urc2sd.pyx b/src/urc2sd.pyx

index 1c1717c9a68475b169a06d947f9e1fe741927cdb..

index ..ccf9982ef36732a5501e7b846f779b97a1d22e27 100644

--- a/src/urc2sd.pyx
+++ b/src/urc2sd.pyx
@@ -40,10 +40,8 @@ for cmd in open('auto_cmd','rb').read().split('\n'):
   if cmd: auto_cmd.append(cmd)

 def sock_close(sn,sf):
-  try:
-    os.remove(str(os.getpid()))
-  except:
-    pass
+  try: os.remove(str(os.getpid()))
+  except: pass
   if sn: sys.exit(0)

 signal.signal(signal.SIGHUP,sock_close)
@@ -57,11 +55,11 @@ if os.access('stdin',1):
   rd = p.stdout.fileno()
   del p

-wr = 1
 if os.access('stdout',1):
-  p = subprocess.Popen(['./stdout'],stdin=subprocess.PIPE)
-  wr = p.stdin.fileno()
+  p = subprocess.Popen(['./stdout'],stdin=subprocess.PIPE,stdout=subprocess.PIPE)
+  pipefd = ( p.stdout.fileno(), p.stdin.fileno() )
   del p
+else: pipefd = os.pipe()

 uid, gid = pwd.getpwnam('urcd')[2:4]
 os.chdir(sys.argv[1])
@@ -79,6 +77,7 @@ sd=sock.fileno()

 poll=select.poll()
 poll.register(rd,select.POLLIN|select.POLLPRI)
+poll.register(pipefd[0],select.POLLIN)
 poll.register(sd,select.POLLIN)
 poll=poll.poll

@@ -86,28 +85,27 @@ client_revents=select.poll()
 client_revents.register(rd,select.POLLIN|select.POLLPRI)
 client_revents=client_revents.poll

+pipe_revents=select.poll()
+pipe_revents.register(pipefd[0],select.POLLIN)
+pipe_revents=pipe_revents.poll
+
 server_revents=select.poll()
 server_revents.register(sd,select.POLLIN)
 server_revents=server_revents.poll

 def try_read(fd,buffer_len):
-  try:
-    return os.read(fd,buffer_len)
-  except:
-    sock_close(15,0)
+  try: return os.read(fd,buffer_len)
+  except: sock_close(15,0)

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

 def sock_write(buffer):
   for path in os.listdir(root):
     try:
       if path != user: sock.sendto(buffer,path)
-    except:
-      pass
+    except: pass

 def INIT():

@@ -117,13 +115,13 @@ def INIT():

   for cmd in auto_cmd:
     time.sleep(len(auto_cmd))
-    try_write(wr,cmd+'\n')
+    try_write(pipefd[1],cmd+'\n')

   for dst in channels:
     time.sleep(len(channels))
-    try_write(wr,'JOIN '+dst+'\n')
+    try_write(pipefd[1],'JOIN '+dst+'\n')

-try_write(wr,
+try_write(pipefd[1],
   'USER '+nick+' '+nick+' '+nick+' :'+nick+'\n'
   'NICK '+nick+'\n'
 )
@@ -132,9 +130,9 @@ while 1:

   poll(-1)

-  if client_revents(0):
+  if not INIT: time.sleep(LIMIT)

-    if not INIT: time.sleep(LIMIT)
+  if client_revents(0):

     buffer = str()
     while 1:
@@ -156,7 +154,7 @@ while 1:
       sock_write(buffer+'\n')

     elif re_CLIENT_PING(buffer):
-      try_write(wr,'PONG '+re_SPLIT(buffer,1)[1]+'\n')
+      try_write(pipefd[1],'PONG '+re_SPLIT(buffer,1)[1]+'\n')

     elif re_CLIENT_JOIN(buffer):
       sock_write(buffer+'\n')
@@ -168,7 +166,7 @@ while 1:

     elif re.search('^:.+ 433 .+ '+re.escape(nick),buffer):
       nick+='_'
-      try_write(wr,'NICK '+nick+'\n')
+      try_write(pipefd[1],'NICK '+nick+'\n')

     elif re_CLIENT_KICK(buffer):

@@ -177,23 +175,31 @@ while 1:
       sock_write(buffer+'\n')

       if re_SPLIT(buffer,4)[3].lower() == nick.lower():
-        try_write(wr,'JOIN '+re_SPLIT(buffer,4)[2]+'\n')
+        try_write(pipefd[1],'JOIN '+re_SPLIT(buffer,4)[2]+'\n')
         channels.remove(dst)

     elif re.search('^:['+RE+']+![~'+RE+'.]+@['+RE+'.]+ INVITE '+re.escape(nick).upper()+' :[#&!+]['+RE+']+$',buffer.upper()):
       dst = buffer[1:].split(':',1)[1].lower()
-      if not dst in channels: try_write(wr,'JOIN '+dst+'\n')
+      if not dst in channels: try_write(pipefd[1],'JOIN '+dst+'\n')

   if INIT:
     INIT()
     continue

-  while server_revents(0):
-
-    time.sleep(LIMIT)
+  if server_revents(0):

     buffer = try_read(sd,1024).split('\n',1)[0]
     if not buffer: continue
+    try_write(pipefd[1],buffer+'\n')
+
+  if pipe_revents(0):
+
+    buffer = str()
+    while 1:
+      byte = try_read(pipefd[0],1)
+      if byte == '': sock_close(15,0)
+      if byte == '\n': break
+      if byte != '\r' and len(buffer)<768: buffer += byte

     buffer = re_BUFFER_CTCP_DCC('',buffer) + '\x01' if '\x01ACTION ' in buffer.upper() else buffer.replace('\x01','')
     if not COLOUR: buffer = re_BUFFER_COLOUR('',buffer)
@@ -209,4 +215,4 @@ while 1:
         src = buffer[1:].split('!',1)[0] + '> ' if cmd != 'TOPIC' else str()
         msg = buffer.split(':',2)[2]
         buffer = cmd + ' ' + dst + ' :' + src + msg + '\n'
-        try_write(wr,buffer)
+        try_write(1,buffer)

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

-- Response ended

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