(root)/
coreutils-9.4/
src/
link.c
       1  /* link utility for GNU.
       2     Copyright (C) 2001-2023 Free Software Foundation, Inc.
       3  
       4     This program is free software: you can redistribute it and/or modify
       5     it under the terms of the GNU General Public License as published by
       6     the Free Software Foundation, either version 3 of the License, or
       7     (at your option) any later version.
       8  
       9     This program is distributed in the hope that it will be useful,
      10     but WITHOUT ANY WARRANTY; without even the implied warranty of
      11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
      12     GNU General Public License for more details.
      13  
      14     You should have received a copy of the GNU General Public License
      15     along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
      16  
      17  /* Written by Michael Stone */
      18  
      19  /* Implementation overview:
      20  
      21     Simply call the system 'link' function */
      22  
      23  #include <config.h>
      24  #include <stdio.h>
      25  #include <sys/types.h>
      26  
      27  #include "system.h"
      28  #include "long-options.h"
      29  #include "quote.h"
      30  
      31  /* The official name of this program (e.g., no 'g' prefix).  */
      32  #define PROGRAM_NAME "link"
      33  
      34  #define AUTHORS proper_name ("Michael Stone")
      35  
      36  void
      37  usage (int status)
      38  {
      39    if (status != EXIT_SUCCESS)
      40      emit_try_help ();
      41    else
      42      {
      43        printf (_("\
      44  Usage: %s FILE1 FILE2\n\
      45    or:  %s OPTION\n"), program_name, program_name);
      46        fputs (_("Call the link function to create a link named FILE2\
      47   to an existing FILE1.\n\n"),
      48               stdout);
      49        fputs (HELP_OPTION_DESCRIPTION, stdout);
      50        fputs (VERSION_OPTION_DESCRIPTION, stdout);
      51        emit_ancillary_info (PROGRAM_NAME);
      52      }
      53    exit (status);
      54  }
      55  
      56  int
      57  main (int argc, char **argv)
      58  {
      59    initialize_main (&argc, &argv);
      60    set_program_name (argv[0]);
      61    setlocale (LC_ALL, "");
      62    bindtextdomain (PACKAGE, LOCALEDIR);
      63    textdomain (PACKAGE);
      64  
      65    atexit (close_stdout);
      66  
      67    parse_gnu_standard_options_only (argc, argv, PROGRAM_NAME, PACKAGE_NAME,
      68                                     Version, true, usage, AUTHORS,
      69                                     (char const *) nullptr);
      70  
      71    if (argc < optind + 2)
      72      {
      73        if (argc < optind + 1)
      74          error (0, 0, _("missing operand"));
      75        else
      76          error (0, 0, _("missing operand after %s"), quote (argv[optind]));
      77        usage (EXIT_FAILURE);
      78      }
      79  
      80    if (optind + 2 < argc)
      81      {
      82        error (0, 0, _("extra operand %s"), quote (argv[optind + 2]));
      83        usage (EXIT_FAILURE);
      84      }
      85  
      86    if (link (argv[optind], argv[optind + 1]) != 0)
      87      error (EXIT_FAILURE, errno, _("cannot create link %s to %s"),
      88             quoteaf_n (0, argv[optind + 1]), quoteaf_n (1, argv[optind]));
      89  
      90    return EXIT_SUCCESS;
      91  }