#define NULL ((void *)0)
typedef unsigned long size_t; // Customize by platform.
typedef long intptr_t;
typedef unsigned long uintptr_t;
typedef long scalar_t__; // Either arithmetic or pointer type.
/* By default, we understand bool (as a convenience). */
typedef int bool;
#define false 0
#define true 1

/* Forward declarations */

/* Type definitions */

/* Variables and functions */
int accept(int, int /*<<< orphan*/ *, int /*<<< orphan*/ *);
int /*<<< orphan*/ close(int);
int creer_serveur(int);
int fork();
int /*<<< orphan*/ free(char *);
int /*<<< orphan*/ initialiser_signaux();
scalar_t__ malloc(int);
int /*<<< orphan*/ perror(char *);
scalar_t__ read(int, char *, int);
int /*<<< orphan*/ strlen(char const *);
int write(int, char const *, int /*<<< orphan*/);
int main(void) {
  int sockserveur = creer_serveur(8080);
  int sockclient;
  initialiser_signaux();
  char *buf = (char *)malloc(42);
  if (sockserveur == -1) {
    return -1;
  }
  while (1) {
    int pid;
    sockclient = accept(sockserveur, NULL, NULL);
    pid = fork();
    if (pid == 0) {
      if (sockclient == -1) {
        perror("accept");
        return -1;
      }
      const char *message_bienvenue =
          "Mais, vous savez, moi je ne crois pas qu\'il y ait de bonne ou de "
          "mauvaise situation. \n Moi, si je devais resumer ma vie "
          "aujourd\'hui avec vous, je dirais que c'est d\'abord des "
          "rencontres. \nDes gens qui m\'ont tendu la main, peut-etre a un "
          "moment ou je ne pouvais pas, ou j\'etais seul chez moi. \nEt c\'est "
          "assez curieux de se dire que les hasards, les rencontres forgent "
          "une destinee... \nParce que quand on a le gout de la chose, quand "
          "on a le gout de la chose bien faite, \nLe beau geste, parfois on ne "
          "trouve pas l\'interlocuteur en face, je dirais, le miroir qui vous "
          "aide a avancer. \nAlors ce n\'est pas mon cas, comme je le disais "
          "la, puisque moi au contraire, j\'ai pu ; \nEt je dis merci a la "
          "vie, je lui dis merci, je chante la vie, je danse la vie... Je ne "
          "suis qu\'amour! \nEt finalement, quand beaucoup de gens "
          "aujourd\'hui me disent : \nMais comment fais-tu pour avoir cette "
          "humanite ? \nEh bien je leur reponds tres simplement, je leur dis "
          "que c'est ce gout de l\'amour, \nCe gout donc qui m\'a pousse "
          "aujourd\'hui a entreprendre une construction mecanique. \nMais "
          "demain, qui sait, peut-etre simplement a me mettre au service de la "
          "communaute, \n a faire le don, le don de soi... \n ";
      if (write(sockclient, message_bienvenue, strlen(message_bienvenue)) ==
          -1) {
        perror("Write");
      }
      while (read(sockclient, buf, 42) >= 0) {
        write(sockclient, buf, strlen(buf));
      }
      free(buf);
    }
    close(sockclient);
  }
  return 0;
}


x86 assembly (clang, -O0):
<main>:
push   %rbp
mov    %rsp,%rbp
sub    $0x50,%rsp
movl   $0x0,-0x4(%rbp)
mov    $0x1f90,%edi
call   1080 <creer_serveur@plt>
mov    %eax,-0x8(%rbp)
mov    $0x0,%al
call   1040 <initialiser_signaux@plt>
mov    $0x2a,%edi
call   10a0 <malloc@plt>
mov    %rax,-0x18(%rbp)
cmpl   $0xffffffff,-0x8(%rbp)
jne    11f7 <main+0x47>
movl   $0xffffffff,-0x4(%rbp)
jmp    12e9 <main+0x139>
jmp    11fc <main+0x4c>
mov    -0x8(%rbp),%edi
xor    %eax,%eax
mov    %eax,%edx
mov    %rdx,%rsi
call   10c0 <accept@plt>
mov    %eax,-0xc(%rbp)
mov    $0x0,%al
call   10d0 <fork@plt>
mov    %eax,-0x1c(%rbp)
cmpl   $0x0,-0x1c(%rbp)
jne    12dc <main+0x12c>
cmpl   $0xffffffff,-0xc(%rbp)
jne    1244 <main+0x94>
lea    0xdcd(%rip),%rdi
call   10b0 <perror@plt>
movl   $0xffffffff,-0x4(%rbp)
jmp    12e9 <main+0x139>
lea    0xdbc(%rip),%rax
mov    %rax,-0x28(%rbp)
mov    -0xc(%rbp),%eax
mov    %eax,-0x34(%rbp)
mov    -0x28(%rbp),%rax
mov    %rax,-0x30(%rbp)
mov    -0x28(%rbp),%rdi
call   1060 <strlen@plt>
mov    -0x34(%rbp),%edi
mov    -0x30(%rbp),%rsi
mov    %eax,%edx
call   1050 <write@plt>
cmp    $0xffffffff,%eax
jne    1289 <main+0xd9>
lea    0x121c(%rip),%rdi
call   10b0 <perror@plt>
jmp    128e <main+0xde>
mov    -0xc(%rbp),%edi
mov    -0x18(%rbp),%rsi
mov    $0x2a,%edx
call   1090 <read@plt>
cmp    $0x0,%rax
jl     12d3 <main+0x123>
mov    -0xc(%rbp),%eax
mov    %eax,-0x44(%rbp)
mov    -0x18(%rbp),%rax
mov    %rax,-0x40(%rbp)
mov    -0x18(%rbp),%rdi
call   1060 <strlen@plt>
mov    -0x44(%rbp),%edi
mov    -0x40(%rbp),%rsi
mov    %eax,%edx
call   1050 <write@plt>
jmp    128e <main+0xde>
mov    -0x18(%rbp),%rdi
call   1030 <free@plt>
mov    -0xc(%rbp),%edi
call   1070 <close@plt>
jmp    11fc <main+0x4c>
mov    -0x4(%rbp),%eax
add    $0x50,%rsp
pop    %rbp
ret

x86 assembly (clang, -O2):
<main>:
push   %rbp
push   %r15
push   %r14
push   %r12
push   %rbx
mov    $0x1f90,%edi
call   1080 <creer_serveur@plt>
mov    %eax,%r12d
xor    %eax,%eax
call   1040 <initialiser_signaux@plt>
mov    $0x2a,%edi
call   10a0 <malloc@plt>
cmp    $0xffffffff,%r12d
jne    11ea <main+0x3a>
mov    $0xffffffff,%eax
pop    %rbx
pop    %r12
pop    %r14
pop    %r15
pop    %rbp
ret
mov    %rax,%rbx
lea    0xe13(%rip),%r14
lea    0x12a5(%rip),%r15
jmp    1207 <main+0x57>
nopl   (%rax)
mov    %ebp,%edi
call   1070 <close@plt>
mov    %r12d,%edi
xor    %esi,%esi
xor    %edx,%edx
call   10c0 <accept@plt>
mov    %eax,%ebp
xor    %eax,%eax
call   10d0 <fork@plt>
test   %eax,%eax
jne    1200 <main+0x50>
cmp    $0xffffffff,%ebp
je     127f <main+0xcf>
mov    %r14,%rdi
call   1060 <strlen@plt>
mov    %ebp,%edi
mov    %r14,%rsi
mov    %eax,%edx
call   1050 <write@plt>
cmp    $0xffffffff,%eax
jne    1261 <main+0xb1>
mov    %r15,%rdi
call   10b0 <perror@plt>
jmp    1261 <main+0xb1>
nopl   0x0(%rax,%rax,1)
call   1060 <strlen@plt>
mov    %ebp,%edi
mov    %rbx,%rsi
mov    %eax,%edx
call   1050 <write@plt>
mov    %ebp,%edi
mov    %rbx,%rsi
mov    $0x2a,%edx
call   1090 <read@plt>
mov    %rbx,%rdi
test   %rax,%rax
jns    1250 <main+0xa0>
call   1030 <free@plt>
jmp    1200 <main+0x50>
lea    0xd7a(%rip),%rdi
call   10b0 <perror@plt>
jmp    11dc <main+0x2c>

