#include <unistd.h>
 #include <linux/limits.h>
+#include <linux/socket.h>
 #include <pid_filter.h>
 
 /* bpf-output associated map */
 
 struct augmented_args_payload {
        struct syscall_enter_args args;
-       struct {
-              struct augmented_filename filename;
-              struct augmented_filename filename2;
-       };
+       union {
+               struct {
+                       struct augmented_filename filename,
+                                                 filename2;
+               };
+               struct sockaddr_storage saddr;
+       };
 };
 
 bpf_map(augmented_args_tmp, PERCPU_ARRAY, int, struct augmented_args_payload, 1);
 }
 
 /*
- * This will be tail_called from SEC("raw_syscalls:sys_enter"), so will find in
+ * These will be tail_called from SEC("raw_syscalls:sys_enter"), so will find in
  * augmented_args_tmp what was read by that raw_syscalls:sys_enter and go
  * on from there, reading the first syscall arg as a string, i.e. open's
  * filename.
  */
+SEC("!syscalls:sys_enter_connect")
+int sys_enter_connect(struct syscall_enter_args *args)
+{
+       int key = 0;
+       struct augmented_args_payload *augmented_args = bpf_map_lookup_elem(&augmented_args_tmp, &key);
+       const void *sockaddr_arg = (const void *)args->args[1];
+       unsigned int socklen = args->args[2];
+       unsigned int len = sizeof(augmented_args->args);
+
+        if (augmented_args == NULL)
+                return 1; /* Failure: don't filter */
+
+       if (socklen > sizeof(augmented_args->saddr))
+               socklen = sizeof(augmented_args->saddr);
+
+       probe_read(&augmented_args->saddr, socklen, sockaddr_arg);
+
+       /* If perf_event_output fails, return non-zero so that it gets recorded unaugmented */
+       return perf_event_output(args, &__augmented_syscalls__, BPF_F_CURRENT_CPU, augmented_args, len + socklen);
+}
+
 SEC("!syscalls:sys_enter_open")
 int sys_enter_open(struct syscall_enter_args *args)
 {