iVcI@sdZddlmZmZmZmZmZmZmZm Z m Z m Z m Z m Z mZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZmZddl m!Z!m"Z"m#Z#ddl$Z$ddl%Z%ddl&Z&ddl'Z'ddl(Z(ddl)Z)ddl*Z*ye$j+ddde,j$Z-Wn6yddl.Z/e/j0j$Z-WqdZ-qXnXe1d \Z2ie-d e26Z3d Z4d Z5e5Z6ed de,Z7e&j8dd Z9ee7j:_;ege7j<_=de7j<_;e e ege7j?_=eee ge7j@_=de9dkrRdndZAeBe7eAZCdZDdefdYZEdefdYZFdefdYZGe eeGge7jH_=e e7jH_;dZHe eeFdge7jI_=e e7jI_;dZIdZJdZKd efd!YZLd"ZMd#efd$YZNd%efd&YZOd'ZPd(d)ZQd*ZRd+ZSd,ZTeUd-ZVd.ZWd/ZXd0efd1YZYd2efd3YZZd4efd5YZ[ed6de,Z\e eee[ge\j]_=d7Z^d8Z_d9efd:YZ`d;efd<YZad=efd>YZbd?e`dfd@efdAefdBefdCefdDefdEe fdFeebfdGeebfg eb_cdHZddIefdJYZed ZfyedKde,Zgeeeee ee`e gegjh_=eeeegegji_=eeee eeeeeegegjj_=Wnekk rdZgnXdLZledMde,Zmeemjn_;e e gemjn_=e emjo_;egemjo_=ee eeZpee e e eepgemjq_=e eegemjr_=e emjr_;egemjs_=e emjs_;egemjt_=demjt_;d Zud ZvdZwdZxdNZydOZrdPZsdQZtdddRZndSZodTZqdUZzee eeeZ{eemj|_;demj|_=eemj}_;e e gemj}_=demj~_;egemj~_=demj_;egemj_=eemj_;egemj_=egemj_=egemj_=e emj_;egemj_=eemj_;eegemj_=ee e ee{gemj_=eee egemj_=eee eeegemj_=dVefdWYZeeeZe eegemj_=egemj_=demj_;ee gemj_=egemj_=eemj_;egemj_=e emj_;egemj_=e emj_;egemj_=eemj_;d ZdZdXZdYZdZZdZed BZedBZedXBZed\BZed]BZeeBeBZid^d6d_d`6dadN6dbdc6ddde6dfdg6dhdi6Zd ZdZdXZd`ZdZdjZd ZdkZdlZ|dmednZ}doZdpZdqZddrZddsZdtZ~duZdvZddwZdxZdyZdzZd{Zd|Zd}Zd~ZdZdZdZdZdZdZdme,dZdZdZdZdZe,dZdadmdZedde,Ze ee egej_=ee egej_=egej_=ee gej_=e ej_;dddZddZdZdZdZdZdZdZe e ege7j_=e e7j_;dadZdadZdadZdadZdZedde,Ze gej_=eej_;e e gej_=e ej_;dej_=e ej_;e gej_=e ej_;defdYZdZddZd Zedde,Zeej_;egej_=dej_;egej_=e ej_;eej_;ee e gej_=egej_=dej_;ee eeZeeegej_=egej_=e ej_;egej_=e e gej_=eej_;ee gej_=dej_;egej_=ee e gej_=ee e e ee gej_=ee e gej_=ee e e ee e e e gej_=d ZdZdXZd\Zd ZdHZd ZdZdXZd\Ze1d\IZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ Z Z Z Z ZZZZZZZZZZZZZZZZZZZ Z!Z"Z#Z$Z%Z&Z'Z(Z)Z*Z+Z,Z-Z.Z/Z0Z1Z2e1d\Z3Z4Z5Z6Z7Z8Z9Z:Z;Z<Z=Z>Z?Z@ZAZBZCZDZEZFZGdZdZedZdZdZdZdZdZdZdZeUdZdZeUdZHdZdZIdZJdZKdZLeLZMdeLee ZNeLeNee ZOePdd\>ZQeQd BZReQdBZSeQdBZTeQdXBZUeQdBZVeQdBZWeQdBZXeQd\BZYeQdBZZeQdBZ[eQd BZ\dXZ]d\Z^da_defdYZ`defdYZadZbdZcdZddZedZfdZgdZhdZidZjdZkdZldZmdZndZodZpdZqdZrdZsdZtdZudZvewevd Zxd Zyd ZzePdd>ePdd >BePdd\>BdBZ{defdYZ|dZ}dZ~dZedBZdefdYZdZege7j<_=de7j<_;e e eege7j_=ee7j_;dZd ZdZdZddddddddddddddddddddddddddddddddddddddddd d d d d ddddddddddddddddg=ZdS( s/Solaris-specific library wrappers and functionsi(tCDLLtc_void_ptc_ulongt c_ulonglongtc_chartcastt Structuretpointertc_intt get_errnotc_char_ptc_uinttbyreftsizeoftc_ushorttmemmovetcreate_string_bufferRtc_uint32t CFUNCTYPEtc_uint64tc_longtc_ubytetc_bytetPOINTERtc_int32tc_int64tUniontc_shortt addressoft set_errno(t#BootmgmtMalformedPropertyValueErrort"BootmgmtMalformedPropertyNameErrortBootmgmtNotSupportedErrorNtSUNW_OST_OSLIBs/usr/lib/localetfallbackcCs|S(N((tx((s../../common/bootmgmt/pysol.pyt#sislibzfs initialization failureiislibc.sot use_errnoiitstatvfst32t64tcCsJi}x=g|jD]\}}|^qD]}t||||RF( R_trootR!tpropvalRRt stringvaluet stringlenR?((s../../common/bootmgmt/pysol.pyR^s4           cCsItj||||}|dkrEtttjtn|S(s i(Rtdi_prom_prop_lookup_bytesRMR RNRO(tphdltnodehdlR_tcharppR((s../../common/bootmgmt/pysol.pyRgs !cCstj|}t|S(s (Rt di_child_nodeR(R:R((s../../common/bootmgmt/pysol.pyRkscCstj|}t|S(s (Rtdi_sibling_nodeR(R:R((s../../common/bootmgmt/pysol.pyRlscCstj|}|S(s (Rt di_node_name(R:R((s../../common/bootmgmt/pysol.pyRmscCstj|}|S(s (Rt di_bus_addr(R:R((s../../common/bootmgmt/pysol.pyRnscCs?t|}x,|r:|t|kr+|St|}qWdS(s N(RkRmRlR(R:R_tchild((s../../common/bootmgmt/pysol.pyt_di_locate_child$s   c Cs*tdt}t}d}|jd}|}d}d}zyx/|D]'} | dkrdqLnt|| }qLWtt}t|||t |}|dkrt|} | j t |t j }| j|}nd}Wntk r} d}nXWdt|t|X||fS(s R3R)iiN(R4RaR2RRRpRRRgR t from_addressRRRtfrom_buffer_copyRMRGRF( R_RcR!RhRdtprop_componentsR:RRt componenttRSBAR?((s../../common/bootmgmt/pysol.pytdi_find_prom_prop/s2        cCs)t||\}}|dkr%tStS(Ni(RvR[RZ(R_RcRR((s../../common/bootmgmt/pysol.pytdi_find_prom_prop_boolPscCs>t||\}}|dkr%dStt|jdS(Nit(RvRtstrt bytearraytrstrip(R_RcRR((s../../common/bootmgmt/pysol.pytdi_find_prom_prop_stringUs cCsU|jddkrtS|jd}x&|d D]}|ddkr3tSq3WtS(NR3it@(tfindR[RRZ(Rrt split_pathtelement((s../../common/bootmgmt/pysol.pyt di_uap_path\scCst|tr|g}ntdkr.dSg}x|D]}|ddkrrt|}|dkrxq;qxn|}yt|}|sw;nWn+tk r}|jtjkrq;qnXt ||}|sq;n|j |q;Wt ||S(NiR3( Rt basestringtprom_get_versionRtprom_alias_to_devtprom_path_to_devfs_pathRMR=tEINVALtdi_process_minor_nameRKtdi_devfs_phys_to_logical(tdisklistt default_roottoptimizetpathlisttdiskt prom_patht devfs_pathtioerr((s../../common/bootmgmt/pysol.pyt(di_prom_disklist_to_devfs_logical_tupleshs.        ccsgt|}zIt|}x6|dk rStjj||}|Vt|}qWWdt|XdS(sReturn a generator that yields directory entries from devfs in a way that avoids inducing device attaches. THIS IS A PRIVATE UNSTABLE ORACLE INTERFACE. N(RRRRNRrRUR(RrRtentrytfullpath((s../../common/bootmgmt/pysol.pytlistdevs  cCsg}td}z`t|}xM|dk rp|dkratjjd|}|j|nt|}q$WWdt|X|S(sReturn a list of files/directories under /dev that has been scrubbed of any troublemakers. THIS IS A PRIVATE UNSTABLE ORACLE INTERFACE. s/devtfdtptsttermtlofitrlofitvttzvoltzconstusbtnettmdtcfgtchassistcputcuatdtracetipnettkzt infinibandsremovable-mediat hotpluggableN(sfdRRRRRRRRRRRRRRRRRRsremovable-mediaR(RRRRNRrRURKR(ttoplevel_pathsRRR((s../../common/bootmgmt/pysol.pytlistdev_toplevels    c Csytj|}Wntk r)}tSXtj|jrtj|}|jtj rrtj j |}n!tj j tj j ||}|j |n/tj|jr||kr|j |tStS(sIInvoke lstat on the path argument passed in, and if path is a symlink, determines the link target, converts it to a canonical path, and stores it to linklist[0]. If path is a directory, it is appended to newdirlist iff it's not in the visited list. Returns True if path is a directory, and False otherwise. (RNtlstattOSErrorRZtstattS_ISLNKR;treadlinkt startswithtsepRrtabspathRURKtS_ISDIRR[( tdirRrt newdirlisttvisitedtlinklistRQtoserrt link_targettreal_link_fullpath((s../../common/bootmgmt/pysol.pyt lstat_and_adds ! ccst}g}g}x|rg}x|D]}ttjj|||||tkraq+n|j|x]t|D]O}tjj||}t||||||r|d|fVng}q{Wq+W|}qWdS(s[Returns a generator that produces tuples of the form: (link-target, /dev-pathname) iN( RRRNRrtdirnameRZRKRRU(tdirlistRRRtpathitemR#Rr((s../../common/bootmgmt/pysol.pytfindalldevlinkss"    c Csi}xtD]\}}|jd}|dkr=qn||td}y|j|}Wntk rzqnX|j|g}|j||||dSxD|dkrt|d}|rr||krrdSt||}qAWdS(NiiiR(RERGRL(R@tnodenametchild_idR((s../../common/bootmgmt/pysol.pyt_prom_find_node_commonys  cCs t|dS(Ntaliases(RO(R@((s../../common/bootmgmt/pysol.pytprom_find_aliases_nodescCs?td-}t|ddkr(dSt||SWdQXdS(NRtchoseni(R9RORRL(R_R@((s../../common/bootmgmt/pysol.pytprom_get_chosen_propscCsm|jddks+t|tdkr/dS|jdd}t|dkrb|\}}n d}|}td}t|dkrdSxtddD]u}t||}|sPn|ddkrPn|dkr|jdd}t|dkr|\}}qqqWWdQX|ri|j d}|dkrX|| d|}qi|d|}n|S( NR3iiRiRii ( R~Rt MAXNAMELENRRR9RQtxrangeRLR(taliast alias_splitt alias_defRXR@ROtrindex((s../../common/bootmgmt/pysol.pyRs4+  c Csntdt}|}|}td|jd}x|D]}|jd}|dkry|| }||d}nd}|jd}|dkr|| }||d} n |}d} t|}x|rOt|} |r|| krt|}qnt|} | r.| r.| | kr.Pn| r@| r@Pnt|}qWq=Wt |} t || S(NR3cSst|dkS(Ni(R(R#((s../../common/bootmgmt/pysol.pyR$sRiiR)R}( R4RatfilterRR~RkRmRlRnR8RF( RR!R:RoRtelemRt argumentsRtaddrtnnametbaddrtpth((s../../common/bootmgmt/pysol.pytdi_uap_to_devfss>            c Cst|tks"|ddkr&dS|jddkrTt|}|rT|Snt}t|_||j_ t d_}t j |j tt|}|dkrtttjtn|jj SWdQXdS(NiR3s/@iR(Rt MAXPATHLENRR~RaR4R3R5R6RR9RKR;R<tOPROMPROM2DEVNAMERRMR RNRO(RRR?R@R((s../../common/bootmgmt/pysol.pyRs"    ! !c Cs7t|tks"|ddkr&dSt}t|_||j_td}t j |j t t |}|dkrtttjtn|j}d}t|j}g}xa|dkr(t||j}|t|d7}|t|d8}|r|j|qqW|SWdQXdS(NiR3Ri(RRbRR4R3R5R6RR9RKR;R<tOPROMDEV2PROMNAMERRMR RNRORR RRK( RR?R@RtsizeRtptrt prompathsRr((s../../common/bootmgmt/pysol.pytprom_devfs_to_prom_pathss("   ! ! c Cst}t|_t|tkr1|dt!n||j_tdK}tj |j t t |}|dkr|jdkrdS|SWdQXtttjtdS(NiR(R4R3R5RtPROM_MAXNAMESIZER6RR9RKR;R<t OPROMGETOPTRRRMR RNRO(toptnameR?R@R((s../../common/bootmgmt/pysol.pytprom_getoptions   !  cCs*|jd}|dkr|S|d|!S(NRxii(R~(tcstrtlength((s../../common/bootmgmt/pysol.pyt_pysol_cstring0sc CsZt}t|}t|}t|tksEt|tkrZttjdnt|}t|}||d|_t t t |j t j tjj}tj|t||dtj|j |dt||dtdU}tj|jtt |} | dkrPtttjtnWdQX|S(NsProperty name or value too longiisr+i(R4RoRRiR3RMR=tE2BIGR5RRRR6RR2RRRKtmemcpyR R9R;R<t OPROMSETOPTR RNRO( RktoptvalueR?R_t propvaluet propname_lent propvalue_lentpropbufR@R((s../../common/bootmgmt/pysol.pytprom_setoption5s&      ! 'c cst}t}tdh}x^trt|_tj|jtt |}|dkrt t t j t n|jdkrPnt|_|jj}t|tkr|dt!n||j_tj|jtt |}|dkr|jdkrDPqDn-|dkrDt t t j t n|jdkrg|jjdfVq$|jj|jjfVq$WWdQXdS(NRi(R4R9R[RHR5RKR;R<t OPROMNXTOPTRRMR RNROR3R6RRRiRjR(R?tgetprop_promioR@RR_((s../../common/bootmgmt/pysol.pytprom_nextoptionVs0    ! !     !cCs'yt|SWntk r"dSXdS(N(RlRMR(topt((s../../common/bootmgmt/pysol.pyt__prom_getoption_noexception}s cCstd}|dk r.|jjdkr.dStd}|dk r\|jjdkr\dSdddg}x0|D](}t|}|dk rr|jjSqrWdS(s sdiagnostic-mode?ttrues diag-switch?s boot-devicetbootdevs boot-fromN(R}RR6R(R?tpromvarstpromvar((s../../common/bootmgmt/pysol.pyt__get_boot_dev_vars     cCst}|dkrdSg}i}xa|jdD]P}|}|jdsxt|}|rx|}|||tOBP_NO_ALIAS_NODER:R2R4R9RRCRERGRLRORQRSRRaRRhRlRoRxR{R}RRtWANBOOT_HMAC_SHA1_KEY_NAMERRRtWANBOOT_MAXBLOCKLENRRRRtDKIOCRRRRRRRt__all__(((s../../common/bootmgmt/pysol.pytsb           @     /        >   %             ,                                          (     !    "      E                        KK                               "   & -     ! '   0 '