LLVM IR (-O0):
@.str = [7 x i8] c"accept\00"
@.str.1 = [1177 x i8] c"Mais, vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise situation. \0A Moi, si je devais resumer ma vie aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. \0ADes gens qui m'ont tendu la main, peut-etre a un moment ou je ne pouvais pas, ou j'etais seul chez moi. \0AEt c'est assez curieux de se dire que les hasards, les rencontres forgent une destinee... \0AParce que quand on a le gout de la chose, quand on a le gout de la chose bien faite, \0ALe beau geste, parfois on ne trouve pas l'interlocuteur en face, je dirais, le miroir qui vous aide a avancer. \0AAlors ce n'est pas mon cas, comme je le disais la, puisque moi au contraire, j'ai pu ; \0AEt je dis merci a la vie, je lui dis merci, je chante la vie, je danse la vie... Je ne suis qu'amour! \0AEt finalement, quand beaucoup de gens aujourd'hui me disent : \0AMais comment fais-tu pour avoir cette humanite ? \0AEh bien je leur reponds tres simplement, je leur dis que c'est ce gout de l'amour, \0ACe gout donc qui m'a pousse aujourd'hui a entreprendre une construction mecanique. \0AMais demain, qui sait, peut-etre simplement a me mettre au service de la communaute, \0A a faire le don, le don de soi... \0A \00"
@.str.2 = [6 x i8] c"Write\00"
define i32 @main() {
%1 = alloca i32
%2 = alloca i32
%3 = alloca i32
%4 = alloca i8*
%5 = alloca i32
%6 = alloca i8*
store i32 0, i32* %1
%7 = call i32 @creer_serveur(i32 8080)
store i32 %7, i32* %2
%8 = call i32 (...) @initialiser_signaux()
%9 = call i64 @malloc(i32 42)
%10 = inttoptr i64 %9 to i8*
store i8* %10, i8** %4
%11 = load i32, i32* %2
%12 = icmp eq i32 %11, -1
br i1 %12, label %13, label %14
13: ; preds = %0
store i32 -1, i32* %1
br label %53
14: ; preds = %0
br label %15
15: ; preds = %14, %50
%16 = load i32, i32* %2
%17 = call i32 @accept(i32 %16, i32* null, i32* null)
store i32 %17, i32* %3
%18 = call i32 (...) @fork()
store i32 %18, i32* %5
%19 = load i32, i32* %5
%20 = icmp eq i32 %19, 0
br i1 %20, label %21, label %50
21: ; preds = %15
%22 = load i32, i32* %3
%23 = icmp eq i32 %22, -1
br i1 %23, label %24, label %26
24: ; preds = %21
%25 = call i32 @perror(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0))
store i32 -1, i32* %1
br label %53
26: ; preds = %21
store i8* getelementptr inbounds ([1177 x i8], [1177 x i8]* @.str.1, i64 0, i64 0), i8** %6
%27 = load i32, i32* %3
%28 = load i8*, i8** %6
%29 = load i8*, i8** %6
%30 = call i32 @strlen(i8* %29)
%31 = call i32 @write(i32 %27, i8* %28, i32 %30)
%32 = icmp eq i32 %31, -1
br i1 %32, label %33, label %35
33: ; preds = %26
%34 = call i32 @perror(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i64 0, i64 0))
br label %35
35: ; preds = %33, %26
br label %36
36: ; preds = %41, %35
%37 = load i32, i32* %3
%38 = load i8*, i8** %4
%39 = call i64 @read(i32 %37, i8* %38, i32 42)
%40 = icmp sge i64 %39, 0
br i1 %40, label %41, label %47
41: ; preds = %36
%42 = load i32, i32* %3
%43 = load i8*, i8** %4
%44 = load i8*, i8** %4
%45 = call i32 @strlen(i8* %44)
%46 = call i32 @write(i32 %42, i8* %43, i32 %45)
br label %36
47: ; preds = %36
%48 = load i8*, i8** %4
%49 = call i32 @free(i8* %48)
br label %50
50: ; preds = %47, %15
%51 = load i32, i32* %3
%52 = call i32 @close(i32 %51)
br label %15
53: ; preds = %24, %13
%54 = load i32, i32* %1
ret i32 %54
}

