Changeset View
Changeset View
Standalone View
Standalone View
ksysguardd/Linux/softraid.c
Show First 20 Lines • Show All 209 Lines • ▼ Show 20 Line(s) | 205 | void getMdadmDetail( ArrayInfo* MyArray ) { | |||
---|---|---|---|---|---|
210 | char sensorName[128]; | 210 | char sensorName[128]; | ||
211 | char arrayDevice[ARRAYNAMELEN + 5 + 1]; | 211 | char arrayDevice[ARRAYNAMELEN + 5 + 1]; | ||
212 | char format[ 32 ]; | 212 | char format[ 32 ]; | ||
213 | char lineBuf[ 1024 ]; | 213 | char lineBuf[ 1024 ]; | ||
214 | char mdadmStatBuf[ MDADMSTATBUFSIZE ]; /* Buffer for mdadm --detail */ | 214 | char mdadmStatBuf[ MDADMSTATBUFSIZE ]; /* Buffer for mdadm --detail */ | ||
215 | char* mdadmStatBufP; | 215 | char* mdadmStatBufP; | ||
216 | 216 | | |||
217 | /* Create a pipe */ | 217 | /* Create a pipe */ | ||
218 | if(pipe(fd) == -1) | 218 | if(pipe2(fd, O_CLOEXEC) == -1) | ||
219 | { | 219 | { | ||
220 | perror("Could not create a pipe to launch mdadm."); | 220 | perror("Could not create a pipe to launch mdadm."); | ||
221 | exit(1); | 221 | exit(1); | ||
222 | } | 222 | } | ||
223 | 223 | | |||
224 | /* Fork */ | 224 | /* Fork */ | ||
225 | if((ChildPID = fork()) == -1) | 225 | if((ChildPID = fork()) == -1) | ||
226 | { | 226 | { | ||
227 | perror("Could not fork to launch mdadm."); | 227 | perror("Could not fork to launch mdadm."); | ||
228 | exit(1); | 228 | exit(1); | ||
229 | } | 229 | } | ||
230 | 230 | | |||
231 | /* Child will execute the program, parent will listen. */ | 231 | /* Child will execute the program, parent will listen. */ | ||
232 | 232 | | |||
233 | if (ChildPID == 0) { | 233 | if (ChildPID == 0) { | ||
234 | /* Child process */ | 234 | /* Child process */ | ||
235 | 235 | | |||
236 | /* Child will execute the program, parent will listen. */ | 236 | /* Child will execute the program, parent will listen. */ | ||
237 | /* Close stdout, duplicate the input side of pipe to stdout */ | 237 | /* Close stdout, duplicate the input side of pipe to stdout */ | ||
238 | dup2(fd[1], 1); | 238 | dup2(fd[1], 1); | ||
239 | /* Close output side of pipe */ | | |||
240 | close(fd[0]); | 239 | close(fd[0]); | ||
241 | close(2); | 240 | close(2); | ||
242 | 241 | | |||
243 | snprintf( arrayDevice, sizeof( arrayDevice ), "/dev/%s", MyArray->ArrayName ); | 242 | snprintf( arrayDevice, sizeof( arrayDevice ), "/dev/%s", MyArray->ArrayName ); | ||
244 | execl ("/sbin/mdadm", "mdadm", "--detail", arrayDevice, (char *)0); | 243 | execl ("/sbin/mdadm", "mdadm", "--detail", arrayDevice, (char *)0); | ||
245 | exit(0); /* In case /sbin/mdadm isn't found */ | 244 | exit(0); /* In case /sbin/mdadm isn't found */ | ||
246 | /* Child is now dead, as per our request */ | 245 | /* Child is now dead, as per our request */ | ||
247 | } | 246 | } | ||
248 | 247 | | |||
249 | /* Parent process */ | 248 | /* Parent process */ | ||
250 | 249 | | |||
251 | /* Close input side of pipe */ | | |||
252 | close(fd[1]); | | |||
253 | | ||||
254 | waitpid( ChildPID, 0, 0); | 250 | waitpid( ChildPID, 0, 0); | ||
255 | 251 | | |||
256 | /* Fill mdadmStatBuf with pipe's output */ | 252 | /* Fill mdadmStatBuf with pipe's output */ | ||
257 | nbytes = read( fd[0], mdadmStatBuf, MDADMSTATBUFSIZE-1 ); | 253 | nbytes = read( fd[0], mdadmStatBuf, MDADMSTATBUFSIZE-1 ); | ||
258 | if (nbytes >= 0) | 254 | if (nbytes >= 0) | ||
259 | mdadmStatBuf[nbytes] = '\0'; | 255 | mdadmStatBuf[nbytes] = '\0'; | ||
260 | 256 | | |||
261 | /* Now, go through mdadmStatBuf line by line. Register monitors along the way */ | 257 | /* Now, go through mdadmStatBuf line by line. Register monitors along the way */ | ||
Show All 30 Lines | 286 | else if ( sscanf(lineBuf, "Preferred Minor : %d", &MyArray->PreferredMinor) == 1 ) { | |||
292 | if ( !MyArray->PreferredMinorIsRegistered ) { | 288 | if ( !MyArray->PreferredMinorIsRegistered ) { | ||
293 | sprintf(sensorName, "SoftRaid/%s/PreferredMinor", MyArray->ArrayName); | 289 | sprintf(sensorName, "SoftRaid/%s/PreferredMinor", MyArray->ArrayName); | ||
294 | registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM ); | 290 | registerMonitor(sensorName, "integer", printArrayAttribute, printArrayAttributeInfo, StatSM ); | ||
295 | MyArray->PreferredMinorIsRegistered = true; | 291 | MyArray->PreferredMinorIsRegistered = true; | ||
296 | } | 292 | } | ||
297 | } | 293 | } | ||
298 | } | 294 | } | ||
299 | 295 | | |||
296 | /* Close pipe */ | ||||
297 | close(fd[0]); | ||||
298 | close(fd[1]); | ||||
299 | | ||||
300 | /* Note: Don't test NumBlocksIsAlive, because it hasn't been set yet */ | 300 | /* Note: Don't test NumBlocksIsAlive, because it hasn't been set yet */ | ||
301 | if ( (!MyArray->ArraySizeIsAlive && MyArray->ArraySizeIsRegistered ) || | 301 | if ( (!MyArray->ArraySizeIsAlive && MyArray->ArraySizeIsRegistered ) || | ||
302 | (!MyArray->UsedDeviceSizeIsAlive && MyArray->UsedDeviceSizeIsRegistered ) || | 302 | (!MyArray->UsedDeviceSizeIsAlive && MyArray->UsedDeviceSizeIsRegistered ) || | ||
303 | (!MyArray->PreferredMinorIsAlive && MyArray->PreferredMinorIsRegistered ) | 303 | (!MyArray->PreferredMinorIsAlive && MyArray->PreferredMinorIsRegistered ) | ||
304 | ) { | 304 | ) { | ||
305 | print_error( "RECONFIGURE" ); | 305 | print_error( "RECONFIGURE" ); | ||
306 | log_error( "Soft raid device disappeared" ); | 306 | log_error( "Soft raid device disappeared" ); | ||
307 | return; | 307 | return; | ||
▲ Show 20 Lines • Show All 308 Lines • Show Last 20 Lines |