unix4fun

Aller au contenu | Aller au menu | Aller à la recherche

lundi 12 avril 2010

C'est dans les vieux pots...

Suite à la mise à disponibilité de RE2, je suis tombé sur un article de Russ Cox qui explique en quoi l'algorithme de matching de Ken Thompson (Thompson NFA, pour Non Deterministic Algorithm) poutrait grave sa mère pour la reconnaissance de certaines grammaires (face à PCRE ou Perl), avec moins de 500 lignes de C. C'est intéressant. On a même droit à une implémentation (assez basique) en C. Yummy.

o l'article

vendredi 6 novembre 2009

meme vieux on continue d'apprendre

Je rentre dans ma 65 eme annee et je continue encore d'apprendre de nouvelles choses.. Au cours d'une discussion avec un pote sur "l'intrawebz" (tm) j'ai appris l'existence des register_printf_functions.. comme decrit dans les liens suivants:

Et au passage qqqes docs sur les attributes GCC et des ptits examples:

Edit de poz:

  • on note au passage que dans le premier lien, l'auteur ne sait pas comment virer un warning gênant à la compilation (dû à -Wformat, lui-même inclu dans -Wall) ; pour s'en débarrasser, il suffit de passer l'option -Wno-format à gcc. Ceci dit, il faut faire attention, parce qu'il ne râlera plus quand vous utiliserez le mauvais /specifier/ (genre %s au lieu de %zu), donc méfiance...
  • bon alors bien sûr c'est quand on migre son code que la merde arrive par tombereaux entiers :). Alors, register_printf_function() est deprecated à partir de glibc 2.10, il faut donc utiliser register_printf_specifier() à la place. Un coup de #if __GLIBC_PREREQ(2,10) sous linux devrait faire l'affaire... je mets au conditionnel parce que chez moi le printf() segfault :)

mercredi 30 septembre 2009

TCP/IP for dummies

Je ne sais pas pour vous, mais le réseau, je trouve ça assez intéressant. Comment fonctionnent les protocoles, leurs implémentations, etc. Alors voici un petit lien, présentant une implémentation de TCP/IP très légère, mais assez intéressante d'un point de vue didactique. Il s'agit de lwIP (light-weight IP), une stack TCP/IP ne faisant pas de copie de buffer afin de ne pas perdre trop en performances (mais avec une abstraction manquante, car chaque layer peut taper dans la couche sous-jacente), et où les principaux comportements attendus sont implémentés : silly window avoidance, demultiplexage, contrôle de checksum, retransmission rapide, calcul de RTT, contrôle de congestion, etc. La pile propose même une API BSD compliant :) Bon, il s'agit d'un PoC d'universitaire, hein, c'est pas ça qui va remplacer les piles des OS, mais encore une fois, ça se comprend vite et bien.

Ah, oui, le code (C, oeuf corse) tient en moins de 2600 lignes, et le code objet produit pèse 13.5 KiB.

PS : Dernière chose, il n'y a pas de support IPv6. Haaan, la grosse honte.

mercredi 26 août 2009

Des états de branche dans ta couverture GCC

Ce billet:

  • parle en bien de sqlite
  • explique la différence entre un programme sure et fiable
  • digère la page d'explication de test de sqlite, a lire pour les passionés de TDD
  • explique les branches et les états de ton code et comment utiliser GCC pour évaluer le taux de couverture

Bref une bonne petite leçon d'analyse de code pour testage efficace.

Source

mercredi 12 août 2009

Une petite piqûre d'hér... de rappel.

Bon ben je sais pas pour vous, mais j'ai toujours fait des trucs moches genre :


void
sighandler_foo(int nsig)
{
   printf("Signal %d caught.  Exiting.\n", nsig);
   exit(EXIT_SUCCESS);
}

J'ai schématisé, mais l'idée est là. Bah en fait faut surtout pas écrire cette horreur. Là, normalement vous me pointez du doigt en riant très fort, et je deviens rouge de honte. Mais j'ai vaincu ma peur du ridicule, et je le clame : oui ! je suis une bille !

Sinon, pour ceux qui ne savent pas, en fait j'ai appris ça en lisant un post de Solar Designer sur nmap-dev, qui expliquait par le menu pourquoi c'est super crappy :

Après avoir vérifié, rien de tout ça n'est écrit dans signal(2) sur ma machine (Linux), mais c'est très clair dans le man OpenBSD, en revanche.

HTH.

samedi 30 mai 2009

Intel rajoute de la mozarella dans ses proc...

Je me balladais tranquille, en week end et je suis tombe sur le lien suivant:

moi>Intel AES instruction set support?! hu?! depuis quand?!?!

J'ai vite lu la doc et j'ai voulu voir si mon CPU tout recent supportais cette joyeusete, Intel file du code, mais ca compilait pas direct alors j'ai vite refait tout simple..:

#include <stdio.h>
#include <unistd.h>

int chk_cpu_aes_support() {
    unsigned int rc;
    asm ("mov $0x01, %%eax\n\t"
         "cpuid\n\t"
         "mov %%ecx, %0\n\t"
         :"=r"(rc)
         : /* no inputs */
         :"%ecx", "%eax"
        );
    return (rc & 0x2000000);
}

/* ORIGINAL INTEL CODE.
int Check_CPU_support_AES() {
#if defined(__INTEL_COMPILER)
    int CPUInfo[4] = { -1 };
    __cpuid(CPUInfo, 1);
    return (CPUInfo[2] & 0x2000000);
#else
    unsigned int a=1,b,c,d;
    __cpuid(1, a,b,c,d);
    return (c & 0x2000000);
#endif
}
*/

int main(int argc, char ** argv)
{
    fprintf(stdout, "%08x(%d)\n", chk_cpu_aes_support(), chk_cpu_aes_support());
    return 0;
}

Et tristesse...:

$ ./intelaesdetect
00000000 (0)

  • sniff*...

si qqun a un resultat "positif" n'hesitez pas a _COMMENTER_ juste que je sache quel series est capable de faire ca..

vendredi 22 mai 2009

RUMP non ca n'est PAS le nom des nouveaux batonnets findus!

Non, non et non, pas findus, c'est un nouveau (en tout cas pour moi) concept introduit dans NetBSD qui permet d' "externaliser" en userspace des elements kernelspace de maniere (dixit) "simple", en gros RUMP (c'est son nom) vous permet de "runner" certains des call/fonctions/syscalls kernelspace depuis la librump plutot que d'appeler le kernel, ca semble necessiter de recoder le dit appel dans la librump, rump semble donne un access plus direct a certaines partie du kernel vous laissant la liberte de traiter la majorite du code de controle en userland, je vais faire joujou et lire le code pour "tenter" de comprendre le fonctionnement, mais c'est interessant, je me demande si ca sent pas l'envie de faire un microkernel a long terme ca...

jeudi 9 avril 2009

base32 c'est bon comme la saucisse de george!

J'avais besoin d'un base32, alors hop une implementation "vite fait" (*bruit-de-sac-poubelle*) de base32.

Bordel j'ai galere comme un pouilleux pour faire ca!; un peu comme quand on pousse une crotte trop grosse.

C'est pourtant pas dur...bref la honte et je la partage avec vous.

base32.c

feedback, correction, bugs, welcome...

lundi 9 mars 2009

Un peu d'auto-promo.

J'ai écrit vite fait une petite documentation relative aux tests unitaires en C. Feedbacks bienvenus.

C'est par ici

dimanche 8 février 2009

unbound le resolver DNS aux omega3!

Petite decouverte, moi qui ait toujours ete un habitue de bind (et de ses features et vulns :)) a ma periode BOFH, je viens par hasard de tomber sur unbound, un resolver DNS tout petit et qui semble tout convivial et tout bien fait! et qui en plus supporte DNSSEC...

sympa a suivre...

samedi 13 septembre 2008

A mon stage chez l'agence tout risque, j'ai appris a bricoler des clotures...

Mac OS X ne possede pas pthread_barrier_t et j'ai vu d'autres problemes avec d'autres "unix", donc j'ai fait mes "barriers" "maisons", on verra bien quand je devrais porter sous win32...

c'est ICI, comments are welcome...

have fun!.

mercredi 13 août 2008

pthread pour les NULL

Je code comme un boulet et en ce moment j ai pleins de blems de "scheduling" et de "concurrence", mon code n'est pas thread safe et je dois jongler avec differentes conditions plus ou moins synchro mais qui sont hyper importantes.

bref comme je galerais un peu, nitrouze m'a montre ce petit reminder sympa pour me rappeler les bases des POSIX threads... y a pas a dire je suis un boulet et y a pas de secret si on pratique pas, ca reste pas..

HTH, ++

mercredi 2 juillet 2008

L'appel du 2 Juillet 2008!

J'ai l'air con je croyais que getaddrinfo(3) allait fonctionner pareil partout et voila que je constate la chose bete et suivante,

  • NetBSD:
[1] eau@bearcave:~ 
$ telnet 31
31: No address associated with hostname
[2] eaul@bearcave:~ 
$
  • Linux:
eau@turtle ~ $ telnet 31
Trying 0.0.0.31...
telnet: Unable to connect to remote host: Invalid argument
eau@turtle ~ $ 

putain quoi mais pourquoi ce con il se dit "tiens 31, ca doit etre 0.0.0.31.." quelle tache! si qqun a des recommendations ou une explication, car du coup pour verifier que j ai a faire a un host, je fait un getaddrinfo(3) et si rc != 0 bah c'est pas un host, mais la Linux (menelusme(tm)) il me retourne 0 a chaque fois... ca suce..

