Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/branches/SMLNJ/src/runtime/c-libs/posix-filesys/pathconf.c
ViewVC logotype

Annotation of /sml/branches/SMLNJ/src/runtime/c-libs/posix-filesys/pathconf.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 8 - (view) (download) (as text)

1 : monnier 2 /* pathconf.c
2 :     *
3 :     * COPYRIGHT (c) 1995 by AT&T Bell Laboratories.
4 :     */
5 :    
6 :     #include "ml-unixdep.h"
7 :     #include <unistd.h>
8 :     #include <errno.h>
9 :     #include "ml-base.h"
10 :     #include "ml-values.h"
11 :     #include "ml-objects.h"
12 :     #include "ml-c.h"
13 :     #include "cfun-proto-list.h"
14 :     #include "../posix-error/posix-name-val.h"
15 :    
16 :     /* The following table is generated from all _PC_ values
17 :     * in unistd.h. For most systems, this will include
18 :     _PC_CHOWN_RESTRICTED
19 :     _PC_LINK_MAX
20 :     _PC_MAX_CANON
21 :     _PC_MAX_INPUT
22 :     _PC_NAME_MAX
23 :     _PC_NO_TRUNC
24 :     _PC_PATH_MAX
25 :     _PC_PIPE_BUF
26 :     _PC_VDISABLE
27 :     *
28 :     * The full POSIX list is given in section 5.7.1 of Std 1003.1b-1993.
29 :     *
30 :     * The SML string used to look up these values has the same
31 :     * form but without the prefix, e.g., to lookup _PC_LINK_MAX,
32 :     * use pathconf (path, "LINK_MAX")
33 :     */
34 :     static name_val_t values[] = {
35 :     #include "ml_pathconf.h"
36 :     };
37 :    
38 :     #define NUMELMS ((sizeof values)/(sizeof (name_val_t)))
39 :    
40 :     /* mkValue
41 :     *
42 :     * Convert return value from (f)pathconf to ML value.
43 :     */
44 :     static ml_val_t mkValue (ml_state_t *msp, int val)
45 :     {
46 :     ml_val_t p, obj;
47 :    
48 :     if (val >= 0) {
49 : monnier 8 WORD_ALLOC (msp, p, val);
50 :     OPTION_SOME(msp, obj, p);
51 : monnier 2 }
52 :     else if (errno == 0)
53 : monnier 8 obj = OPTION_NONE;
54 : monnier 2 else
55 : monnier 8 obj = RAISE_SYSERR(msp, val);
56 : monnier 2
57 :     return obj;
58 :    
59 :     } /* end of mkValue */
60 :    
61 :     /* _ml_P_FileSys_pathconf : string * string -> word option
62 :     * filename attribute
63 :     *
64 :     * Get configurable pathname attribute given pathname
65 :     */
66 :     ml_val_t _ml_P_FileSys_pathconf (ml_state_t *msp, ml_val_t arg)
67 :     {
68 :     int val;
69 :     char *pathname = REC_SELPTR(char, arg, 0);
70 :     name_val_t *attr;
71 :    
72 :     attr = _ml_posix_nv_lookup (REC_SELPTR(char, arg, 1), values, NUMELMS);
73 :     if (!attr) {
74 : monnier 8 errno = EINVAL;
75 :     return RAISE_SYSERR(msp, -1);
76 : monnier 2 }
77 :    
78 :     errno = 0;
79 :     while (((val = pathconf (pathname, attr->val)) == -1) && (errno == EINTR)) {
80 :     errno = 0;
81 :     continue;
82 :     }
83 :    
84 :     return (mkValue (msp, val));
85 :    
86 :     } /* end of _ml_P_FileSys_pathconf */
87 :    
88 :     /* _ml_P_FileSys_fpathconf : int * string -> word option
89 :     * fd attribute
90 :     *
91 :     * Get configurable pathname attribute given pathname
92 :     */
93 :     ml_val_t _ml_P_FileSys_fpathconf (ml_state_t *msp, ml_val_t arg)
94 :     {
95 :     int val;
96 :     int fd = REC_SELINT(arg, 0);
97 :     name_val_t *attr;
98 :    
99 :     attr = _ml_posix_nv_lookup (REC_SELPTR(char, arg, 1), values, NUMELMS);
100 :     if (!attr) {
101 : monnier 8 errno = EINVAL;
102 :     return RAISE_SYSERR(msp, -1);
103 : monnier 2 }
104 :    
105 :     errno = 0;
106 :     while (((val = fpathconf (fd, attr->val)) == -1) && (errno == EINTR)) {
107 :     errno = 0;
108 :     continue;
109 :     }
110 :    
111 :     return mkValue (msp, val);
112 :    
113 :     } /* end of _ml_P_FileSys_fpathconf */

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0