PNG  IHDRxsBIT|d pHYs+tEXtSoftwarewww.inkscape.org<,tEXtComment File Manager

File Manager

Path: /opt/alt/python311/lib/python3.11/site-packages/pyroute2/plan9/

Viewing File: __init__.py

import builtins
import json
import struct

from pyroute2.netlink import nlmsg
from pyroute2.netlink.nlsocket import Marshal

Tversion = 100
Rversion = 101
Tauth = 102
Rauth = 103
Tattach = 104
Rattach = 105
Terror = 106  # illegal
Rerror = 107
Tflush = 108
Rflush = 109
Twalk = 110
Rwalk = 111
Topen = 112
Ropen = 113
Tcreate = 114
Rcreate = 115
Tread = 116
Rread = 117
Twrite = 118
Rwrite = 119
Tclunk = 120
Rclunk = 121
Tremove = 122
Rremove = 123
Tstat = 124
Rstat = 125
Twstat = 126
Rwstat = 127
Topenfd = 98
Ropenfd = 99

# 9P2000.pr2 extensions
Tcall = 80
Rcall = 81


class Plan9Exit(Exception):
    pass


def array(kind, header='H'):
    class CustomArray:

        @staticmethod
        def decode_count(data, offset):
            (count,) = struct.unpack_from(header, data, offset)
            return count, offset + struct.calcsize(header)

        @staticmethod
        def decode_from(data, offset):
            count, offset = CustomArray.decode_count(data, offset)
            ret = []
            for _ in range(count):
                value, offset = kind.decode_from(data, offset)
                ret.append(value)
            return ret, offset

        @staticmethod
        def encode_into(data, offset, value):
            if not isinstance(value, (tuple, list)):
                value = []
            data.extend([0] * struct.calcsize(header))
            struct.pack_into(header, data, offset, len(value))
            offset += struct.calcsize(header)
            for item in value:
                offset = kind.encode_into(data, offset, item)
            return offset

    return CustomArray


class Qid(dict):
    length = 13

    def __init__(self, qtype, vers, path):
        self['type'] = qtype
        self['vers'] = vers
        self['path'] = path

    @staticmethod
    def decode_from(data, offset):
        return (
            dict(
                zip(
                    ('type', 'vers', 'path'),
                    struct.unpack_from('=BIQ', data, offset),
                )
            ),
            offset + struct.calcsize('=BIQ'),
        )

    @staticmethod
    def encode_into(data, offset, value):
        data.extend([0] * Qid.length)
        struct.pack_into(
            '=BIQ', data, offset, value['type'], value['vers'], value['path']
        )
        return offset + Qid.length


class Stat(dict):
    header_fmt = 'H'

    def __init__(self):
        self['size'] = 58
        self['type'] = 0
        self['dev'] = 0
        self['qid.type'] = 0
        self['qid.vers'] = 0
        self['qid.path'] = 0
        self['mode'] = 0
        self['atime'] = 0
        self['mtime'] = 0
        self['length'] = 0
        self['name'] = ''
        self['uid'] = ''
        self['gid'] = ''
        self['muid'] = ''

    @staticmethod
    def decode_from(data, offset=0):
        ret = dict(
            zip(
                (
                    'size',
                    'type',
                    'dev',
                    'qid.type',
                    'qid.vers',
                    'qid.path',
                    'mode',
                    'atime',
                    'mtime',
                    'length',
                ),
                struct.unpack_from('=HHIBIQIIIQ', data, offset),
            )
        )
        offset += 41
        for key in ('name', 'uid', 'gid', 'muid'):
            ret[key], offset = String.decode_from(data, offset)
        return ret, offset

    @staticmethod
    def encode_into(data, offset, value):
        data.extend([0] * 41)
        # size of all the data except uint16 `size` header
        # 41 + 2 + name + 2 + uid + 2 + gid + 2 + muid
        value['size'] = (
            47
            + len(value['name'])
            + len(value['uid'])
            + len(value['gid'])
            + len(value['muid'])
        )
        struct.pack_into(
            '=HHIBIQIIIQ',
            data,
            offset,
            value['size'],
            value['type'],
            value['dev'],
            value['qid.type'],
            value['qid.vers'],
            value['qid.path'],
            value['mode'],
            value['atime'],
            value['mtime'],
            value['length'],
        )
        offset += 41
        for key in ('name', 'uid', 'gid', 'muid'):
            offset = String.encode_into(data, offset, value[key])
        return offset