LLVM IR (-O2):
@.str = [7 x i8] c"accept\00"
@.str.1 = [1177 x i8] c"Mais, vous savez, moi je ne crois pas qu'il y ait de bonne ou de mauvaise situation. \0A Moi, si je devais resumer ma vie aujourd'hui avec vous, je dirais que c'est d'abord des rencontres. \0ADes gens qui m'ont tendu la main, peut-etre a un moment ou je ne pouvais pas, ou j'etais seul chez moi. \0AEt c'est assez curieux de se dire que les hasards, les rencontres forgent une destinee... \0AParce que quand on a le gout de la chose, quand on a le gout de la chose bien faite, \0ALe beau geste, parfois on ne trouve pas l'interlocuteur en face, je dirais, le miroir qui vous aide a avancer. \0AAlors ce n'est pas mon cas, comme je le disais la, puisque moi au contraire, j'ai pu ; \0AEt je dis merci a la vie, je lui dis merci, je chante la vie, je danse la vie... Je ne suis qu'amour! \0AEt finalement, quand beaucoup de gens aujourd'hui me disent : \0AMais comment fais-tu pour avoir cette humanite ? \0AEh bien je leur reponds tres simplement, je leur dis que c'est ce gout de l'amour, \0ACe gout donc qui m'a pousse aujourd'hui a entreprendre une construction mecanique. \0AMais demain, qui sait, peut-etre simplement a me mettre au service de la communaute, \0A a faire le don, le don de soi... \0A \00"
@.str.2 = [6 x i8] c"Write\00"
define i32 @main() {
%1 = tail call i32 @creer_serveur(i32 8080)
%2 = tail call i32 (...) @initialiser_signaux()
%3 = tail call i64 @malloc(i32 42)
%4 = inttoptr i64 %3 to i8*
%5 = icmp eq i32 %1, -1
br i1 %5, label %32, label %6
6: ; preds = %0, %30
%7 = tail call i32 @accept(i32 %1, i32* null, i32* null)
%8 = tail call i32 (...) @fork()
%9 = icmp eq i32 %8, 0
br i1 %9, label %10, label %30
10: ; preds = %6
%11 = icmp eq i32 %7, -1
br i1 %11, label %12, label %14
12: ; preds = %10
%13 = tail call i32 @perror(i8* getelementptr inbounds ([7 x i8], [7 x i8]* @.str, i64 0, i64 0))
br label %32
14: ; preds = %10
%15 = tail call i32 @strlen(i8* getelementptr inbounds ([1177 x i8], [1177 x i8]* @.str.1, i64 0, i64 0))
%16 = tail call i32 @write(i32 %7, i8* getelementptr inbounds ([1177 x i8], [1177 x i8]* @.str.1, i64 0, i64 0), i32 %15)
%17 = icmp eq i32 %16, -1
br i1 %17, label %18, label %20
18: ; preds = %14
%19 = tail call i32 @perror(i8* getelementptr inbounds ([6 x i8], [6 x i8]* @.str.2, i64 0, i64 0))
br label %20
20: ; preds = %18, %14
%21 = tail call i64 @read(i32 %7, i8* %4, i32 42)
%22 = icmp sgt i64 %21, -1
br i1 %22, label %23, label %28
23: ; preds = %20, %23
%24 = tail call i32 @strlen(i8* %4)
%25 = tail call i32 @write(i32 %7, i8* %4, i32 %24)
%26 = tail call i64 @read(i32 %7, i8* %4, i32 42)
%27 = icmp sgt i64 %26, -1
br i1 %27, label %23, label %28
28: ; preds = %23, %20
%29 = tail call i32 @free(i8* %4)
br label %30
30: ; preds = %6, %28
%31 = tail call i32 @close(i32 %7)
br label %6
32: ; preds = %12, %0
ret i32 -1
}