
    h!                         S SK r S SKrS SKrS SKrS SKrS SKJr   " S S5      r " S S\5      r	 " S S\5      r
 " S S	\5      r " S
 S\5      r " S S\5      r " S S\5      r " S S5      rg)    Nc                   <    \ rS rSrSrSrSrSrSrSr	Sr
S rS rS	rg)

_criu_comm   z'
Base class for communication classes.
r         Nc                     g)z
Connect to criu and return socket object.
daemon -- is for whether or not criu should daemonize if executing criu from binary(comm_bin).
N selfdaemons     -/usr/lib/python3/dist-packages/pycriu/criu.pyconnect_criu_comm.connect   s    
 	    c                     g)z
Disconnect from criu.
Nr	   r   s    r   
disconnect_criu_comm.disconnect   s     	r   r	   )__name__
__module____qualname____firstlineno____doc__COMM_SKCOMM_FDCOMM_BIN	comm_typecommskr   r   __static_attributes__r	   r   r   r   r      s1     GGHID	Br   r   c                   *    \ rS rSrSrS rS rS rSrg)_criu_comm_sk%   z&
Communication class for unix socket.
c                 2    U R                   U l        Xl        g N)r   r   r   )r   sk_paths     r   __init___criu_comm_sk.__init__*   s    	r   c                     [         R                   " [         R                  [         R                  5      U l        U R                  R	                  U R
                  5        U R                  $ r%   )socketAF_UNIXSOCK_SEQPACKETr   r   r   r
   s     r   r   _criu_comm_sk.connect.   s;    --0E0EF		"wwr   c                 8    U R                   R                  5         g r%   r   closer   s    r   r   _criu_comm_sk.disconnect4       r   r   r   r   N	r   r   r   r   r   r'   r   r   r    r	   r   r   r"   r"   %   s    r   r"   c                   *    \ rS rSrSrS rS rS rSrg)_criu_comm_fd8   z*
Communication class for file descriptor.
c                 2    U R                   U l        Xl        g r%   )r   r   r   r   fds     r   r'   _criu_comm_fd.__init__=   s    	r   c                     [         R                  " U R                  [         R                  [         R                  5      U l        U R
                  $ r%   )r*   fromfdr   r+   r,   r   r
   s     r   r   _criu_comm_fd.connectA   s2    --		6>> & 5 57 wwr   c                 8    U R                   R                  5         g r%   r/   r   s    r   r   _criu_comm_fd.disconnectG   r2   r   r3   Nr4   r	   r   r   r6   r6   8   s    r   r6   c                   *    \ rS rSrSrS rS rS rSrg)_criu_comm_binK   z!
