162306a36Sopenharmony_ci/* 262306a36Sopenharmony_ci * Copyright © 2018 Alexey Dobriyan <adobriyan@gmail.com> 362306a36Sopenharmony_ci * 462306a36Sopenharmony_ci * Permission to use, copy, modify, and distribute this software for any 562306a36Sopenharmony_ci * purpose with or without fee is hereby granted, provided that the above 662306a36Sopenharmony_ci * copyright notice and this permission notice appear in all copies. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 962306a36Sopenharmony_ci * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1062306a36Sopenharmony_ci * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1162306a36Sopenharmony_ci * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1262306a36Sopenharmony_ci * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1362306a36Sopenharmony_ci * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1462306a36Sopenharmony_ci * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1562306a36Sopenharmony_ci */ 1662306a36Sopenharmony_ci/* Test readlink /proc/self/map_files/... */ 1762306a36Sopenharmony_ci#include <errno.h> 1862306a36Sopenharmony_ci#include <sys/types.h> 1962306a36Sopenharmony_ci#include <sys/stat.h> 2062306a36Sopenharmony_ci#include <fcntl.h> 2162306a36Sopenharmony_ci#include <stdio.h> 2262306a36Sopenharmony_ci#include <unistd.h> 2362306a36Sopenharmony_ci#include <sys/mman.h> 2462306a36Sopenharmony_ci#include <stdlib.h> 2562306a36Sopenharmony_ci 2662306a36Sopenharmony_cistatic void pass(const char *fmt, unsigned long a, unsigned long b) 2762306a36Sopenharmony_ci{ 2862306a36Sopenharmony_ci char name[64]; 2962306a36Sopenharmony_ci char buf[64]; 3062306a36Sopenharmony_ci 3162306a36Sopenharmony_ci snprintf(name, sizeof(name), fmt, a, b); 3262306a36Sopenharmony_ci if (readlink(name, buf, sizeof(buf)) == -1) 3362306a36Sopenharmony_ci exit(1); 3462306a36Sopenharmony_ci} 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_cistatic void fail(const char *fmt, unsigned long a, unsigned long b) 3762306a36Sopenharmony_ci{ 3862306a36Sopenharmony_ci char name[64]; 3962306a36Sopenharmony_ci char buf[64]; 4062306a36Sopenharmony_ci 4162306a36Sopenharmony_ci snprintf(name, sizeof(name), fmt, a, b); 4262306a36Sopenharmony_ci if (readlink(name, buf, sizeof(buf)) == -1 && errno == ENOENT) 4362306a36Sopenharmony_ci return; 4462306a36Sopenharmony_ci exit(1); 4562306a36Sopenharmony_ci} 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_ciint main(void) 4862306a36Sopenharmony_ci{ 4962306a36Sopenharmony_ci const unsigned int PAGE_SIZE = sysconf(_SC_PAGESIZE); 5062306a36Sopenharmony_ci void *p; 5162306a36Sopenharmony_ci int fd; 5262306a36Sopenharmony_ci unsigned long a, b; 5362306a36Sopenharmony_ci 5462306a36Sopenharmony_ci fd = open("/dev/zero", O_RDONLY); 5562306a36Sopenharmony_ci if (fd == -1) 5662306a36Sopenharmony_ci return 1; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ci p = mmap(NULL, PAGE_SIZE, PROT_NONE, MAP_PRIVATE|MAP_FILE, fd, 0); 5962306a36Sopenharmony_ci if (p == MAP_FAILED) 6062306a36Sopenharmony_ci return 1; 6162306a36Sopenharmony_ci 6262306a36Sopenharmony_ci a = (unsigned long)p; 6362306a36Sopenharmony_ci b = (unsigned long)p + PAGE_SIZE; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci pass("/proc/self/map_files/%lx-%lx", a, b); 6662306a36Sopenharmony_ci fail("/proc/self/map_files/ %lx-%lx", a, b); 6762306a36Sopenharmony_ci fail("/proc/self/map_files/%lx -%lx", a, b); 6862306a36Sopenharmony_ci fail("/proc/self/map_files/%lx- %lx", a, b); 6962306a36Sopenharmony_ci fail("/proc/self/map_files/%lx-%lx ", a, b); 7062306a36Sopenharmony_ci fail("/proc/self/map_files/0%lx-%lx", a, b); 7162306a36Sopenharmony_ci fail("/proc/self/map_files/%lx-0%lx", a, b); 7262306a36Sopenharmony_ci if (sizeof(long) == 4) { 7362306a36Sopenharmony_ci fail("/proc/self/map_files/100000000%lx-%lx", a, b); 7462306a36Sopenharmony_ci fail("/proc/self/map_files/%lx-100000000%lx", a, b); 7562306a36Sopenharmony_ci } else if (sizeof(long) == 8) { 7662306a36Sopenharmony_ci fail("/proc/self/map_files/10000000000000000%lx-%lx", a, b); 7762306a36Sopenharmony_ci fail("/proc/self/map_files/%lx-10000000000000000%lx", a, b); 7862306a36Sopenharmony_ci } else 7962306a36Sopenharmony_ci return 1; 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci return 0; 8262306a36Sopenharmony_ci} 83