1/* vi: set sw=4 ts=4: */ 2/* 3 * Mini readlink implementation for busybox 4 * 5 * Copyright (C) 2000,2001 Matt Kraai <kraai@alumni.carnegiemellon.edu> 6 * 7 * Licensed under GPL v2 or later, see file LICENSE in this tarball for details. 8 */ 9 10#include <getopt.h> 11 12#include "libbb.h" 13 14int readlink_main(int argc, char **argv); 15int readlink_main(int argc, char **argv) 16{ 17 char *buf; 18 char *fname; 19 20 USE_FEATURE_READLINK_FOLLOW( 21 unsigned opt; 22 /* We need exactly one non-option argument. */ 23 opt_complementary = "=1"; 24 opt = getopt32(argv, "f"); 25 fname = argv[optind]; 26 ) 27 SKIP_FEATURE_READLINK_FOLLOW( 28 const unsigned opt = 0; 29 if (argc != 2) bb_show_usage(); 30 fname = argv[1]; 31 ) 32 33 /* compat: coreutils readlink reports errors silently via exit code */ 34 logmode = LOGMODE_NONE; 35 36 if (opt) { 37 buf = realpath(fname, bb_common_bufsiz1); 38 } else { 39 buf = xmalloc_readlink_or_warn(fname); 40 } 41 42 if (!buf) 43 return EXIT_FAILURE; 44 puts(buf); 45 46 if (ENABLE_FEATURE_CLEAN_UP && !opt) 47 free(buf); 48 49 fflush_stdout_and_exit(EXIT_SUCCESS); 50} 51