Communication class for binary.
c                 N    U R                   U l        Xl        S U l        S U l        g r%   )r   r   r   swrkr   )r   bin_paths     r   r'   _criu_comm_bin.__init__P   s     		r   c                   ^ ^ [         R                  " [         R                  [         R                  5      m[        R                  " TS   [        R
                  5      n[        R                  " TS   [        R                  U[        R                  -  5        [        R                  " TS   [        R
                  5      n[        R                  " TS   [        R                  U[        R                  ) -  5        UT l        [        R                  " 5       nUS:X  ae  UU 4S jnU(       aO  [        R                  " 5       nUS:X  a  [        R                  " 5         U" 5         O=[        R                  " S5        O&U" 5         OU(       a  [        R                  " US5        TS   R                  5         [        R                   " STS   R#                  S5      5      S   T l        TS   T l        T R&                  $ )Nr   r   c                    > [         R                  " S5        [         R                  " S5        [         R                  " S5        T S   R                  [        R                  " S[         R
                  " 5       5      5        [         R                  " TR                  TR                  SST S   R                  5       -  /5        [         R                  " S5        g )Nr   r   r   irE   z%d)
osr0   sendstructpackgetpidexecvr   fileno_exit)cssr   s   r   	exec_criu)_criu_comm_bin.connect.<locals>.exec_criud   s    AFKKRYY[9:))VQ023 r   rJ      )r*   
socketpairr+   r,   fcntlF_GETFDF_SETFD
FD_CLOEXECr   rK   forksetsidrR   waitpidr0   rM   unpackrecvrE   r   )r   r   flagsprT   rS   s   `    @r   r   _criu_comm_bin.connectV   sB   0E0EFCFEMM2CFEMM553C3C+CDCFEMM2CFEMM5E4D4D3D+DEGGI6	  GGI6IIKKHHQK

1a AMM#s1v{{1~6q9	a&wwr   c                     U R                   R                  5         U R                  (       d"  [        R                  " U R
                  S5        g g )Nr   )r   r0   r   rK   r^   rE   r   s    r   r   _criu_comm_bin.disconnect   s-    {{JJtyy!$ r   )r   r   r   r   rE   Nr4   r	   r   r   rB   rB   K   s    .`%r   rB   c                   &    \ rS rSrSrSrSrS rSrg)CRIUException   z7
Exception class for handling and storing criu errors.
Nc                     U R                   $ r%   )_strr   s    r   __str__CRIUException.__str__   s    yyr   r	   )	r   r   r   r   r   typrj   rk   r    r	   r   r   rg   rg      s     CDr   rg   c                       \ rS rSrSrS rSrg)CRIUExceptionInternal   z;
Exception class for handling and storing internal errors.
c                 z    Xl         [        R                  R                  U R                   5      < SU< 3U l        g )Nz failed with internal error: )rm   rpccriu_req_typeNamerj   )r   rm   ss      r   r'   CRIUExceptionInternal.__init__   s*    ""488,a1	r   )rj   rm   N)r   r   r   r   r   r'   r    r	   r   r   ro   ro      s    1r   ro   c                   $    \ rS rSrSrS rS rSrg)CRIUExceptionExternal   z;
Exception class for handling and storing criu RPC errors.
c                 R    Xl         X l        X0l        U R                  5       U l        g r%   )rm   resp_typerrno_gen_error_strrj   )r   req_typr{   r|   s       r   r'   CRIUExceptionExternal.__init__   s!     
'')	r   c                 4   [         R                  R                  U R                  5      < S3nU R                  U R                  :w  a  USU R                  4-  -  nUSU R
                  4-  -  nU R
                  [
        R                  :X  a  US-  nU R                  [         R                  :X  a#  U R
                  [
        R                  :X  a  US-  nU R                  [         R                  :X  a#  U R
                  [
        R                  :X  a  US-  nUS-  nU$ )Nz	 failed: zUnexpected response type %d: zError(%d): zBad optionszNo process with such pidz)Process with requested pid already existsUnknown)rr   rs   rt   rm   r{   r|   EBADRQCDUMPESRCHRESTOREEEXIST)r   ru   s     r   r}   $CRIUExceptionExternal._gen_error_str   s     ..33DHH=@88t}}$0DMM3DDDA	]djj^++::&A88sxxzzU[[(//88s{{"zzU\\)@@	Yr   )rj   r|   r{   rm   N)r   r   r   r   r   r'   r}   r    r	   r   r   rx   rx      s    *r   rx   c                   b    \ rS rSrSrSrSrS rS rS r	S r
S rS	 rS
 rS rS rS rS rSrg)criu   z
Call criu through RPC.
Nc                 h    U R                  S5        [        R                  " 5       U l        S U l        g )Nr   )
use_binaryrr   	criu_optsoptsr   r   s    r   r'   criu.__init__   s"    MMO	r   c                 $    [        U5      U l        g)zJ
Access criu using unix socket which that belongs to criu service daemon.
N)r"   _comm)r   sk_names     r   use_skcriu.use_sk   s     #7+
r   c                 $    [        U5      U l        g)z 
Access criu using provided fd.
N)r6   r   r9   s     r   use_fdcriu.use_fd   s     #2&
r   c                 $    [        U5      U l        g)z?
Access criu by execing it using provided path to criu binary.
N)rB   r   )r   bin_names     r   r   criu.use_binary   s     $H-
r   c           	          SnUR                   [        R                  :X  a"  UR                  R	                  S5      (       d  Sn U R
                  (       d  U R                  R                  U5      nOU R
                  nUR                  (       a  X0l        UR                  UR                  5       5        UR                  [        UR                  S[        R                  [        R                  -  5      5      5      nUR                  (       d  U R                  R!                  5         [        R"                  " 5       nUR%                  U5        U$ ! [&         a$  n[)        UR                   [+        U5      5      eSnAff = f)z1
As simple as send request and receive response.
FpidTr   N)typerr   r   r   HasFieldr   r   r   	keep_openrL   SerializeToStringr`   lenr*   	MSG_TRUNCMSG_PEEKr   	criu_respParseFromString	Exceptionro   str)r   reqr   ru   bufrespes          r   _send_req_and_recv_respcriu._send_req_and_recv_resp   s    88sxx(9(9%(@(@F	:77JJ&&v.GG}}FF3((*+&&QVVAv'7'7&//'IJKLC==

%%'==?D  %   	:'#a&99	:s   D	E 
E=E88E=c                     [         R                  " 5       n[         R                  Ul        U R	                  U5      nUR
                  (       d+  [        UR                  UR                  UR                  5      eg)z2
Checks whether the kernel support is up-to-date.
N)rr   criu_reqCHECKr   r   successrx   cr_errnor   r   r   s      r   check
criu.check  sQ     lln99++C0||'$))T]]KK r   c                 R   [         R                  " 5       n[         R                  Ul        UR                  R                  U R                  5        U R                  U5      nUR                  (       d+  [        UR                  UR                  UR                  5      eUR                  $ z3
Checkpoint a process/tree identified by opts.pid.
)rr   r   r   r   r   	MergeFromr   r   rx   r   dumpr   s      r   r   	criu.dump  sl     lln88499%++C0||'$))T]]KKyyr   c                 R   [         R                  " 5       n[         R                  Ul        UR                  R                  U R                  5        U R                  U5      nUR                  (       d+  [        UR                  UR                  UR                  5      eUR                  $ r   )rr   r   PRE_DUMPr   r   r   r   r   rx   r   r   r   s      r   pre_dumpcriu.pre_dump"  sl     lln<<499%++C0||'$))T]]KKyyr   c                 R   [         R                  " 5       n[         R                  Ul        UR                  R                  U R                  5        U R                  U5      nUR                  (       d+  [        UR                  UR                  UR                  5      eUR                  $ )z
Restore a process/tree.
)rr   r   r   r   r   r   r   r   rx   r   restorer   s      r   r   criu.restore1  sl     lln;;499%++C0||'$))T]]KK||r   c                 `   [         R                  " 5       n[         R                  Ul        UR                  R                  U R                  5        SUl        U R                  U5      nUR                  (       d+  [        UR                  UR                  UR                  5      eUR                  $ )NT)rr   r   PAGE_SERVER_CHLDr   r   r   r   r   r   rx   r   psr   s      r   page_server_chldcriu.page_server_chld@  sr    lln''499%++C0||'$))T]]KKwwr   c                    [         R                  " 5       n[         R                  Ul        Xl        U R                  U5      nUR                  (       d+  [        UR                  UR                  UR                  5      eUR                  $ r%   )
rr   r   WAIT_PIDr   r   r   r   rx   r   status)r   r   r   r   s       r   wait_pidcriu.wait_pidM  sY    lln<<++C0||'$))T]]KK{{r   )r   r   r   )r   r   r   r   r   r   r   r'   r   r   r   r   r   r   r   r   r   r   r    r	   r   r   r   r      sL     DE
,'.!F
L
r   r   )r*   r|   rX   rK   rM   pycriu.rpc_pb2rpc_pb2rr   r   r"   r6   rB   r   rg   ro   rx   r   r	   r   r   <module>r      sy       	   2J &J &>%Z >%BI 1M 1 M  FR Rr   