diff options
Diffstat (limited to 'src/common')
-rwxr-xr-x | src/common/Makefile.am | 1 | ||||
-rw-r--r-- | src/common/net.c | 57 | ||||
-rw-r--r-- | src/common/net.h | 4 | ||||
-rw-r--r-- | src/common/shuffle.c | 78 | ||||
-rw-r--r-- | src/common/shuffle.h | 37 |
5 files changed, 177 insertions, 0 deletions
diff --git a/src/common/Makefile.am b/src/common/Makefile.am index 9e9969d..02c1718 100755 --- a/src/common/Makefile.am +++ b/src/common/Makefile.am @@ -16,6 +16,7 @@ libcommon_la_SOURCES = \ macros.h \ net.h net.c \ pathname.h pathname.c \ + shuffle.h shuffle.c \ sort.h sort.c \ sqlite.h sqlite.c \ xdg.h xdg.c \ diff --git a/src/common/net.c b/src/common/net.c index aba5ba2..b741883 100644 --- a/src/common/net.c +++ b/src/common/net.c @@ -24,6 +24,7 @@ #include "net.h" +#include <errno.h> #include <stdio.h> #include <string.h> #include <unistd.h> @@ -100,3 +101,59 @@ int connect_via_tcp(const char *server, const char *port, struct sockaddr_in *ad return result; } + + +/****************************************************************************** +* * +* Paramètres : sock = nom ou adresse du serveur à contacter. * +* buffer = tampon pour la réception des données. [OUT] * +* max = taille prévue pour ce tampon. * +* len = quantité de données effectivement reçues. [OUT] * +* * +* Description : Reçoit du réseau autant de données que possible. * +* * +* Retour : Bilan de l'opération. * +* * +* Remarques : - * +* * +******************************************************************************/ + +bool recv_all(int sock, char *buffer, size_t max, size_t *len) +{ + bool result; /* Bilan global à retourner */ + ssize_t ret; /* Bilan d'un appel */ + + result = true; + + buffer[0] = '\0'; + max--; /* '\0' final */ + *len = 0; + + do + { + ret = recv(sock, buffer + *len, max, *len > 0 ? MSG_DONTWAIT : 0); + + printf("ret = %zd\n", ret); + + if (ret == -1 && *len == 0) + { + if (errno == EAGAIN || errno == EWOULDBLOCK) + continue; + else + result = false; + } + + else if (ret > 0) + { + max -= ret; + *len += ret; + } + + } + while (ret > 0); + + buffer[*len] = '\0'; + + return result; + +} diff --git a/src/common/net.h b/src/common/net.h index 80f7496..d9ec6f9 100644 --- a/src/common/net.h +++ b/src/common/net.h @@ -26,12 +26,16 @@ #include <netdb.h> +#include <stdbool.h> /* Ouvre une connexion TCP à un serveur quelconque. */ int connect_via_tcp(const char *, const char *, struct sockaddr_in *); +/* Reçoit du réseau autant de données que possible. */ +bool recv_all(int, char *, size_t, size_t *); + #endif /* _COMMON_NET_H */ diff --git a/src/common/shuffle.c b/src/common/shuffle.c new file mode 100644 index 0000000..6b20866 --- /dev/null +++ b/src/common/shuffle.c @@ -0,0 +1,78 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * shuffle.c - permtutation aléatoire des éléments d'un ensemble fini + * + * Copyright (C) 2016 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#include "shuffle.h" + + +#include <malloc.h> +#include <stdlib.h> +#include <string.h> + + + +/****************************************************************************** +* * +* Paramètres : panel = instance d'objet GLib à traiter. * +* * +* Description : Mélange le contenu d'une liste. * +* * +* Retour : - * +* * +* Remarques : - * +* * +******************************************************************************/ + +void shuffle(void *base, size_t nmemb, size_t size) +{ + char *list; /* Conversion pour le confort */ + char *tmp; /* Lieu de transition */ + size_t i; /* Boucle de parcours */ + size_t j; /* Emplacement aléatoire */ + + /** + * Application de l'algorithme Fisher-Yates. + * + * Cf. https://en.wikipedia.org/wiki/Fisher%E2%80%93Yates_shuffle + */ + + if (nmemb > 1) + { + list = (char *)base; + + tmp = malloc(size); + + for (i = 0; i < (nmemb - 1); i++) + { + j = i + rand() % (nmemb - i); + + memcpy(tmp, list + i * size, size); + memcpy(list + i * size, list + j * size, size); + memcpy(list + j * size, tmp, size); + + } + + free(tmp); + + } + +} diff --git a/src/common/shuffle.h b/src/common/shuffle.h new file mode 100644 index 0000000..c1a0367 --- /dev/null +++ b/src/common/shuffle.h @@ -0,0 +1,37 @@ + +/* Chrysalide - Outil d'analyse de fichiers binaires + * shuffle.h - prototypes pour la permtutation aléatoire des éléments d'un ensemble fini + * + * Copyright (C) 2016 Cyrille Bagard + * + * This file is part of Chrysalide. + * + * OpenIDA is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * OpenIDA is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with Foobar. If not, see <http://www.gnu.org/licenses/>. + */ + + +#ifndef _COMMON_SHUFFLE_H +#define _COMMON_SHUFFLE_H + + +#include <sys/types.h> + + + +/* Mélange le contenu d'une liste. */ +void shuffle(void *, size_t, size_t); + + + +#endif /* _COMMON_SHUFFLE_H */ |