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r e.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ƒrƒJ ‚W d   ƒ n1 s�w   Y  qW d   ƒ d S 1 sžw   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ƒr…J ‚tƒ � t|dtjddƒr”J ‚W d   ƒ n1 sžw   Y  qW d   ƒ d S 1 s¯w   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�s�J ‚W d   ƒ n1 s™w   Y  tƒ � t	|d| | d�r®J ‚W d   ƒ n1 s¸w   Y  t t¡� t	|ddd� W d   ƒ n1 sÔw   Y  tƒ � t	|d	tj
ƒræJ ‚W d   ƒ n1 sðw   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 s�w   Y  t t¡� tdt  ¡ d	d
� W d   ƒ d S 1 s w   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�sƒJ ‚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


				&			
