📄 mpdlib.py
字号:
ips1 = socket.gethostbyname_ex(host1)[2] # may fail if invalid host ips2 = socket.gethostbyname_ex(host2)[2] # may fail if invalid host except: return 0 for ip1 in ips1: for ip2 in ips2: if ip1 == ip2: return 1 return 0def mpd_read_nbytes(fd,nbytes): global mpd_signum rv = 0 while 1: try: mpd_signum = 0 rv = os.read(fd,nbytes) break except os.error, errinfo: if errinfo[0] == EINTR: if mpd_signum == signal.SIGINT or mpd_signum == signal.SIGALRM: break else: continue elif errinfo[0] == ECONNRESET: # connection reset (treat as eof) break else: mpd_print(1, 'read error: %s' % os.strerror(errinfo[0])) break except KeyboardInterrupt, errinfo: break except Exception, errinfo: mpd_print(1, 'other error after read %s :%s:' % ( errinfo.__class__, errinfo) ) break return rvdef mpd_get_groups_for_username(username): if pwd_module_available and grp_module_available: userGroups = [pwd.getpwnam(username)[3]] # default group for the user allGroups = grp.getgrall(); for group in allGroups: if username in group[3] and group[2] not in userGroups: userGroups.append(group[2]) else: userGroups = [] return userGroupsclass MPDSock(object): def __init__(self,family=socket.AF_INET,socktype=socket.SOCK_STREAM,proto=0, sock=None,name=''): if sock: self.sock = sock else: self.sock = socket.socket(family=family,type=socktype,proto=proto) self.name = name self.type = socktype self.family = family ## used this when inherited from socket.socket (only works with py 2.3+) ## socket.socket.__init__(self,family=family,type=socktype,proto=proto,_sock=sock) def close(self): self.sock.close() def sendall(self,data): self.sock.sendall(data) def getsockname(self): return self.sock.getsockname() def fileno(self): return self.sock.fileno() def connect(self,*args): # We handle EINTR in this method, unless it appears that a # SIGINT or SIGALRM are delivered. In that case, we do not # complete the connection (FIXME: make sure that all uses of this # do the right thing in that case). while 1: try: mpd_signum = 0 self.sock.connect(*args) break except socket.error, errinfo: if errinfo[0] == EINTR: # sigchld, sigint, etc. if mpd_signum == signal.SIGINT or mpd_signum == signal.SIGALRM: break else: continue else: raise socket.error, errinfo # end of while def accept(self,name='accepter'): global mpd_signum newsock = 0 newaddr = 0 while 1: try: mpd_signum = 0 (newsock,newaddr) = self.sock.accept() break except socket.error, errinfo: if errinfo[0] == EINTR: # sigchld, sigint, etc. if mpd_signum == signal.SIGINT or mpd_signum == signal.SIGALRM: break else: continue elif errinfo[0] == ECONNRESET: # connection reset (treat as eof) break else: print '%s: accept error: %s' % (mpd_my_id,os.strerror(errinfo[0])) break except Exception, errinfo: print '%s: failure doing accept : %s : %s' % \ (mpd_my_id,errinfo.__class__,errinfo) break if newsock: newsock = MPDSock(sock=newsock,name=name) # turn new socket into an MPDSock return (newsock,newaddr) def recv(self,nbytes): global mpd_signum data = 0 while 1: try: mpd_signum = 0 data = self.sock.recv(nbytes) break except socket.error, errinfo: if errinfo[0] == EINTR: # sigchld, sigint, etc. if mpd_signum == signal.SIGINT or mpd_signum == signal.SIGALRM: break else: continue elif errinfo[0] == ECONNRESET: # connection reset (treat as eof) break else: print '%s: recv error: %s' % (mpd_my_id,os.strerror(errinfo[0])) break except Exception, errinfo: print '%s: failure doing recv %s :%s:' % \ (mpd_my_id,errinfo.__class__,errinfo) break return data def recv_dict_msg(self,timeout=None): global mpd_signum global mpd_dbg_level mpd_print(mpd_dbg_level, \ "Entering recv_dict_msg with timeout=%s" % (str(timeout))) msg = {} readyToRecv = 0 if timeout: try: # Loop while we get EINTR. # FIXME: In some cases, we may want to exit if # the signal was SIGINT. We need to restart if # we see SIGCLD while 1: try: mpd_signum = 0 (readyToRecv,unused1,unused2) = select.select([self.sock],[],[],timeout) break; except os.error, errinfo: if errinfo[0] == EINTR: # Retry interrupted system calls pass else: raise os.error, errinfo # End of the while(1) except select.error, errinfo: if errinfo[0] == EINTR: if mpd_signum == signal.SIGINT or mpd_signum == signal.SIGALRM: mpd_print(0,"sigint/alrm check"); pass # assume timedout; returns {} below elif mpd_signum == signal.SIGCLD: mpd_print_tb(1,"mishandling sigchild in recv_dict_msg, errinfo=:%s" % (errinfo) ) else: mpd_print_tb(1,"Unhandled EINTR: errinfo=%s" % (errinfo) ) else: mpd_print(1, '%s: select error: %s' % (mpd_my_id,os.strerror(errinfo[0]))) except KeyboardInterrupt, errinfo: # print 'recv_dict_msg: keyboard interrupt during select' mpd_print(0,"KeyboardInterrupt"); return msg except Exception, errinfo: mpd_print(1, 'recv_dict_msg: exception during select %s :%s:' % \ ( errinfo.__class__, errinfo)) return msg else: readyToRecv = 1 if readyToRecv: mpd_print(mpd_dbg_level,"readyToRecv"); try: pickledLen = '' tempRecvd = '' lenLeft = 8 while lenLeft: while (1): try: tempRecvd = self.sock.recv(lenLeft) # FIXME: Shouldn't this block until there is a # message unless it raises an exception. # Is no message an EOF, and in that case, # do we really want to immediately delete # the corresponding entry? #if not pickledLen: # mpd_print(1,"continuing because recv failed") # continue break except socket.error,errinfo: if errinfo[0] == EINTR: mpd_print(mpd_dbg_level,"Saw EINTR") pass elif errinfo[0] == ECONNRESET: mpd_print(mpd_dbg_level,"Saw ECONNRESET, ignore (return null msg)") return msg; else: mpd_print_tb(1,"recv_dict_msg: sock.recv(8): errinfo=:%s:" % (errinfo)) raise socket.error,errinfo # end of while(1) if not tempRecvd: break pickledLen += tempRecvd lenLeft -= len(tempRecvd) if not pickledLen: mpd_print(mpd_dbg_level,"no pickeled len") if pickledLen: pickledLen = int(pickledLen) pickledMsg = '' lenLeft = pickledLen while lenLeft: while (1): try: recvdMsg = self.sock.recv(lenLeft) break except socket.error,errinfo: if errinfo[0] == EINTR: pass else: mpd_print_tb(1,"recv_dict_msg: sock.recv(8): errinfo=:%s:" % (errinfo)) raise socket.error,errinfo # end of while(1) pickledMsg += recvdMsg lenLeft -= len(recvdMsg) msg = loads(pickledMsg) except socket.error, errinfo: if errinfo[0] == EINTR: mpd_print(1, "Unhandled EINTR on sock.recv") return msg elif errinfo[0] == ECONNRESET: # connection reset (treat as eof) mpd_print(mpd_dbg_level,"Connection reset") pass # socket.error: (104, 'Connection reset by peer') else: mpd_print_tb(1,'recv_dict_msg: socket error: errinfo=:%s:' % (errinfo)) except StandardError, errmsg: # any built-in exceptions mpd_print_tb(1, 'recv_dict_msg: errmsg=:%s:' % (errmsg) ) except Exception, errmsg: mpd_print_tb(1, 'recv_dict_msg failed on sock %s errmsg=:%s:' % \ (self.name,errmsg) ) if mpd_dbg_level: if msg: mpd_print(1,"Returning with non-null msg, length = %d, head = %s" % (pickledLen,pickledMsg[0:32].replace('\n','<NL>') ) ) else: mpd_print(1,"Returning with null msg" ) return msg def recv_char_msg(self): return self.recv_one_line() # use leading len later def recv_one_line(self): msg = '' # A failure with EINTR was observed here, so a loop to retry on # EINTR has been added try: while 1: try: c = self.sock.recv(1) break except socket.error, errinfo: if errinfo[0] != EINTR: raise socket.error, errinfo # end of while except socket.error, errinfo: if errinfo[0] == EINTR: # sigchld, sigint, etc. # This should no longer happen (handled above) mpd_print_tb( 1, "Unhandled EINTR in sock.recv" ); return msg elif errinfo[0] == ECONNRESET: # connection reset (treat as eof) return msg else: print '%s: recv error: %s' % (mpd_my_id,os.strerror(errinfo[0])) sys.exit(-1) except Exception, errmsg: c = '' msg = '' mpd_print_tb(1, 'recv_char_msg: errmsg=:%s:' % (errmsg) ) if c: while c != '\n': msg += c try: c = self.sock.recv(1) except socket.error, errinfo: if errinfo[0] == EINTR: # sigchld, sigint, etc. return msg elif errinfo[0] == ECONNRESET: # connection reset (treat as eof) return msg else: print '%s: recv error: %s' % (mpd_my_id,os.strerror(errinfo[0])) sys.exit(-1) except Exception, errmsg: c = '' msg = '' mpd_print_tb(1, 'recv_char_msg: errmsg=:%s:' % (errmsg) ) break
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -