1181254a7Smrg /* Implementation of the LINK intrinsic.
2*b1e83836Smrg Copyright (C) 2005-2022 Free Software Foundation, Inc.
3181254a7Smrg Contributed by François-Xavier Coudert <coudert@clipper.ens.fr>
4181254a7Smrg
5181254a7Smrg This file is part of the GNU Fortran runtime library (libgfortran).
6181254a7Smrg
7181254a7Smrg Libgfortran is free software; you can redistribute it and/or
8181254a7Smrg modify it under the terms of the GNU General Public
9181254a7Smrg License as published by the Free Software Foundation; either
10181254a7Smrg version 3 of the License, or (at your option) any later version.
11181254a7Smrg
12181254a7Smrg Libgfortran is distributed in the hope that it will be useful,
13181254a7Smrg but WITHOUT ANY WARRANTY; without even the implied warranty of
14181254a7Smrg MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15181254a7Smrg GNU General Public License for more details.
16181254a7Smrg
17181254a7Smrg Under Section 7 of GPL version 3, you are granted additional
18181254a7Smrg permissions described in the GCC Runtime Library Exception, version
19181254a7Smrg 3.1, as published by the Free Software Foundation.
20181254a7Smrg
21181254a7Smrg You should have received a copy of the GNU General Public License and
22181254a7Smrg a copy of the GCC Runtime Library Exception along with this program;
23181254a7Smrg see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
24181254a7Smrg <http://www.gnu.org/licenses/>. */
25181254a7Smrg
26181254a7Smrg #include "libgfortran.h"
27181254a7Smrg
28181254a7Smrg #include <errno.h>
29181254a7Smrg
30181254a7Smrg #ifdef HAVE_UNISTD_H
31181254a7Smrg #include <unistd.h>
32181254a7Smrg #endif
33181254a7Smrg
34181254a7Smrg /* SUBROUTINE LINK(PATH1, PATH2, STATUS)
35181254a7Smrg CHARACTER(len=*), INTENT(IN) :: PATH1, PATH2
36181254a7Smrg INTEGER, INTENT(OUT), OPTIONAL :: STATUS */
37181254a7Smrg
38181254a7Smrg #ifdef HAVE_LINK
39181254a7Smrg
40181254a7Smrg static int
link_internal(char * path1,char * path2,gfc_charlen_type path1_len,gfc_charlen_type path2_len)41181254a7Smrg link_internal (char *path1, char *path2, gfc_charlen_type path1_len,
42181254a7Smrg gfc_charlen_type path2_len)
43181254a7Smrg {
44181254a7Smrg int val;
45181254a7Smrg char *str1, *str2;
46181254a7Smrg
47181254a7Smrg /* Make a null terminated copy of the strings. */
48181254a7Smrg str1 = fc_strdup (path1, path1_len);
49181254a7Smrg str2 = fc_strdup (path2, path2_len);
50181254a7Smrg
51181254a7Smrg val = link (str1, str2);
52181254a7Smrg
53181254a7Smrg free (str1);
54181254a7Smrg free (str2);
55181254a7Smrg
56181254a7Smrg return ((val == 0) ? 0 : errno);
57181254a7Smrg }
58181254a7Smrg
59181254a7Smrg
60181254a7Smrg extern void link_i4_sub (char *, char *, GFC_INTEGER_4 *, gfc_charlen_type,
61181254a7Smrg gfc_charlen_type);
62181254a7Smrg iexport_proto(link_i4_sub);
63181254a7Smrg
64181254a7Smrg void
link_i4_sub(char * path1,char * path2,GFC_INTEGER_4 * status,gfc_charlen_type path1_len,gfc_charlen_type path2_len)65181254a7Smrg link_i4_sub (char *path1, char *path2, GFC_INTEGER_4 *status,
66181254a7Smrg gfc_charlen_type path1_len, gfc_charlen_type path2_len)
67181254a7Smrg {
68181254a7Smrg int val = link_internal (path1, path2, path1_len, path2_len);
69181254a7Smrg
70181254a7Smrg if (status != NULL)
71181254a7Smrg *status = val;
72181254a7Smrg }
73181254a7Smrg iexport(link_i4_sub);
74181254a7Smrg
75181254a7Smrg extern void link_i8_sub (char *, char *, GFC_INTEGER_8 *, gfc_charlen_type,
76181254a7Smrg gfc_charlen_type);
77181254a7Smrg iexport_proto(link_i8_sub);
78181254a7Smrg
79181254a7Smrg void
link_i8_sub(char * path1,char * path2,GFC_INTEGER_8 * status,gfc_charlen_type path1_len,gfc_charlen_type path2_len)80181254a7Smrg link_i8_sub (char *path1, char *path2, GFC_INTEGER_8 *status,
81181254a7Smrg gfc_charlen_type path1_len, gfc_charlen_type path2_len)
82181254a7Smrg {
83181254a7Smrg int val = link_internal (path1, path2, path1_len, path2_len);
84181254a7Smrg
85181254a7Smrg if (status != NULL)
86181254a7Smrg *status = val;
87181254a7Smrg }
88181254a7Smrg iexport(link_i8_sub);
89181254a7Smrg
90181254a7Smrg extern GFC_INTEGER_4 link_i4 (char *, char *, gfc_charlen_type,
91181254a7Smrg gfc_charlen_type);
92181254a7Smrg export_proto(link_i4);
93181254a7Smrg
94181254a7Smrg GFC_INTEGER_4
link_i4(char * path1,char * path2,gfc_charlen_type path1_len,gfc_charlen_type path2_len)95181254a7Smrg link_i4 (char *path1, char *path2, gfc_charlen_type path1_len,
96181254a7Smrg gfc_charlen_type path2_len)
97181254a7Smrg {
98181254a7Smrg return link_internal (path1, path2, path1_len, path2_len);
99181254a7Smrg }
100181254a7Smrg
101181254a7Smrg extern GFC_INTEGER_8 link_i8 (char *, char *, gfc_charlen_type,
102181254a7Smrg gfc_charlen_type);
103181254a7Smrg export_proto(link_i8);
104181254a7Smrg
105181254a7Smrg GFC_INTEGER_8
link_i8(char * path1,char * path2,gfc_charlen_type path1_len,gfc_charlen_type path2_len)106181254a7Smrg link_i8 (char *path1, char *path2, gfc_charlen_type path1_len,
107181254a7Smrg gfc_charlen_type path2_len)
108181254a7Smrg {
109181254a7Smrg return link_internal (path1, path2, path1_len, path2_len);
110181254a7Smrg }
111181254a7Smrg #endif
112