class WStat(Stat):
    @staticmethod
    def decode_from(data, offset=0):
        # just ignore plength for now
        return Stat.decode_from(data, offset + 2)

    @staticmethod
    def encode_into(data, offset, value):
        data.extend([0] * 2)
        new_offset = Stat.encode_into(data, offset + 2, value)
        # size of all the data except uint16 `plength` header
        struct.pack_into('H', data, offset, new_offset - offset - 2)
        return new_offset


class CData:
    header_fmt = 'I'

    @staticmethod
    def decode_from(data, offset=0):
        (length,) = struct.unpack_from(CData.header_fmt, data, offset)
        offset += struct.calcsize(CData.header_fmt)
        return bytearray(data[offset : offset + length]), offset + length

    @staticmethod
    def encode_into(data, offset, value):
        length = len(value)
        if isinstance(value, str):
            value = value.encode('utf-8')
        data.extend([0] * (length + struct.calcsize(CData.header_fmt)))
        struct.pack_into(
            f'{CData.header_fmt}{length}s', data, offset, length, value
        )
        return offset + length + struct.calcsize(CData.header_fmt)


class String:
    header_fmt = 'H'

    @staticmethod
    def decode_from(data, offset=0):
        (length,) = struct.unpack_from(String.header_fmt, data, offset)
        offset += struct.calcsize(String.header_fmt)
        (value,) = struct.unpack_from(f'{length}s', data, offset)
        value = value.decode('utf-8')
        return value, offset + length

    @staticmethod
    def encode_into(data, offset, value):
        length = len(value)
        data.extend([0] * (length + struct.calcsize(String.header_fmt)))
        struct.pack_into(
            f'{String.header_fmt}{length}s',
            data,
            offset,
            length,
            value.encode('utf-8'),
        )
        return offset + length + struct.calcsize(String.header_fmt)


class msg_base(nlmsg):
    align = 0
    header = (('length', '=I'), ('type', 'B'), ('tag', 'H'))


class msg_terror(msg_base):
    defaults = {'header': {'type': Terror}}


class msg_rerror(msg_base):
    defaults = {'header': {'type': Rerror}}
    fields = (('ename', String),)


class msg_tversion(msg_base):
    defaults = {'header': {'type': Tversion}}
    fields = (('msize', 'I'), ('version', String))


class msg_rversion(msg_base):
    defaults = {'header': {'type': Rversion}}
    fields = (('msize', 'I'), ('version', String))


class msg_tauth(msg_base):
    defaults = {'header': {'type': Tauth}}
    fields = (('afid', 'I'), ('uname', String), ('aname', String))


class msg_rauth(msg_base):
    defaults = {'header': {'type': Rauth}}
    fields = (('aqid', '13B'),)


class msg_tattach(msg_base):
    defaults = {'header': {'type': Tattach}}
    fields = (
        ('fid', 'I'),
        ('afid', 'I'),
        ('uname', String),
        ('aname', String),
    )


class msg_rattach(msg_base):
    defaults = {'header': {'type': Rattach}}
    fields = (('qid', Qid),)


class msg_twalk(msg_base):
    defaults = {'header': {'type': Twalk}}
    fields = (('fid', 'I'), ('newfid', 'I'), ('wname', array(String)))


class msg_rwalk(msg_base):
    defaults = {'header': {'type': Rwalk}}
    fields = (('wqid', array(Qid)),)


class msg_tstat(msg_base):
    defaults = {'header': {'type': Tstat}}
    fields = (('fid', 'I'),)


class msg_rstat(msg_base):
    defaults = {'header': {'type': Rstat}}
    fields = (('stat', WStat),)


class msg_twstat(msg_base):
    defaults = {'header': {'type': Twstat}}
    fields = (('fid', 'I'), ('stat', WStat))


class msg_rwstat(msg_base):
    defaults = {'header': {'type': Rwstat}}


class msg_tclunk(msg_base):
    defaults = {'header': {'type': Tclunk}}
    fields = (('fid', 'I'),)


class msg_rclunk(msg_base):
    defaults = {'header': {'type': Rclunk}}
    pass


class msg_topen(msg_base):
    defaults = {'header': {'type': Topen}}
    fields = (('fid', 'I'), ('mode', 'B'))


class msg_ropen(msg_base):
    defaults = {'header': {'type': Ropen}}
    fields = (('qid', Qid), ('iounit', 'I'))


class msg_tread(msg_base):
    defaults = {'header': {'type': Tread}}
    fields = (('fid', 'I'), ('offset', 'Q'), ('count', 'I'))


