1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
/*
* Copyright (C) 2012-2013 Red Hat, Inc. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General Public
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
*
* Authors: Jan Synacek <jsynacek@redhat.com>
*/
#ifndef _FILE_H
#define _FILE_H
#include <linux/limits.h>
#include <sys/stat.h>
#include <dirent.h>
#include <stdlib.h>
#include <string.h>
#include <limits.h>
#include <libgen.h>
#include <konkret/konkret.h>
#include <assert.h>
#include <libudev.h>
#include "globals.h"
#ifndef BUFLEN
#define BUFLEN 512
#endif
#ifndef PATH_MAX
#define PATH_MAX 4096
#endif
#define FSCREATIONCLASSNAME "LMI_LocalFileSystem"
#define sb_permmask(sb) ((sb).st_mode & (S_IRWXU | S_IRWXG | S_IRWXO))
#define sb_isreadable(sb) ( \
(sb_permmask(sb) & S_IRUSR) || \
(sb_permmask(sb) & S_IRGRP) || \
(sb_permmask(sb) & S_IROTH) \
)
#define sb_iswriteable(sb) ( \
(sb_permmask(sb) & S_IWUSR) || \
(sb_permmask(sb) & S_IWGRP) || \
(sb_permmask(sb) & S_IWOTH) \
)
#define sb_isexecutable(sb) ( \
(sb_permmask(sb) & S_IXUSR) || \
(sb_permmask(sb) & S_IXGRP) || \
(sb_permmask(sb) & S_IXOTH) \
)
#define stoms(t) ((t)*1000000)
#define fill_logicalfile(type, obj, name, fsname, creation_class) \
type##_Set_Name((obj), (name)); \
type##_Set_CSCreationClassName((obj), get_system_creation_class_name()); \
type##_Set_CSName((obj), get_system_name()); \
type##_Set_FSCreationClassName((obj), FSCREATIONCLASSNAME); \
type##_Set_FSName((obj), (fsname)); \
type##_Set_CreationClassName((obj), (creation_class));
#define fill_basic(cmpitype, path, stattype, error) \
struct stat sb; \
char errmsg[BUFLEN]; \
\
if (lstat((path), &sb) < 0 || !(sb.st_mode & S_IFMT & (stattype))) { \
snprintf(errmsg, BUFLEN, error, (path)); \
CMReturnWithChars(_cb, CMPI_RC_ERR_NOT_FOUND, errmsg); \
} \
\
LMI_##cmpitype##_Set_Readable(&lmi_file, sb_isreadable(sb)); \
LMI_##cmpitype##_Set_Writeable(&lmi_file, sb_iswriteable(sb)); \
LMI_##cmpitype##_Set_Executable(&lmi_file, sb_isexecutable(sb)); \
LMI_##cmpitype##_Set_FileSize(&lmi_file, sb.st_size); \
LMI_##cmpitype##_Set_LastAccessed(&lmi_file, CMNewDateTimeFromBinary(_cb, stoms(sb.st_atime), 0, NULL)); \
LMI_##cmpitype##_Set_LastModified(&lmi_file, CMNewDateTimeFromBinary(_cb, stoms(sb.st_mtime), 0, NULL));
#define get_instance(cmpitype, stattype, error) \
LMI_##cmpitype lmi_file; \
CMPIStatus st; \
\
LMI_##cmpitype##_InitFromObjectPath(&lmi_file, _cb, cop); \
st = lmi_check_required(_cb, cop, LOGICALFILE); \
if (st.rc != CMPI_RC_OK) { \
return st; \
} \
fill_basic(cmpitype, KChars(lmi_file.Name.value), stattype, error) \
KReturnInstance(cr, lmi_file);
enum RequiredNames {
LOGICALFILE,
UNIXFILE,
};
CMPIStatus lmi_check_required(const CMPIBroker *, const CMPIObjectPath *, const enum RequiredNames);
void get_class_from_stat(const struct stat *, char *);
int get_class_from_path(const char *, char *);
int get_fsname_from_stat(const struct stat *, char **);
int get_fsname_from_path(const char *, char **);
const char *get_string_property_from_op(const CMPIObjectPath *, const char *);
void _dump_objectpath(const CMPIObjectPath *);
#endif /* _FILE_H */
/* vi: set et: */
|