• [^] # Re: Prochaine étape...

    Posté par . En réponse au sondage Que pensez vous de l'autorisation des noms de domaine accentués et autres caractères non-ascii ?. Évalué à 10.

    C'est pas bien compliqué à faire …

    #include <nss.h>
    #include <netdb.h>
    #include <errno.h>
    /*
     * gcc -fPIC -shared -o libnss_roman.so.2 -Wl,-soname,libnss_roman.so.2 __FILE__
     * Rushed crappy code. DO NOT RUN THIS SHIT ON PRODUCTION SYSTEMS!
     */
    enum nss_status _nss_roman_sethostent(int a) { return NSS_STATUS_SUCCESS; }
    enum nss_status _nss_roman_endhostent(void) { return NSS_STATUS_SUCCESS; }
    enum nss_status _nss_roman_notfound(int* __restrict perr, int* __restrict er) {
     *perr = ENOENT; *er = HOST_NOT_FOUND; return NSS_STATUS_NOTFOUND;
    }
    enum nss_status _nss_roman_gethostbyaddr_r(const void* __restrict a,
     size_t l, int t, struct hostent* __restrict result,
     char* __restrict b, size_t blen, int* __restrict perrno,
     int* __restrict err) {
     return _nss_roman_notfound(perrno, err);
    }
    struct buf_use { struct in_addr addr; char* addr_list[2]; };
    enum nss_status _nss_roman_gethostbyname2_r(const char* __restrict name,
     int af, struct hostent* __restrict r, char* __restrict buff,
     size_t buflen, int* __restrict perrno, int *__restrict err) {
     if (af != AF_INET && af != AF_UNSPEC)
     return _nss_roman_notfound(perrno, err);
     if (buflen < sizeof (struct buf_use)) {
     *perrno = ERANGE;
     *err = NO_RECOVERY;
     return NSS_STATUS_TRYAGAIN;
     }
     struct buf_use * buf = (void*)buff;
     r->h_addrtype = AF_INET;
     r->h_name = "";
     r->h_length = sizeof (struct in_addr);
     r->h_addr_list = buf->addr_list;
     r->h_addr_list[0] = (void*)&buf->addr;
     r->h_addr_list[1] = 0;
     r->h_aliases = &r->h_addr_list[1];
     buf->addr.s_addr = 0;
     unsigned current_octet = 3;
     unsigned value = 0;
     while (*name) {
     unsigned letter_value = 0;
     switch (*name++) {
     case 'I': letter_value = 1; break;
     case 'V': letter_value = 5; break;
     case 'X': letter_value = 10; break;
     case 'L': letter_value = 50; break;
     case 'C': letter_value = 100; break;
     case '.':
     if (current_octet == 0 || value > 255)
     return _nss_roman_notfound(perrno, err);
     buf->addr.s_addr |= (value << (current_octet * 8));
     value = 0;
     --current_octet;
     continue;
     default:
     return _nss_roman_notfound(perrno, err);
     }
     value += letter_value - 2 * (value % letter_value);
     }
     if (current_octet != 0 || value > 255)
     return _nss_roman_notfound(perrno, err);
     buf->addr.s_addr = htonl(buf->addr.s_addr + value);
     return NSS_STATUS_SUCCESS;
    }
    enum nss_status _nss_roman_gethostbyname_r(const char* __restrict n,
     struct hostent* __restrict r, char* __restrict buf, size_t len,
     int *__restrict erno, int* __restrict er) {
     return _nss_roman_gethostbyname2_r(n, AF_INET, r, buf, len, erno, er);
    }
    
    
    $ping -c 1 CXXIIIX...I
    PING (127.0.0.1) 56(84) bytes of data.
    64 bytes from localhost (127.0.0.1): icmp_req=1 ttl=64 time=0.053 ms
    --- ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 0.053/0.053/0.053/0.000 ms
    $ ping -c 1 CVIIIC.CLXIIX..I
    PING (192.168.0.1) 56(84) bytes of data.
    64 bytes from 192.168.0.1: icmp_req=1 ttl=64 time=8.70 ms
    --- ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 8.702/8.702/8.702/0.000 ms
    $ ping -c 1 XIIC.CIXC.CCL.CLXXVI
    PING (88.191.250.176) 56(84) bytes of data.
    64 bytes from prod.linuxfr.org (88.191.250.176): icmp_req=1 ttl=56 time=7.29 ms
    --- ping statistics ---
    1 packets transmitted, 1 received, 0% packet loss, time 0ms
    rtt min/avg/max/mdev = 7.290/7.290/7.290/0.000 ms
    
    

    Bizarrement, Firefox et chromium n'aime pas vraiment mes bidouillages… Il y a ptet d'autres trucs à implémenter, ou il faudrait peut être qu'ils arrêtent de transformer le nom d'hôte en minuscule.