class msg_rread(msg_base):
    defaults = {'header': {'type': Rread}, 'data': b''}
    fields = (('data', CData),)


class msg_twrite(msg_base):
    defaults = {'header': {'type': Twrite}}
    fields = (('fid', 'I'), ('offset', 'Q'), ('data', CData))


class msg_rwrite(msg_base):
    defaults = {'header': {'type': Rwrite}}
    fields = (('count', 'I'),)


class msg_tcall(msg_base):
    defaults = {'header': {'type': Tcall}}
    fields = (('fid', 'I'), ('text', String), ('data', CData))


class msg_rcall(msg_base):
    defaults = {'header': {'type': Rcall}}
    fields = (('err', 'H'), ('text', String), ('data', CData))


class Marshal9P(Marshal):
    default_message_class = msg_rerror

    msg_map = {
        Tversion: msg_tversion,
        Rversion: msg_rversion,
        Tauth: msg_tauth,
        Rauth: msg_rauth,
        Tattach: msg_tattach,
        Rattach: msg_rattach,
        Rerror: msg_rerror,
        Twalk: msg_twalk,
        Rwalk: msg_rwalk,
        Topen: msg_topen,
        Ropen: msg_ropen,
        Tread: msg_tread,
        Rread: msg_rread,
        Tclunk: msg_tclunk,
        Rclunk: msg_rclunk,
        Tstat: msg_tstat,
        Rstat: msg_rstat,
        Twstat: msg_twstat,
        Rwstat: msg_rwstat,
        Twrite: msg_twrite,
        Rwrite: msg_rwrite,
        Tcall: msg_tcall,
        Rcall: msg_rcall,
        Tcreate: msg_base,
        Rcreate: msg_base,
        Tremove: msg_base,
        Rremove: msg_base,
    }

    def parse(self, data, seq=None, callback=None, skip_alien_seq=False):
        offset = 0
        while offset <= len(data) - 5:
            (length, key, tag) = struct.unpack_from('=IBH', data, offset)
            if skip_alien_seq and tag != seq:
                continue
            if not 0 < length <= len(data):
                break
            parser = self.get_parser(key, 0, tag)
            msg = parser(data, offset, length)
            if key == Rerror:
                spec = json.loads(msg['ename'])
                if spec['class'] in dir(builtins):
                    cls = getattr(builtins, spec['class'])
                elif spec['class'] == 'Plan9Exit':
                    cls = Plan9Exit
                else:
                    cls = Exception
                if not spec.get('argv'):
                    spec['argv'] = [spec['str']]
                raise cls(*spec['argv'])
            offset += length
            if msg is None:
                continue
            yield msg