gmrlmglrmgrlm cherchage de solution... silvouple AIDEZZZZZZZZZZ MOIIIIIII!!!! JE SUIS UNE TANCHEEEE BORDEL!!!!

vendredi 23 mai 2008

Sexy Ksplice (girls ?)

Booon, alors je suis tombé sur un petit truc rigolo. Un petit soft, qui fait la modification de code à runtime dans le noyau linux, c'est persistant, qui plus est ! Au prochain reboot ça restera en place. Idéal par exemple pour faire des patches de sécurité sans engendrer un reboot. Les esprits vifs (et pervers ?) feront tout de suite des remarques du genre "haaaan, et pis comme ça c'est plus propre que d'écrire dans /dev/kmem", euh, certes, certes. Petits canaillous.

Le lien, par ici (sponsorisé par le MIT).

jeudi 27 mars 2008

IPv6 et algoflash, comment utiliser de l'engrai a fougere sur mon code merdique...

Alors ca fait qqes temps que je codouille en v6 etc... j'ai qqes soucis mais globalement c'est assez simple de faire du code clean et dual stack en C, j'ai pas encore teste en python.

J'ai une question a tout les gurus-ultra-leet-v6 tout ca.. je cherche une solution au moyen de faire des filtres pcap avance en ipv6, et ca ne semble pas possible, cf tcpdump(8) :

[...]
  Proto is one of ether, fddi, tr, wlan, ppp,  slip,  link,
  ip,  arp,  rarp, tcp, udp, icmp or ip6, and indicates the
  protocol layer for the index  operation.   (ether,  fddi,
  wlan,  tr,  ppp,  slip  and  link  all  refer to the link
  layer.) Note that tcp, udp and other upper-layer  proto-
  col  types  only  apply  to  IPv4, not IPv6 (this will be
  fixed in the future)
[...]

donc si qqun a une idee...

Voila la ptite doc sympa ipv6 prog tout ca :

* http://www.euchinagrid.org/IPv6/IPv6_presentation/Introduction_to_IPv6_programming.pdf

Qu'on va mirrorer gentillement paske c'est bien utile quand meme :

* introduction_to_v6_prog.pdf

vendredi 21 mars 2008

FNV je sais pas si c'est bien mais on va voir!

Alors je sais pas ce que ca vaut, mais j'avais besoin d'un hash sur un petit bloc de donnees et de maniere repetee, et surtout dont le resultat reste sur 32 ou 64bits avec une bonne distribution pour "eviter","limiter" les collisions.

Apres avoir teste sha1 et md5, et bon en le rapellant trop souvent c'est quand meme un ptit peu lent.

poz ou ppr m'ont parle de ca, y a longtemps il me semble :

http://isthe.com/chongo/tech/comp/fnv/

si y a des gens avec de l'experience et un peu matheux, qui veulent bien commenter :)

samedi 2 février 2008

BPF, LSF, DLPI, et bla!

Des ptits links parfois utiles pour tenter de faire du SOCK_RAW, voir du link level et de maniere optimal, de maniere portable il y a libpcap (mais ce n'est pas toujours le plus efficace), j'ai appris a propos de LSF (qui est l'equivalent de BPF pour linux), et a propos d'autres... etc.. etc.. solaris bla

Si ca peut en aider d'autres :

http://www.faqs.org/faqs/internet/t...

http://www.tcpdump.org/papers/bpf-u...

http://www.linuxjournal.com/article...

http://www.opensolaris.org/os/proje...

http://www.opensolaris.org/os/proje...

Shazam!!!

Update 03/02/2008:

un autre paper sur une precedente alternative au device polling. (merci poz pour le rappel)

mercredi 23 janvier 2008

oula ca se reveille!

He beh, apres des tas de POST, de papers, de coding practice dans tout les sens, le CERT nous sort ca :

secure C coding practice

Je suis en train de parcourir toutes ces choses

D'ailleurs concernant les memory management stuff... j'avais lu un truc la

hope it helps.

mardi 22 janvier 2008

const et volatile!

moi qui refais du C en ce moment, alors me voila a me replonger avec plaisir la dedans, je savais plus ce que ca definissait exactement const et volatile, qqes souvenirs, j'ai vite relu ca rapidos et pouf c'est revenu..

have fun!

libconfuse : la gestion simplifiée de vos fichiers de conf.

Youpla les gens, voilà une petite news de rien du tout pour donner signe de vie.

Je sais pas pour vous, mais ça me fatigue de devoir utiliser le format XML pour les fichiers de conf' des softs que je développe. Alors je me suis mis à utiliser une petite bibliothèque ma foi fort simplathique (mot-valise : simple et sympathique).

Ici, on a un format simple, mais on peut avoir des choses quand même plus complexes. Et surtout, c'est très facile à utiliser, dans vos programmes.

La voilà, la libconfuse.

- page 1 de 2