@@ -95,11 +95,91 @@ where
95
95
Ok ( ( ) )
96
96
}
97
97
98
+ /// Set the process-wide priority mask to `mask` and return the previous mask
99
+ /// value.
100
+ ///
101
+ /// Calls to `syslog()` with a priority level not set in `mask` are ignored. The
102
+ /// default is to log all priorities.
103
+ ///
104
+ /// If the `mask` argument is `None`, the current logmask is not modified, this
105
+ /// can be used to query the current log mask.
106
+ pub fn setlogmask ( mask : Option < LogMask > ) -> LogMask {
107
+ let mask = match mask {
108
+ Some ( mask) => mask. 0 ,
109
+ None => 0 ,
110
+ } ;
111
+
112
+ let prev_mask = unsafe {
113
+ libc:: setlogmask ( mask)
114
+ } ;
115
+
116
+ LogMask ( prev_mask)
117
+ }
118
+
98
119
/// Closes the log file.
99
120
pub fn closelog ( ) {
100
121
unsafe { libc:: closelog ( ) }
101
122
}
102
123
124
+ /// System log priority mask.
125
+ #[ derive( Debug , Clone , Copy ) ]
126
+ pub struct LogMask ( libc:: c_int ) ;
127
+
128
+ impl LogMask {
129
+ /// Creates a mask of all priorities up to and including `priority`.
130
+ #[ doc( alias( "LOG_UPTO" ) ) ]
131
+ pub fn up_to ( priority : Severity ) -> Self {
132
+ let pri = priority as libc:: c_int ;
133
+ Self ( ( 1 << ( pri + 1 ) ) - 1 )
134
+ }
135
+
136
+ /// Creates a mask for the specified priority.
137
+ #[ doc( alias( "LOG_MASK" ) ) ]
138
+ pub fn of_priority ( priority : Severity ) -> Self {
139
+ let pri = priority as libc:: c_int ;
140
+ Self ( 1 << pri)
141
+ }
142
+
143
+ /// Returns if the mask for the specified `priority` is set.
144
+ pub fn contains ( & self , priority : Severity ) -> bool {
145
+ let pri = priority as libc:: c_int ;
146
+ ( self . 0 & ( 1 << pri) ) != 0
147
+ }
148
+ }
149
+
150
+ impl std:: ops:: BitOr for LogMask {
151
+ type Output = Self ;
152
+ fn bitor ( self , rhs : Self ) -> Self :: Output {
153
+ Self ( self . 0 | rhs. 0 )
154
+ }
155
+ }
156
+
157
+ impl std:: ops:: BitAnd for LogMask {
158
+ type Output = Self ;
159
+ fn bitand ( self , rhs : Self ) -> Self :: Output {
160
+ Self ( self . 0 & rhs. 0 )
161
+ }
162
+ }
163
+
164
+ impl std:: ops:: BitOrAssign for LogMask {
165
+ fn bitor_assign ( & mut self , rhs : Self ) {
166
+ self . 0 |= rhs. 0 ;
167
+ }
168
+ }
169
+
170
+ impl std:: ops:: BitAndAssign for LogMask {
171
+ fn bitand_assign ( & mut self , rhs : Self ) {
172
+ self . 0 &= rhs. 0 ;
173
+ }
174
+ }
175
+
176
+ impl std:: ops:: Not for LogMask {
177
+ type Output = Self ;
178
+ fn not ( self ) -> Self :: Output {
179
+ Self ( !self . 0 )
180
+ }
181
+ }
182
+
103
183
/// The priority for a log message.
104
184
#[ derive( Debug , Clone , Copy ) ]
105
185
pub struct Priority ( libc:: c_int ) ;
0 commit comments