o
    X(                     @   sX  d dl Z d dlZd dlZd dlZd dlZd dlZd dlmZmZm	Z	m
Z
mZmZmZmZmZmZmZmZmZmZmZ d dlZejdd Zejdd Zdd Zd	d
 Zdd Zdd Zdd Zdd Zdd Z dd Z!dd Z"dd Z#dd Z$dd Z%dd  Z&d!d" Z'd#d$ Z(d%d& Z)d'd( Z*d)d* Z+d+d, Z,e j-d-kre.Z/ne0Z/d.d/ Z1d0d1 Z2dS )2    N)bootedis_fifo_is_fifo	is_socket
_is_socketis_socket_inet_is_socket_inetis_socket_unix_is_socket_unixis_socket_sockaddr_is_socket_sockaddris_mq_is_mq
listen_fdsnotifyc               
   c   s>    zd V  W d S  t y }  z| jtjkrt   d } ~ ww N)OSErrorerrnoENOSYSpytestskip)e r   :/usr/lib/python3/dist-packages/systemd/test/test_daemon.pyskip_enosys   s   r   c                 c   sL    t | }z|V  W |d   |d   d S |d   |d   w )Nr      )socket
socketpairclose)familypairr   r   r   closing_socketpair   s   
r!   c                   C   s,   t jdrt sJ d S t dv sJ d S )Nz/run/systemd/system>   FT)ospathexistsr   r   r   r   r   test_booted&   s   r%   c                 C   sJ   |  dj}t| t|tjtjB }t|d sJ t||s#J d S )N	test.fifo)	joinstrpathposixmkfifor"   openO_RDONLY
O_NONBLOCKr   )tmpdirr#   fdr   r   r   test__is_fifo.   s
   
r0   c                 C   sN   |  d}|d |j}t|tjtjB }t|d rJ t||r%J d S )Nr&   boo)r'   writer(   r"   r+   r,   r-   r   r.   filer#   r/   r   r   r   test__is_fifo_file6   s   

r5   c                 C      |  dj}tt tdd rJ W d    n1 sw   Y  tt td|r/J W d    d S 1 s:w   Y  d S Nr&   )r'   r(   r   raisesr   r   r.   r#   r   r   r   test__is_fifo_bad_fd?      "r;   c                 C   sr   |  dj}t| t|tjtjB }t|d}t	|d s"J t	||s)J t	|d s0J t	||s7J d S )Nr&   r)
r'   r(   r)   r*   r"   r+   r,   r-   fdopenr   )r.   r#   r/   r4   r   r   r   test_is_fifoH   s   
r?   c                 C   sv   |  d}|d |j}t|tjtjB }t|d}t|d r$J t||r+J t|d r2J t||r9J d S )Nr&   r1   r=   )	r'   r2   r(   r"   r+   r,   r-   r>   r   r3   r   r   r   test_is_fifo_fileS   s   

r@   c                 C   r6   r7   )r'   r(   r   r9   r   r   r:   r   r   r   test_is_fifo_bad_fd_   r<   rA   c              
   C   B   zt | W S  ty  } z|jtjksJ W Y d }~dS d }~ww NF)r   r   r   EBADFargerrorr   r   r   is_mq_wrapperh      
rH   c              
   C   rB   rC   )r   r   r   rD   rE   r   r   r   _is_mq_wrapperp   rI   rJ   c               
   C   sJ  t tj} | D ]}t|rJ t|rJ t|rJ t  t|dr'J W d    n1 s1w   Y  | }t|r@J t|rFJ t|rLJ t  t|drWJ W d    n1 saw   Y  t	|rlJ t
|rrJ t|rxJ t  t|drJ W d    n1 sw   Y  qW d    d S 1 sw   Y  d S )Nz127.0.0.1:2000)r!   r   AF_UNIXr   rH   r   r   r   filenor   rJ   r   r   r    sockr/   r   r   r   test_no_mismatchx   s0   "rO   c                  C   sl  t tj} | D ]}|| fD ]J}t|sJ t|tjs J t|tjr(J t|tjtjs2J t|tjtjr<J t  t	|dtjddrKJ W d    n1 sUw   Y  qt
|saJ t
|tjsiJ t
|tjrqJ t
|tjtjs{J t
|tjtjrJ t  t|dtjddrJ W d    n1 sw   Y  qW d    d S 1 sw   Y  d S )Nz8.8.8.8:2000r   )r!   r   rK   rL   r   AF_INETSOCK_STREAM
SOCK_DGRAMr   r   r   r   r    rN   rF   r   r   r   test_is_socket   s.   "rT   c                  C   s  t ttjq} | d |  \}}d|}dD ]T}| |  fD ]}t  t	|dtj
s5J W d    n1 s?w   Y  t  t	|d| tj
sSJ W d    n1 s]w   Y  t  t	|d| |dsqJ W d    n1 s{w   Y  t  t	|d| ddsJ W d    n1 sw   Y  t  t	|d| | drJ W d    n1 sw   Y  tt t	|ddd W d    n1 sw   Y  t  t	|d	tj
rJ W d    n1 sw   Y  t  t	|dtjrJ W d    n	1 sw   Y  q&tt t|dd
d W d    n	1 s,w   Y  t  t|d	tj
r?J W d    n	1 sJw   Y  t  t|dtjr]J W d    n	1 shw   Y  | d qW d    d S 1 sw   Y  d S )N)	127.0.0.1r   z:{})r   r   rU   )	listeningr8   i@ )flowinfoz129.168.11.11:23r      )
contextlibclosingr   rP   bindgetsocknameformatrL   r   r   rQ   r   r9   
ValueErrorrR   r   listen)rN   addrportrV   rF   r   r   r   test_is_socket_sockaddr   sV   


