⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mpdlib.py

📁 fortran并行计算包
💻 PY
📖 第 1 页 / 共 5 页
字号:
        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 + -