No empty .Rs/.Re
[netbsd-mini2440.git] / external / ibm-public / postfix / dist / src / util / sane_link.c
blob4016b9a9a41770432f9526781d1989bcf4395e7b
1 /* $NetBSD$ */
3 /*++
4 /* NAME
5 /* sane_link 3
6 /* SUMMARY
7 /* sanitize link() error returns
8 /* SYNOPSIS
9 /* #include <sane_fsops.h>
11 /* int sane_link(from, to)
12 /* const char *from;
13 /* const char *to;
14 /* DESCRIPTION
15 /* sane_link() implements the link(2) system call, and works
16 /* around some errors that are possible with NFS file systems.
17 /* LICENSE
18 /* .ad
19 /* .fi
20 /* The Secure Mailer license must be distributed with this software.
21 /* AUTHOR(S)
22 /* Wietse Venema
23 /* IBM T.J. Watson Research
24 /* P.O. Box 704
25 /* Yorktown Heights, NY 10598, USA
26 /*--*/
28 /* System library. */
30 #include "sys_defs.h"
31 #include <sys/stat.h>
32 #include <errno.h>
33 #include <unistd.h>
35 /* Utility library. */
37 #include "msg.h"
38 #include "sane_fsops.h"
40 /* sane_link - sanitize link() error returns */
42 int sane_link(const char *from, const char *to)
44 const char *myname = "sane_link";
45 int saved_errno;
46 struct stat from_st;
47 struct stat to_st;
50 * Normal case: link() succeeds.
52 if (link(from, to) >= 0)
53 return (0);
56 * Woops. Save errno, and see if the error is an NFS artefact. If it is,
57 * pretend the error never happened.
59 saved_errno = errno;
60 if (stat(from, &from_st) >= 0 && stat(to, &to_st) >= 0
61 && from_st.st_dev == to_st.st_dev
62 && from_st.st_ino == to_st.st_ino) {
63 msg_info("%s(%s,%s): worked around spurious NFS error",
64 myname, from, to);
65 return (0);
69 * Nope, it didn't. Restore errno and report the error.
71 errno = saved_errno;
72 return (-1);