<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def get_extra_info(self, name, default=None):
 """Get transport specific data. In addition to the fields from :meth:`BaseTransport.get_extra_info`, the following information is also available: ===================== =================================================== Name Description ===================== =================================================== ``'sockname'`` The socket name i.e. the result of the ``getsockname()`` system call. ``'peername'`` The peer name i.e. the result of the ``getpeername()`` system call. ``'winsize'`` The terminal window size as a ``(cols, rows)`` tuple. Only available for :class:`pyuv.TTY` handles. ``'unix_creds'`` The Unix credentials of the peer as a ``(pid, uid, gid)`` tuple. Only available for :class:`pyuv.Pipe` handles on Unix. ``'server_hostname'`` The host name of the remote peer prior to address resolution, if applicable. ===================== =================================================== """

        if name == 'sockname':
            if not hasattr(self._handle, 'getsockname'):
                return default
            try:
                return self._handle.getsockname()
            except pyuv.error.UVError:
                return default
        elif name == 'peername':
            if not hasattr(self._handle, 'getpeername'):
                return default
            try:
                return self._handle.getpeername()
            except pyuv.error.UVError:
                return default
        elif name == 'winsize':
            if not hasattr(self._handle, 'get_winsize'):
                return default
            try:
                return self._handle.get_winsize()
            except pyuv.error.UVError:
                return default
        elif name == 'unix_creds':
            # In case you're wondering, DBUS needs this.
            if not isinstance(self._handle, pyuv.Pipe) or not hasattr(socket, 'SO_PEERCRED'):
                return default
            try:
                fd = self._handle.fileno()
                sock = socket.fromfd(fd, socket.AF_UNIX, socket.SOCK_DGRAM)  # will dup()
                with contextlib.closing(sock):
                    creds = sock.getsockopt(socket.SOL_SOCKET, socket.SO_PEERCRED,
                                            struct.calcsize('3i'))
            except socket.error:
                return default
            return struct.unpack('3i', creds)
        elif name == 'server_hostname':
            return self._server_hostname
        else:
            return super(Transport, self).get_extra_info(name, default)