@@ -62,6 +62,26 @@ srv_mapping * srv_find_mapping(const struct sockaddr_in *addr_in)
6262 return NULL ;
6363}
6464
65+ // TODO: attribute hidden
66+ srv_mapping * srv_find_mapping_to (const struct sockaddr_in * addr_in )
67+ {
68+ for (int i = 0 ; i < n_mappings ; i ++ )
69+ {
70+ if (mappings [i ].addr_to == NULL ||
71+ (* mappings [i ].addr_to ).s_addr == (addr_in -> sin_addr ).s_addr )
72+ {
73+ if (mappings [i ].port_to == 0 ||
74+ mappings [i ].port_to == addr_in -> sin_port )
75+ {
76+ fprintf (stderr , "WE HAVE A MATCH!!!!!!\n" );
77+ return mappings + i ;
78+ }
79+ }
80+ }
81+
82+ return NULL ;
83+ }
84+
6585
6686void _fini (void )
6787{
@@ -365,47 +385,69 @@ ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags)
365385 }
366386}
367387
388+ // TODO: this is still wrong
368389ssize_t recvfrom (int sockfd , void * buf , size_t len , int flags ,
369390 struct sockaddr * src_addr , socklen_t * addrlen )
370391{
371- fprintf (stderr , "Entering recvfrom(2)\n" );
372-
373- if (src_addr -> sa_family != AF_INET ) {
374- fprintf (stderr , "No AF_INET, skipping\n" );
375- return super_recvfrom (sockfd , buf , len , flags , src_addr , addrlen );
376- }
377-
378392 static struct sockaddr_in * src_addr_in ;
379393 src_addr_in = (struct sockaddr_in * )src_addr ;
380394
381- srv_mapping * mapping = srv_find_mapping ( src_addr_in );
395+ fprintf ( stderr , "Entering recvfrom(2)\n" );
382396
383- if (mapping )
397+ if (src_addr -> sa_family != AF_INET ) {
398+ fprintf (stderr , "No AF_INET, skipping\n" );
399+ } else
384400 {
385-
386- in_port_t old_port = src_addr_in -> sin_port ;
387- struct in_addr old_addr = src_addr_in -> sin_addr ;
388-
389- if (mapping -> port_to != 0 )
401+ srv_mapping * mapping = srv_find_mapping (src_addr_in );
402+ if (!mapping )
390403 {
391- src_addr_in -> sin_port = mapping -> port_to ;
392- }
393-
394- if (mapping -> addr_to != NULL )
404+ fprintf (stderr , "No mapping\n" );
405+ } else
395406 {
396- src_addr_in -> sin_addr = * mapping -> addr_to ;
397- }
407+ fprintf (stderr , "Found mapping\n" );
398408
399- ssize_t res ;
400- res = super_recvfrom (sockfd , buf , len , flags , src_addr , addrlen );
409+ if (mapping -> port_to != 0 )
410+ {
411+ src_addr_in -> sin_port = mapping -> port_to ;
412+ }
401413
402- src_addr_in -> sin_port = old_port ;
403- src_addr_in -> sin_addr = old_addr ;
414+ if (mapping -> addr_to != NULL )
415+ {
416+ src_addr_in -> sin_addr = * mapping -> addr_to ;
417+ }
418+ }
419+ }
404420
421+ ssize_t res = super_recvfrom (sockfd , buf , len , flags , src_addr , addrlen );
422+
423+ if (src_addr_in -> sin_family != AF_INET )
424+ {
425+ fprintf (stderr , "AFTER: recvfrom: No AF_INET, skipping\n" );
405426 return res ;
406427 } else
407428 {
408- return super_recvfrom (sockfd , buf , len , flags , src_addr , addrlen );
429+ fprintf (stderr , "AFTER: Found AF_INET\n" );
430+
431+ srv_mapping * mapping = srv_find_mapping_to (src_addr_in );
432+ if (!mapping )
433+ {
434+ fprintf (stderr , "AFTER: No mapping\n" );
435+ return res ;
436+ } else
437+ {
438+ fprintf (stderr , "AFTER: Found mapping\n" );
439+ if (mapping -> port_from != 0 )
440+ {
441+ fprintf (stderr , "AFTER: Setting port\n" );
442+ src_addr_in -> sin_port = mapping -> port_from ;
443+ }
444+ if (mapping -> addr_from != NULL )
445+ {
446+ fprintf (stderr , "AFTER: Setting addr\n" );
447+ src_addr_in -> sin_addr = * mapping -> addr_from ;
448+ }
449+ return res ;
450+ }
409451 }
410452}
411453
@@ -416,50 +458,77 @@ ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags)
416458 if (msg -> msg_name == NULL )
417459 {
418460 fprintf (stderr , "No msg_name, skipping\n" );
419- return super_sendmsg (sockfd , msg , flags );
420- }
421-
461+ } else
462+ {
463+ fprintf (stderr , "Found msg_name\n" );
464+ struct sockaddr_in * src_addr_in = msg -> msg_name ;
422465
423- struct sockaddr_in * src_addr_in = msg -> msg_name ;
466+ if (src_addr_in -> sin_family != AF_INET )
467+ {
468+ fprintf (stderr , "recvmsg: No AF_INET, skipping\n" );
469+ } else
470+ {
471+ fprintf (stderr , "Found AF_INET\n" );
472+ srv_mapping * mapping = srv_find_mapping (src_addr_in );
473+ if (!mapping )
474+ {
475+ fprintf (stderr , "No mapping\n" );
476+ } else
477+ {
478+ fprintf (stderr , "Found mapping\n" );
424479
425- fprintf (stderr , "recvmsg: msg_namelen: %d\n" , msg -> msg_namelen );
426- fprintf (stderr , "recvmsg: AF_INET: %d vs %d\n" , AF_INET , src_addr_in -> sin_family );
480+ if (mapping -> port_to != 0 )
481+ {
482+ src_addr_in -> sin_port = mapping -> port_to ;
483+ }
427484
428- if (src_addr_in -> sin_family != AF_INET )
429- {
430- fprintf (stderr , "recvmsg: No AF_INET, skipping\n" );
431- return super_recvmsg (sockfd , msg , flags );
485+ if (mapping -> addr_to != NULL )
486+ {
487+ src_addr_in -> sin_addr = * mapping -> addr_to ;
488+ }
489+ }
490+ }
432491 }
433492
434- srv_mapping * mapping = srv_find_mapping ( src_addr_in );
493+ ssize_t res = super_recvmsg ( sockfd , msg , flags );
435494
436- if (mapping )
495+ if (msg -> msg_name == NULL )
496+ {
497+ fprintf (stderr , "AFTER: No msg_name, skipping\n" );
498+ return res ;
499+ } else
437500 {
438- in_port_t old_port = src_addr_in -> sin_port ;
439- struct in_addr old_addr = src_addr_in -> sin_addr ;
501+ fprintf ( stderr , "AFTER: Found msg_name\n" ) ;
502+ struct sockaddr_in * src_addr_in = msg -> msg_name ;
440503
441- if (mapping -> port_to != 0 )
504+ if (src_addr_in -> sin_family != AF_INET )
442505 {
443- src_addr_in -> sin_port = mapping -> port_to ;
444- }
445-
446- if (mapping -> addr_to != NULL )
506+ fprintf (stderr , "AFTER: recvmsg: No AF_INET, skipping\n" );
507+ return res ;
508+ } else
447509 {
448- src_addr_in -> sin_addr = * mapping -> addr_to ;
449- }
450-
451- ssize_t res ;
452- res = super_recvmsg (sockfd , msg , flags );
510+ fprintf (stderr , "AFTER: Found AF_INET\n" );
453511
454- src_addr_in -> sin_port = old_port ;
455- src_addr_in -> sin_addr = old_addr ;
456-
457- return res ;
458-
459-
460- } else
461- {
462- return super_recvmsg (sockfd , msg , flags );
512+ srv_mapping * mapping = srv_find_mapping_to (src_addr_in );
513+ if (!mapping )
514+ {
515+ fprintf (stderr , "AFTER: No mapping\n" );
516+ return res ;
517+ } else
518+ {
519+ fprintf (stderr , "AFTER: Found mapping\n" );
520+ if (mapping -> port_from != 0 )
521+ {
522+ fprintf (stderr , "AFTER: Setting port\n" );
523+ src_addr_in -> sin_port = mapping -> port_from ;
524+ }
525+ if (mapping -> addr_from != NULL )
526+ {
527+ fprintf (stderr , "AFTER: Setting addr\n" );
528+ src_addr_in -> sin_addr = * mapping -> addr_from ;
529+ }
530+ return res ;
531+ }
532+ }
463533 }
464-
465534}
0 commit comments