b IDATxytVսϓ22 A@IR :hCiZ[v*E:WũZA ^dQeQ @ !jZ'>gsV仿$|?g)&x-EIENT ;@xT.i%-X}SvS5.r/UHz^_$-W"w)Ɗ/@Z &IoX P$K}JzX:;` &, ŋui,e6mX ԵrKb1ԗ)DADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADADA݀!I*]R;I2$eZ#ORZSrr6mteffu*((Pu'v{DIߔ4^pIm'77WEEE;vƎ4-$]'RI{\I&G :IHJ DWBB=\WR޽m o$K(V9ABB.}jѢv`^?IOȅ} ڶmG}T#FJ`56$-ھ}FI&v;0(h;Б38CӧOWf!;A i:F_m9s&|q%=#wZprrrla A &P\\СC[A#! {olF} `E2}MK/vV)i{4BffV\|ۭX`b@kɶ@%i$K z5zhmX[IXZ` 'b%$r5M4º/l ԃߖxhʔ)[@=} K6IM}^5k㏷݆z ΗÿO:gdGBmyT/@+Vɶ纽z񕏵l.y޴it뭷zV0[Y^>Wsqs}\/@$(T7f.InݺiR$푔n.~?H))\ZRW'Mo~v Ov6oԃxz! S,&xm/yɞԟ?'uaSѽb,8GלKboi&3t7Y,)JJ c[nzӳdE&KsZLӄ I?@&%ӟ۶mSMMњ0iؐSZ,|J+N ~,0A0!5%Q-YQQa3}$_vVrf9f?S8`zDADADADADADADADADAdqP,تmMmg1V?rSI꒟]u|l RCyEf٢9 jURbztѰ!m5~tGj2DhG*{H9)꒟ר3:(+3\?/;TUݭʴ~S6lڧUJ*i$d(#=Yݺd{,p|3B))q:vN0Y.jkק6;SɶVzHJJЀ-utѹսk>QUU\޲~]fFnK?&ߡ5b=z9)^|u_k-[y%ZNU6 7Mi:]ۦtk[n X(e6Bb."8cۭ|~teuuw|ήI-5"~Uk;ZicEmN/:]M> cQ^uiƞ??Ңpc#TUU3UakNwA`:Y_V-8.KKfRitv޲* 9S6ֿj,ՃNOMߤ]z^fOh|<>@Å5 _/Iu?{SY4hK/2]4%it5q]GGe2%iR| W&f*^]??vq[LgE_3f}Fxu~}qd-ږFxu~I N>\;͗O֊:̗WJ@BhW=y|GgwܷH_NY?)Tdi'?խwhlmQi !SUUsw4kӺe4rfxu-[nHtMFj}H_u~w>)oV}(T'ebʒv3_[+vn@Ȭ\S}ot}w=kHFnxg S 0eޢm~l}uqZfFoZuuEg `zt~? b;t%>WTkķh[2eG8LIWx,^\thrl^Ϊ{=dž<}qV@ ⠨Wy^LF_>0UkDuʫuCs$)Iv:IK;6ֲ4{^6եm+l3>݆uM 9u?>Zc }g~qhKwڭeFMM~pМuqǿz6Tb@8@Y|jx](^]gf}M"tG -w.@vOqh~/HII`S[l.6nØXL9vUcOoB\xoǤ'T&IǍQw_wpv[kmO{w~>#=P1Pɞa-we:iǏlHo׈꒟f9SzH?+shk%Fs:qVhqY`jvO'ρ?PyX3lх]˾uV{ݞ]1,MzYNW~̈́ joYn}ȚF߾׮mS]F z+EDxm/d{F{-W-4wY듏:??_gPf ^3ecg ҵs8R2מz@TANGj)}CNi/R~}c:5{!ZHӋӾ6}T]G]7W6^n 9*,YqOZj:P?Q DFL|?-^.Ɵ7}fFh׶xe2Pscz1&5\cn[=Vn[ĶE鎀uˌd3GII k;lNmشOuuRVfBE]ۣeӶu :X-[(er4~LHi6:Ѻ@ԅrST0trk%$Č0ez" *z"T/X9|8.C5Feg}CQ%͞ˣJvL/?j^h&9xF`њZ(&yF&Iݻfg#W;3^{Wo^4'vV[[K';+mӍִ]AC@W?1^{එyh +^]fm~iԵ]AB@WTk̏t uR?l.OIHiYyԶ]Aˀ7c:q}ힽaf6Z~қm(+sK4{^6}T*UUu]n.:kx{:2 _m=sAߤU@?Z-Vކеz왍Nэ{|5 pڶn b p-@sPg]0G7fy-M{GCF'%{4`=$-Ge\ eU:m+Zt'WjO!OAF@ik&t݆ϥ_ e}=]"Wz_.͜E3leWFih|t-wZۍ-uw=6YN{6|} |*={Ѽn.S.z1zjۻTH]흾 DuDvmvK.`V]yY~sI@t?/ϓ. m&["+P?MzovVЫG3-GRR[(!!\_,^%?v@ҵő m`Y)tem8GMx.))A]Y i`ViW`?^~!S#^+ѽGZj?Vģ0.))A꨷lzL*]OXrY`DBBLOj{-MH'ii-ϰ ok7^ )쭡b]UXSְmռY|5*cֽk0B7镹%ڽP#8nȎq}mJr23_>lE5$iwui+ H~F`IjƵ@q \ @#qG0".0" l`„.0! ,AQHN6qzkKJ#o;`Xv2>,tێJJ7Z/*A .@fفjMzkg @TvZH3Zxu6Ra'%O?/dQ5xYkU]Rֽkق@DaS^RSּ5|BeHNN͘p HvcYcC5:y #`οb;z2.!kr}gUWkyZn=f Pvsn3p~;4p˚=ē~NmI] ¾ 0lH[_L hsh_ғߤc_њec)g7VIZ5yrgk̞W#IjӪv>՞y睝M8[|]\շ8M6%|@PZڨI-m>=k='aiRo-x?>Q.}`Ȏ:Wsmu u > .@,&;+!!˱tﭧDQwRW\vF\~Q7>spYw$%A~;~}6¾ g&if_=j,v+UL1(tWake:@Ș>j$Gq2t7S?vL|]u/ .(0E6Mk6hiۺzښOrifޱxm/Gx> Lal%%~{lBsR4*}{0Z/tNIɚpV^#Lf:u@k#RSu =S^ZyuR/.@n&΃z~B=0eg뺆#,Þ[B/?H uUf7y Wy}Bwegל`Wh(||`l`.;Ws?V@"c:iɍL֯PGv6zctM̠':wuW;d=;EveD}9J@B(0iհ bvP1{\P&G7D޴Iy_$-Qjm~Yrr&]CDv%bh|Yzni_ˆR;kg}nJOIIwyuL}{ЌNj}:+3Y?:WJ/N+Rzd=hb;dj͒suݔ@NKMԄ jqzC5@y°hL m;*5ezᕏ=ep XL n?מ:r`۵tŤZ|1v`V뽧_csج'ߤ%oTuumk%%%h)uy]Nk[n 'b2 l.=͜E%gf$[c;s:V-͞WߤWh-j7]4=F-X]>ZLSi[Y*We;Zan(ӇW|e(HNNP5[= r4tP &0<pc#`vTNV GFqvTi*Tyam$ߏWyE*VJKMTfFw>'$-ؽ.Ho.8c"@DADADADADADADADADA~j*֘,N;Pi3599h=goضLgiJ5փy~}&Zd9p֚ e:|hL``b/d9p? fgg+%%hMgXosج, ΩOl0Zh=xdjLmhݻoO[g_l,8a]٭+ӧ0$I]c]:粹:Teꢢ"5a^Kgh,&= =՟^߶“ߢE ܹS J}I%:8 IDAT~,9/ʃPW'Mo}zNƍ쨓zPbNZ~^z=4mswg;5 Y~SVMRXUյڱRf?s:w ;6H:ºi5-maM&O3;1IKeamZh͛7+##v+c ~u~ca]GnF'ټL~PPPbn voC4R,ӟgg %hq}@#M4IÇ Oy^xMZx ) yOw@HkN˖-Sǎmb]X@n+i͖!++K3gd\$mt$^YfJ\8PRF)77Wא!Cl$i:@@_oG I{$# 8磌ŋ91A (Im7֭>}ߴJq7ޗt^ -[ԩSj*}%]&' -ɓ'ꫯVzzvB#;a 7@GxI{j޼ƌ.LÇWBB7`O"I$/@R @eee@۷>}0,ɒ2$53Xs|cS~rpTYYY} kHc %&k.], @ADADADADADADADADA@lT<%''*Lo^={رc5h %$+CnܸQ3fҥK}vUVVs9G R,_{xˇ3o߾;TTTd}馛]uuuG~iԩ@4bnvmvfϞ /Peeeq}}za I~,誫{UWW뮻}_~YƍSMMMYχ֝waw\ďcxꩧtEƍկ_?۷5@u?1kNׯWzz/wy>}zj3 k(ٺuq_Zvf̘:~ ABQ&r|!%KҥKgԞ={<_X-z !CyFUUz~ ABQIIIjݺW$UXXDٳZ~ ABQƍecW$<(~<RSSvZujjjԧOZQu@4 8m&&&jԩg$ď1h ͟?_{768@g =@`)))5o6m3)ѣƌJ;wҿUTT /KZR{~a=@0o<*狔iFɶ[ˎ;T]]OX@?K.ۈxN pppppppppppppppppPfl߾] ,{ァk۶mڿo5BTӦMӴiӴ|r DB2e|An!Dy'tkΝ[A $***t5' "!駟oaDnΝ:t֭[gDШQ06qD;@ x M6v(PiizmZ4ew"@̴ixf [~-Fٱc&IZ2|n!?$@{[HTɏ#@hȎI# _m(F /6Z3z'\r,r!;w2Z3j=~GY7"I$iI.p_"?pN`y DD?: _  Gÿab7J !Bx@0 Bo cG@`1C[@0G @`0C_u V1 aCX>W ` | `!<S `"<. `#c`?cAC4 ?c p#~@0?:08&_MQ1J h#?/`7;I  q 7a wQ A 1 Hp !#<8/#@1Ul7=S=K.4Z?E_$i@!1!E4?`P_  @Bă10#: "aU,xbFY1 [n|n #'vEH:`xb #vD4Y hi.i&EΖv#O H4IŶ}:Ikh @tZRF#(tXҙzZ ?I3l7q@õ|ۍ1,GpuY Ꮿ@hJv#xxk$ v#9 5 }_$c S#=+"K{F*m7`#%H:NRSp6I?sIՖ{Ap$I$I:QRv2$Z @UJ*$]<FO4IENDB`