36 #define _FILE_OFFSET_BITS 64
41 #include <sys/types.h>
46 #if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
47 #include <sys/xattr.h>
63 if (
fstat(fd, &st) || strlen(value) != 8)
return;
65 if (!
xCS.Attr.Cks.Set(
"adler32") || !
xCS.Attr.Cks.Set(value,8))
return;
67 xCS.Attr.Cks.fmTime =
static_cast<long long>(st.st_mtime);
68 xCS.Attr.Cks.csTime =
static_cast<int>(time(0) - st.st_mtime);
74 #if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
75 fremovexattr(fd, attr);
76 #elif defined(__solaris__)
78 attrfd = openat(fd, attr, O_XATTR|O_RDONLY);
80 {unlinkat(attrfd, attr, 0);
close(attrfd);}
87 char mtime[12], attr_val[25], *p;
90 if (
fstat(fd, &st))
return 0;
91 sprintf(mtime,
"%lld", (
long long) st.st_mtime);
93 #if defined(__linux__) || defined(__GNU__) || (defined(__FreeBSD_kernel__) && defined(__GLIBC__))
94 rc = fgetxattr(fd, attr, attr_val, 25);
95 #elif defined(__solaris__)
97 attrfd = openat(fd, attr, O_XATTR|O_RDONLY);
98 if (attrfd < 0)
return(0);
100 rc =
read(attrfd, attr_val, 25);
106 if (rc == -1 || attr_val[8] !=
':')
return(0);
111 if (strcmp(p, mtime))
return(0);
113 strcpy(value, attr_val);
115 return(strlen(value));
123 if (!
xCS.Attr.Cks.Set(
"adler32") ||
xCS.Get(path, fd) <= 0
124 || strcmp(
xCS.Attr.Cks.Name,
"adler32"))
131 ||
xCS.Attr.Cks.fmTime !=
static_cast<long long>(st.st_mtime))
return 0;
133 xCS.Attr.Cks.Get(value, 9);
146 csBuff,
sizeof(csBuff));
147 if (csLen < 0)
return -1;
148 if (csLen == 0)
return 0;
152 if (strncmp(
"adler32 ", csBuff, 8))
return 0;
156 strcpy(chksum, csBuff+8);
157 return strlen(csBuff+8);
162 int main(
int argc,
char *argv[])
164 char path[2048], chksum[128], buf[
N], adler_str[9];
165 const char attr[] =
"user.checksum.adler32";
169 adler = adler32(0L, Z_NULL, 0);
171 if (argc == 2 && ! strcmp(argv[1],
"-h"))
173 printf(
"Usage: %s file. Calculating adler32 checksum of a given file.\n", argv[0]);
174 printf(
"A file can be local file, stdin (if omitted), or root URL (including via XROOTD_VMP)\n");
181 if (!strncmp(argv[1],
"root://", 7))
182 strcpy(path, argv[1]);
184 xrdPath.
URL(argv[1], path,
sizeof(path));
187 if (argc == 1 || path[0] ==
'\0')
191 strcpy(path, argv[1]);
192 if ((fd =
open(path, O_RDONLY)) < 0 ||
fstat(fd, &stbuf) != 0 || !S_ISREG(stbuf.st_mode))
196 printf(
"Error opening %s: %s\n", path, strerror(errno));
202 printf(
"%s %s\n", adler_str, path);
211 while ( (len =
read(fd, buf,
N)) > 0 )
212 adler = adler32(adler, (
const Bytef*)buf, len);
214 if (fd != STDIN_FILENO)
216 sprintf(adler_str,
"%08lx", adler);
220 printf(
"%08lx %s\n", adler, path);
227 printf(
"%s %s\n", chksum, argv[1]);
228 return (strcmp(chksum,
"Error_accessing:") ? 0 : 1);
234 if (rc != 0 || ! S_ISREG(stbuf.st_mode) ||
237 printf(
"Error_accessing: %s\n", argv[1]);
244 adler = adler32(adler,
246 (len < (stbuf.st_size - totbytes)? len : stbuf.st_size - totbytes ));
251 printf(
"%08lx %s\n", adler, argv[1]);
XrdOucXAttr< XrdCksXAttr > xCS
int stat(const char *path, struct stat *buf)
int open(const char *path, int oflag,...)
int fstat(int fildes, struct stat *buf)
ssize_t read(int fildes, void *buf, size_t nbyte)
int main(int argc, char *argv[])
void fSetXattrAdler32(const char *path, int fd, const char *attr, char *value)
int fGetXattrAdler32(int fd, const char *attr, char *value)
char getchksum(const char *rooturl, char *chksum)
char * URL(const char *path, char *buff, int blen)
POSIX interface to XRootD with some extensions, as noted.
static int Stat(const char *path, struct stat *buf)
Stat() conforms to POSIX.1-2001 stat()
static int Close(int fildes)
Close() conforms to POSIX.1-2001 close()
static long long Getxattr(const char *path, const char *name, void *value, unsigned long long size)
static ssize_t Read(int fildes, void *buf, size_t nbyte)
Read() conforms to POSIX.1-2001 read()
static int Open(const char *path, int oflag, mode_t mode=0, XrdPosixCallBack *cbP=0)