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errnoZ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      )socketZ
socketpairclose)Z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
   
r-   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   

r2   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?      "r8   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,   r1   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#   r.   r:   )	r$   r/   r%   r   r(   r)   r*   r;   r   r0   r   r   r   test_is_fifo_fileS   s   

r=   c                 C   r3   r4   )r$   r%   r   r6   r   r   r7   r   r   r   test_is_fifo_bad_fd_   r9   r>   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      
rE   c              
   C   r?   r@   )r   r   r   rA   rB   r   r   r   _is_mq_wrapperp   rF   rG   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   rE   r   r   r   filenor   rG   r   r   r   sockr,   r   r   r   test_no_mismatchx   s0   "rL   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   rH   rI   r   AF_INETSOCK_STREAM
SOCK_DGRAMr   r   r   r   r   rK   rC   r   r   r   test_is_socket   s.   "rQ   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   rR   )	listeningr5   i@ )Zflowinfoz129.168.11.11:23r      )
contextlibclosingr   rM   bindZgetsocknameformatrI   r   r   rN   r   r6   
ValueErrorrO   r   Zlisten)rK   ZaddrZportrS   rC   r   r   r   test_is_socket_sockaddr   sV   


$rZ   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   rH   rI   r   rM   rN   rO   rJ   r   r   r   test__is_socket   s   "r[   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   rH   rI   r	   rN   rO   rP   r   r   r   test_is_socket_unix   s   "r]   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   r5   r\   )r   r   rH   rI   r
   rN   rO   rJ   r   r   r   test__is_socket_unix   s   "r^   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
   

rb   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3r_   r`   F)         Tr   environstrgetpidr   r   r   r   r   test_listen_fds   s
   
rk   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1r_   r`   Frd   rg   r   r   r   r   test_listen_fds_default_unset   s
   
rm   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   rt   rq   )r   r   r   rj   r   r   r   r   test_notify_no_socket  s   rw   )rd   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_SOCKETrn   ro   rp   r   rr   rs   ru   rv   )r   rh   r   r6   connection_errorr   r   rj   r   r   r   r   test_notify_bad_socket  s&   

"rz   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   rx   rn   ro   rp   rr   rs   ru   rv   )r$   r%   r   rH   rO   rW   rD   r   ZxfailgetattrZ
setsockoptZ
SOL_SOCKETr   rh   r   r   rj   )r+   r    rK   r   r{   r   r   r   test_notify_with_socket  s$   
r~   )3sysr   r&   r   rU   r   Zsystemd.daemonr   r   r   r   r   r   r   r	   r
   r   r   r   r   r   r   r   contextmanagerr   r   r"   r-   r2   r8   r<   r=   r>   rE   rG   rL   rQ   rZ   r[   r]   r^   rb   rk   rm   rw   version_infoConnectionRefusedErrorry   r   rz   r~   r   r   r   r   <module>   sH    D


				&			
