diff --git a/deno.lock b/deno.lock index 74ced2a0..982a30db 100644 --- a/deno.lock +++ b/deno.lock @@ -66,6 +66,7 @@ "npm:tree-sitter@*": "0.22.4", "npm:tree-sitter@~0.22.4": "0.22.4", "npm:tw-animate-css@^1.2.9": "1.3.3", + "npm:vite@*": "6.3.5_picomatch@4.0.2_@types+node@22.15.15", "npm:vite@^6.3.5": "6.3.5_picomatch@4.0.2_@types+node@22.15.15", "npm:yargs@*": "17.7.2", "npm:yargs@^17.7.2": "17.7.2", diff --git a/examples/c/network/.napirc b/examples/c/network/.napirc new file mode 100644 index 00000000..e213da94 --- /dev/null +++ b/examples/c/network/.napirc @@ -0,0 +1,41 @@ +{ + "language": "c", + "project": { + "include": [ + "**/*.c", + "**/*.h" + ], + "exclude": [ + ".git/**", + "**/dist/**", + "**/build/**", + "**/bin/**", + "**/obj/**", + "**/packages/**", + "**/.vs/**", + "**/TestResults/**", + "**/*.user", + "**/*.suo", + "**/.nuget/**", + "**/artifacts/**", + "**/packages/**", + "**/util/**", + "**/test/**", + "**/perf/**", + "**/napi_out/**" + ] + }, + "outDir": "napi_out", + "metrics": { + "file": { + "maxChar": 100000, + "maxLine": 1000, + "maxDep": 10 + }, + "symbol": { + "maxChar": 50000, + "maxLine": 500, + "maxDep": 5 + } + } +} diff --git a/examples/c/network/makefile b/examples/c/network/makefile new file mode 100644 index 00000000..c428db95 --- /dev/null +++ b/examples/c/network/makefile @@ -0,0 +1,66 @@ +# --- Macros --- + +# compilation +exec = gcc -Wall -Wextra -pedantic -O3 -g3 -fopenmp -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls +comp = gcc -c -Wall -Wextra -pedantic -O3 -g3 -fopenmp -fsanitize=address -fno-omit-frame-pointer -fno-optimize-sibling-calls +toexe = -o +toobj = -o + +# sources +SRCSC= $(wildcard src/*/*.c) +SRCSH= $(wildcard src/*/*.h) + +TSTSC= $(wildcard tst/*.c) + +# objects +OBJS= $(wildcard obj/*.o) +OBJBM= $(wildcard src/*/*.o) + + +# --- Functions --- + +all: test main + +main: create_exe_main to_obj_src + +test: bin_mkdir create_exe_new to_obj + +clean: clean_o clean_bin + +bin_mkdir: + mkdir -p bin; + +obj_mkdir: + mkdir -p obj; + +tst_mov: + mv $(foreach exe, $(TSTSC:tst/%.c=%) , $(exe) ) bin + + +create_exe_new: create_obj + $(foreach test_obj,$(TSTSC:%.c=%.o), $(exec) $(test_obj) $(SRCSC:%.c=%.o) $(toexe) $(test_obj:%.o=%);) + +create_exe_main: create_obj_main + $(exec) obj/main.o $(SRCSC:%.c=%.o) $(toexe) app + +to_obj: obj_mkdir to_obj_src to_obj_tst + + + +to_obj_src: + mv $(foreach obj,$(SRCSC:%.c=%.o), $(obj) ) obj + +to_obj_tst: + mv $(foreach obj,$(TSTSC:%.c=%.o), $(obj) ) obj + + +create_obj: create_obj_src create_obj_tst + +create_obj_src: + $(foreach cfl, $(SRCSC), $(comp) $(cfl) $(toobj) $(cfl:%.c=%).o;) + +create_obj_tst: + $(foreach cfl, $(TSTSC), $(comp) $(cfl) $(toobj) $(cfl:%.c=%).o;) + +create_obj_main: obj_mkdir create_obj_src + $(comp) src/main.c $(toobj) obj/main.o \ No newline at end of file diff --git a/examples/c/network/src/cartographie/cartographie.c b/examples/c/network/src/cartographie/cartographie.c new file mode 100644 index 00000000..95457271 --- /dev/null +++ b/examples/c/network/src/cartographie/cartographie.c @@ -0,0 +1,96 @@ +#include "cartographie.h" + +void scanHorizontal(const char* network) { + struct sockaddr_in addr; + int sockfd, ttl = 64, timeout = 1000; + char ip[INET_ADDRSTRLEN]; + + // Création du socket + sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP); + if (sockfd < 0) { + perror("socket"); + exit(EXIT_FAILURE); + } + + // Définition de l'option TTL + if (setsockopt(sockfd, IPPROTO_IP, IP_TTL, &ttl, sizeof(ttl)) < 0) { + perror("setsockopt"); + exit(EXIT_FAILURE); + } + + // Définition de l'option de timeout + struct timeval tv; + tv.tv_sec = timeout / 1000; + tv.tv_usec = (timeout % 1000) * 1000; + if (setsockopt(sockfd, SOL_SOCKET, SO_RCVTIMEO, &tv, sizeof(tv)) < 0) { + perror("setsockopt"); + exit(EXIT_FAILURE); + } + + // Scan du réseau + for (int i = 1; i <= 255; i++) { + memset(&addr, 0, sizeof(addr)); + addr.sin_family = AF_INET; + + // Adresse --> octets + int octet1, octet2, octet3, octet4; + sscanf(network, "%d.%d.%d.%d", &octet1, &octet2, &octet3, &octet4); + + // Dernier octet --> i + octet4 = i; + + // Réassemblement de l'adresse + char host[INET_ADDRSTRLEN]; + sprintf(host, "%d.%d.%d.%d", octet1, octet2, octet3, octet4); + + // Conversion adresse en binaire + inet_pton(AF_INET, host, &(addr.sin_addr)); + + // Conversion adresse en texte + inet_ntop(AF_INET, &(addr.sin_addr), ip, INET_ADDRSTRLEN); + + // Envoi du paquet ICMP + struct icmphdr icmp; + memset(&icmp, 0, sizeof(icmp)); + icmp.type = ICMP_ECHO; + icmp.code = 0; + icmp.checksum = htons(~(ICMP_ECHO << 8)); + + if (sendto(sockfd, &icmp, sizeof(icmp), 0, (struct sockaddr*)&addr, sizeof(addr)) < 0) { + perror("sendto"); + continue; + } + + // Attente de la réponse + fd_set read_set; + FD_ZERO(&read_set); + FD_SET(sockfd, &read_set); + struct timeval timeout; + timeout.tv_sec = 1; + timeout.tv_usec = 0; + int select_result = select(sockfd + 1, &read_set, NULL, NULL, &timeout); + if (select_result < 0) { + perror("select"); + continue; + } else if (select_result == 0) { + printf("Aucune réponse de %s\n", ip); + continue; + } + + // Réception de la réponse + char buffer[IP_MAXPACKET]; + struct sockaddr_in sender; + socklen_t sender_len = sizeof(sender); + ssize_t packet_len = recvfrom(sockfd, buffer, sizeof(buffer), 0, (struct sockaddr*)&sender, &sender_len); + if (packet_len < 0) { + perror("recvfrom"); + continue; + } + + // Affichage de l'adresse + printf("L'hôte %s est en ligne\n", ip); + } + + // Fermeture socket + close(sockfd); +} diff --git a/examples/c/network/src/cartographie/cartographie.h b/examples/c/network/src/cartographie/cartographie.h new file mode 100644 index 00000000..c7c039c0 --- /dev/null +++ b/examples/c/network/src/cartographie/cartographie.h @@ -0,0 +1,18 @@ +#ifndef CARTOGRAPHIE_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include "tnmap.h" + +void scanHorizontal(const char* network); + +#define CARTOGRAPHIE_H +#endif diff --git a/examples/c/network/src/cartographie/tnmap.c b/examples/c/network/src/cartographie/tnmap.c new file mode 100644 index 00000000..1aef53d7 --- /dev/null +++ b/examples/c/network/src/cartographie/tnmap.c @@ -0,0 +1,54 @@ +#include "tnmap.h" + +// Vérifie si un hôte est actif +// Retourne un socket si l'hôte est actif, 1 sinon +int tnmap(const char* ip_addr) { + int sock; + struct sockaddr_in server; + int port; + int result[MAX_PORTS] = {0}; + + // Création du socket + sock = socket(AF_INET, SOCK_STREAM, 0); + if (sock == -1) { + perror("Échec de la création du socket"); + return -1; + } + + server.sin_addr.s_addr = inet_addr(ip_addr); + server.sin_family = AF_INET; + + // Scan des ports + for (port = 1; port <= MAX_PORTS; port++) { + server.sin_port = htons(port); + + // Connexion à l'hôte distant + if (connect(sock, (struct sockaddr *)&server, sizeof(server)) < 0) { + result[port - 1] = 0; // Port fermé + } else { + result[port - 1] = 1; // Port ouvert + close(sock); + sock = socket(AF_INET, SOCK_STREAM, 0); // Socket pour le prochain port + if (sock == -1) { + perror("Échec de la création du socket"); + return -1; + } + } + } + + #pragma omp parallel for + // Affichage des résultats + for (port = 1; port <= MAX_PORTS; port++) { + if (result[port - 1] == 1) { + printf("Le port %d de %s est ouvert\n", port, ip_addr); + } + } + + return 1; +} + +void scanVertical(const char* ip_addr) { + for (int i = 0; i < 255; i++) { + tnmap(ip_addr); + } +} diff --git a/examples/c/network/src/cartographie/tnmap.h b/examples/c/network/src/cartographie/tnmap.h new file mode 100644 index 00000000..1e59145b --- /dev/null +++ b/examples/c/network/src/cartographie/tnmap.h @@ -0,0 +1,13 @@ +#ifndef TNMAP_H +#define TNMAP_H +#include +#include +#include +#include +#include +#include +#define MAX_PORTS 65535 +#endif + +int tnmap(const char* ip_addr); +void scanVertical(const char* ip_addr); diff --git a/examples/c/network/src/main.c b/examples/c/network/src/main.c new file mode 100644 index 00000000..28465650 --- /dev/null +++ b/examples/c/network/src/main.c @@ -0,0 +1,24 @@ +#include "cartographie/cartographie.h" +#include +#include + +int main(int argc, char *argv[]) { + if (argc < 3) { + fprintf(stderr, "Utilisation : %s \n", argv[0]); + fprintf(stderr, "Modes :\n"); + fprintf(stderr, " -h: Scan horizontal\n"); + fprintf(stderr, " -v: Scan vertical\n"); + fprintf(stderr, "Option:\n"); + fprintf(stderr, " : IP à scanner verticalemnet or horizontalement (adresse de réseau)\n"); + return 1; + } + if (strcmp(argv[1], "-h") == 0) { + scanHorizontal(argv[2]); + } else if (strcmp(argv[1], "-v") == 0) { + scanVertical(argv[2]); + } else { + fprintf(stderr, "Mode invalide\n"); + return 1; + } + return 0; +} diff --git a/examples/c/network/src/tcp_cs/clientTCP.c b/examples/c/network/src/tcp_cs/clientTCP.c new file mode 100644 index 00000000..b020ccda --- /dev/null +++ b/examples/c/network/src/tcp_cs/clientTCP.c @@ -0,0 +1,64 @@ +#include "clientTCP.h" + +int startClient(int argc, char *argv[]) { + int serverSocket; + /* + * Ouvrir socket (socket STREAM) + */ + if ((serverSocket = socket(PF_INET, SOCK_STREAM, 0)) <0) { + perror ("erreur socket"); + exit (1); + } + + struct sockaddr_in serv_addr; + /* + * Lier l'adresse locale à la socket + */; + memset(&serv_addr, 0, sizeof(serv_addr) ); + serv_addr.sin_family = AF_INET ; + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + serv_addr.sin_port = htons(CLIENT_PORT); + if (bind(serverSocket,(struct sockaddr *)&serv_addr, sizeof(serv_addr) ) <0) { + perror ("servecho: erreur bind\n"); + exit (1); + } + + /* + * Remplir la structure serv_addr avec + l'adresse du serveur + */ + bzero( (char *) &serv_addr, sizeof(serv_addr) ); + serv_addr.sin_family = AF_INET; + + if (argc != 3) { + fprintf(stderr, "usage : %s \n", argv[0]); + exit(1); + } + serv_addr.sin_port = htons((uint16_t) atoi(argv[2])); + serv_addr.sin_addr.s_addr = inet_addr(argv[1]); + if (connect(serverSocket, (struct sockaddr *) &serv_addr, sizeof(serv_addr) ) < 0){ + perror ("cliecho : erreur connect"); + return 1; + } + char buffer[280]; + int n; + while (1) { + printf("cliecho : message à envoyer : "); + memset(buffer, 0, sizeof(buffer)); + scanf("%s", buffer); + n = write(serverSocket, buffer, strlen(buffer)); + if (n < 0) { + perror("cliecho : erreur write\n"); + close(serverSocket); + return 1; + } + memset(buffer, 0, sizeof(buffer)); + n = read(serverSocket, buffer, 280); + if (n < 0) { + perror("cliecho : erreur read\n"); + close(serverSocket); + return 1; + } + printf("cliecho : message reçu : %s\n", buffer); + } +} diff --git a/examples/c/network/src/tcp_cs/clientTCP.h b/examples/c/network/src/tcp_cs/clientTCP.h new file mode 100644 index 00000000..41ce73e4 --- /dev/null +++ b/examples/c/network/src/tcp_cs/clientTCP.h @@ -0,0 +1,18 @@ +#ifndef CLIENTTCP_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define CLIENT_PORT 7776 + +int startClient(int argc, char *argv[]); + +#define CLIENTTCP_H +#endif diff --git a/examples/c/network/src/tcp_cs/serveurTCP.c b/examples/c/network/src/tcp_cs/serveurTCP.c new file mode 100644 index 00000000..82a8e38b --- /dev/null +++ b/examples/c/network/src/tcp_cs/serveurTCP.c @@ -0,0 +1,58 @@ +#include "serveurTCP.h" + +int startServer(void) { + int serverSocket; + struct sockaddr_in serv_addr; + /* + * Ouvrir socket (socket STREAM) + */ + if ((serverSocket = socket(PF_INET, SOCK_STREAM, 0))<0) { + perror("erreur socket"); + return 1; + } + + memset(&serv_addr, 0, sizeof(serv_addr) ); + serv_addr.sin_family = AF_INET ; + + serv_addr.sin_addr.s_addr = htonl(INADDR_ANY); + serv_addr.sin_port = htons(SERV_PORT); + if (bind(serverSocket,(struct sockaddr *)&serv_addr, sizeof(serv_addr) ) <0) { + perror ("servecho: erreur bind\n"); + return 1; + } + + if (listen(serverSocket, SOMAXCONN) <0) { + perror ("servecho: erreur listen\n"); + return 1; + } + + int dialogSocket; + int clilen; + struct sockaddr_in cli_addr; + clilen = sizeof(cli_addr); + dialogSocket = accept(serverSocket, (struct sockaddr *)&cli_addr, (socklen_t *)&clilen); + if (dialogSocket < 0) { + perror("servecho : erreur accep\n"); + close(serverSocket); + return 1; + } + while (1) { + char buffer[280]; + int n; + n = read(dialogSocket, buffer, 280); + if (n < 0) { + perror("servecho : erreur read\n"); + close(dialogSocket); + return 1; + } + printf("servecho : message reçu : %s\n", buffer); + n = write(dialogSocket, buffer, strlen(buffer)); + if (n < 0) { + perror("servecho : erreur write\n"); + close(dialogSocket); + return 1; + } + } + close(dialogSocket); + return 0; +} diff --git a/examples/c/network/src/tcp_cs/serveurTCP.h b/examples/c/network/src/tcp_cs/serveurTCP.h new file mode 100644 index 00000000..39422222 --- /dev/null +++ b/examples/c/network/src/tcp_cs/serveurTCP.h @@ -0,0 +1,18 @@ +#ifndef SERVEURTCP_H + +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#define SERV_PORT 7777 + +int startServer(void); + +#define SERVEURTCP_H +#endif diff --git a/packages/cli/src/languagePlugins/csharp/projectMapper/index.ts b/packages/cli/src/languagePlugins/csharp/projectMapper/index.ts index fb825d33..0b2e3f36 100644 --- a/packages/cli/src/languagePlugins/csharp/projectMapper/index.ts +++ b/packages/cli/src/languagePlugins/csharp/projectMapper/index.ts @@ -104,7 +104,7 @@ export class CSharpProjectMapper { for (let j = 1; j < splitPaths.length; j++) { if (splitPaths[j][i] !== commonPath[i]) { commonPath.splice(i); - let rootFolder = join(...commonPath); + let rootFolder = join("", ...commonPath); if (filepaths[0].startsWith(SEPARATOR)) { rootFolder = SEPARATOR + rootFolder; } @@ -112,7 +112,7 @@ export class CSharpProjectMapper { } } } - let rootFolder = join(...commonPath); + let rootFolder = join("", ...commonPath); if (filepaths[0].startsWith(SEPARATOR)) { rootFolder = SEPARATOR + rootFolder; }