$rb   c                  C   s   t tjf} | D ]Z}| }t|sJ t|tjsJ t|tjr$J t|tjtjs.J t|tjtjr8J t|s>J t|tjsFJ t|tjrNJ t|tjtjsXJ t|tjtjrbJ qW d    d S 1 snw   Y  d S r   )r!   r   rK   rL   r   rP   rQ   rR   rM   r   r   r   test__is_socket   s   "rc   c                  C   s   t tj5} | D ])}|| fD ] }t|sJ t|ddr J t|tjs(J t|tjr0J qqW d    d S 1 s=w   Y  d S )N/no/such/path)r#   )r!   r   rK   rL   r	   rQ   rR   rS   r   r   r   test_is_socket_unix   s   "re   c                  C   s   t tj1} | D ]%}| }t|sJ t|dddrJ t|tjs%J t|tjr-J qW d    d S 1 s9w   Y  d S )Nr   r8   rd   )r!   r   rK   rL   r
   rQ   rR   rM   r   r   r   test__is_socket_unix   s   "rf   c                   C   sF   t d t d t g ksJ tdg ksJ tdg ks!J d S )N
LISTEN_FDS
LISTEN_PIDTF)r"   unsetenvr   r   r   r   r   test_listen_fds_no_fds   s
   

rj   c                   C   sV   dt jd< tt  t jd< tdg dksJ tdg dks"J t g ks)J d S )N3rg   rh   F)         Tr"   environstrgetpidr   r   r   r   r   test_listen_fds   s
   
rs   c                   C   sP   dt jd< tt  t jd< tddgksJ t dgksJ t g ks&J d S )N1rg   rh   Frl   ro   r   r   r   r   test_listen_fds_default_unset   s
   
ru   c                   C   s   t ddu sJ t  t dg ddu sJ W d    n1 s w   Y  t dddgddu s1J t dt ddu s=J t dt dd	du sJJ d S )
NREADY=1F	FDSTORE=1fdsr      pidr   r|   ry   )r   r   r"   rr   r   r   r   r   test_notify_no_socket  s   r   )rl   c                	   C   sN  dt jd< tt td W d    n1 sw   Y  tt! t  tdg d W d    n1 s8w   Y  W d    n1 sGw   Y  tt tdddgd W d    n1 sdw   Y  tt tdt  d W d    n1 sw   Y  tt tdt  d	d
 W d    d S 1 sw   Y  d S )Nz	/dev/nullNOTIFY_SOCKETrv   rw   rx   r   rz   r{   r}   r~   )r"   rp   r   r9   connection_errorr   r   rr   r   r   r   r   test_notify_bad_socket  s&   

"r   c              
   C   s
  |  dj}ttjtj}z|| W n tjy/ } ztd|  W Y d }~nd }~ww t	tdd}|
tj|d |tjd< tdsIJ t  tdg d	sUJ W d    n1 s_w   Y  tddd
gd	snJ tdt dsxJ tdt ddsJ d S )Nr   zfailed to bind socket (%s)SO_PASSCRED   r   r   rv   rw   rx   rz   r{   r}   r~   )r'   r(   r   rK   rR   r[   rG   r   xfailgetattr
setsockopt
SOL_SOCKETr"   rp   r   r   rr   )r.   r#   rN   r   r   r   r   r   test_notify_with_socket  s$   
r   )3sysr"   r)   r   rY   r   systemd.daemonr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   contextmanagerr   r!   r%   r0   r5   r;   r?   r@   rA   rH   rJ   rO   rT   rb   rc   re   rf   rj   rs   ru   r   version_infoConnectionRefusedErrorr   r   r   r   r   r   r   r   <module>   sH    D


				&			
