Most valid use of goto can be achieved by using a simple break:
int foobar(const char *file)
{
int status = 0;
int fd;
struct stat sb;
void *data;
do {
if ((fd = open(file, O_RDONLY)) == -1) break;
status = 1;
if (fstat(fd, &sb) == -1) break;
if ((data = mmap(NULL, (size_t)sb.st_size, PROT_READ, MAP_ANON | MAP_PRIVATE, fd, 0)) == NULL)
break;
status = 2;
// ...
} while (0);
switch (status)
{
case 2:
munmap(data, (size_t)sb.st_size);
case 1:
close(fd);
default: break;
}
return status == 0;
}