You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
2.3 KiB

--- a/diags/diag_disk.c
+++ b/diags/diag_disk.c
@@ -38,7 +38,8 @@
#include "encl_util.h"
-#define OUTPUT_PATH "/var/log/ppc64-diag/diag_disk"
+#define DIAG_OUTPUT_PATH "/var/log/ppc64-diag/"
+#define DISK_OUTPUT_PATH DIAG_OUTPUT_PATH"diag_disk"
#define SYSFS_SG_PATH "/sys/class/scsi_generic"
#define DEVICE_TREE "/proc/device-tree/"
#define DEVICE_TREE_SYSTEM_ID DEVICE_TREE"system-id"
@@ -142,12 +143,53 @@
return 0;
}
-static inline int open_output_xml_file(const char *xml_filename)
+static inline void dir_sync(char * path)
+{
+ int dir_fd;
+
+ dir_fd = open(path, O_RDONLY|O_DIRECTORY);
+ if (dir_fd >= 0) {
+ fsync(dir_fd);
+ close(dir_fd);
+ }
+}
+
+static int open_output_xml_file(const char *xml_filename)
{
char filename[PATH_MAX];
+ int rc;
+
+ rc = access(DISK_OUTPUT_PATH, W_OK);
+ if (rc) {
+ /* Return if it fails with error code other than ENOENT */
+ if (errno != ENOENT)
+ return -1;
+
+ /* Check for the existence of parent directory */
+ rc = access(DIAG_OUTPUT_PATH, W_OK);
+ if (rc) {
+ if (errno != ENOENT)
+ return -1;
+
+ rc = mkdir(DIAG_OUTPUT_PATH,
+ S_IRGRP | S_IRUSR | S_IWGRP | S_IWUSR | S_IXUSR);
+ if (rc)
+ return -1;
+
+ dir_sync(DIAG_OUTPUT_PATH);
+ }
+
+ rc = mkdir(DISK_OUTPUT_PATH,
+ S_IRGRP | S_IRUSR | S_IWGRP | S_IWUSR | S_IXUSR);
+ if (rc)
+ return -1;
+
+ dir_sync(DISK_OUTPUT_PATH);
+ }
+
snprintf(filename, sizeof(filename) - 1, "%s/%s",
- OUTPUT_PATH, xml_filename);
+ DISK_OUTPUT_PATH, xml_filename);
result_file = fopen(filename, "w");
if (!result_file)
@@ -349,9 +391,8 @@
DIR *d;
struct dirent *namelist;
char filename[PATH_MAX];
- int dir_fd;
-
- d = opendir(OUTPUT_PATH);
+
+ d = opendir(DISK_OUTPUT_PATH);
if (!d)
return -errno;
@@ -359,22 +400,17 @@
if (namelist->d_name[0] == '.')
continue;
- snprintf(filename, sizeof(filename) - 1, "%s/%s", OUTPUT_PATH,
- namelist->d_name);
+ snprintf(filename, sizeof(filename) - 1, "%s/%s",
+ DISK_OUTPUT_PATH, namelist->d_name);
if (unlink(filename) < 0) {
fprintf(stderr,
"\nUnable to remove old log file[%s]. continuing.\n\n",
filename);
}
}
+
closedir(d);
-
- dir_fd = open(OUTPUT_PATH, O_RDONLY|O_DIRECTORY);
- if (dir_fd >= 0) {
- fsync(dir_fd);
- close(dir_fd);
- }
-
+ dir_sync(DISK_OUTPUT_PATH);
return 0;
}