Postfix3.3.1
file_id.c
[詳解]
1 /*++
2 /* NAME
3 /* file_id 3
4 /* SUMMARY
5 /* file ID printable representation
6 /* SYNOPSIS
7 /* #include <file_id.h>
8 /*
9 /* const char *get_file_id_fd(fd, long_flag)
10 /* int fd;
11 /* int long_flag;
12 /*
13 /* const char *get_file_id_st(st, long_flag)
14 /* struct stat *st;
15 /* int long_flag;
16 /*
17 /* const char *get_file_id(fd)
18 /* int fd;
19 /* DESCRIPTION
20 /* get_file_id_fd() queries the operating system for the unique
21 /* file identifier for the specified file descriptor and returns
22 /* a printable representation. The result is volatile. Make
23 /* a copy if it is to be used for any appreciable amount of
24 /* time.
25 /*
26 /* get_file_id_st() returns the unique identifier for the
27 /* specified file status information.
28 /*
29 /* get_file_id() provides binary compatibility for old programs.
30 /* This function should not be used by new programs.
31 /*
32 /* Arguments:
33 /* .IP fd
34 /* A valid file descriptor that is associated with an open file.
35 /* .IP st
36 /* The result from e.g., stat(2) or fstat(2).
37 /* .IP long_flag
38 /* Encode the result as appropriate for long or short queue
39 /* identifiers.
40 /* DIAGNOSTICS
41 /* All errors are fatal.
42 /* LICENSE
43 /* .ad
44 /* .fi
45 /* The Secure Mailer license must be distributed with this software.
46 /* AUTHOR(S)
47 /* Wietse Venema
48 /* IBM T.J. Watson Research
49 /* P.O. Box 704
50 /* Yorktown Heights, NY 10598, USA
51 /*--*/
52 
53 /* System library. */
54 
55 #include <sys_defs.h>
56 #include <sys/stat.h>
57 #include <string.h>
58 
59 /* Utility library */
60 
61 #include <msg.h>
62 #include <vstring.h>
63 #include <warn_stat.h>
64 
65 /* Global library. */
66 
67 #define MAIL_QUEUE_INTERNAL
68 #include <mail_queue.h>
69 #include "file_id.h"
70 
71 /* get_file_id - binary compatibility */
72 
73 const char *get_file_id(int fd)
74 {
75  return (get_file_id_fd(fd, 0));
76 }
77 
78 /* get_file_id_fd - return printable file identifier for file descriptor */
79 
80 const char *get_file_id_fd(int fd, int long_flag)
81 {
82  struct stat st;
83 
84  if (fstat(fd, &st) < 0)
85  msg_fatal("fstat: %m");
86  return (get_file_id_st(&st, long_flag));
87 }
88 
89 /* get_file_id_st - return printable file identifier for file status */
90 
91 const char *get_file_id_st(struct stat * st, int long_flag)
92 {
93  static VSTRING *result;
94 
95  if (result == 0)
96  result = vstring_alloc(1);
97  if (long_flag)
98  return (MQID_LG_ENCODE_INUM(result, st->st_ino));
99  else
100  return (MQID_SH_ENCODE_INUM(result, st->st_ino));
101 }
#define stat(p, s)
Definition: warn_stat.h:18
VSTRING * vstring_alloc(ssize_t len)
Definition: vstring.c:353
NORETURN msg_fatal(const char *fmt,...)
Definition: msg.c:249
const char * get_file_id(int fd)
Definition: file_id.c:73
const char * get_file_id_fd(int fd, int long_flag)
Definition: file_id.c:80
const char * get_file_id_st(struct stat *st, int long_flag)
Definition: file_id.c:91
#define fstat(f, s)
Definition: warn_stat.h:20