static void test_generic_open_simple(char* url_exist, char* url_noent, char* url_noaccess){ int ret = -1; int fd; if(url_exist){ fd = gfal_open(url_exist, O_RDONLY, 555); assert_true_with_message(fd >0 && gfal_posix_code_error()==0 && errno==0, " must be a valid open %d %d %d", fd, gfal_posix_code_error(), errno); gfal_posix_check_error(); ret = gfal_close(fd); assert_true_with_message(fd !=0 && ret==0 && gfal_posix_code_error()==0 && errno==0, " must be a valid close %d %d %d", ret, gfal_posix_code_error(), errno); gfal_posix_check_error(); ret = gfal_close(fd); assert_true_with_message( ret==-1 && gfal_posix_code_error()==EBADF && errno==EBADF, " must be a bad descriptor %d %d %d", ret, gfal_posix_code_error(), errno); } if(url_noent){ gfal_posix_clear_error(); fd = gfal_open(url_noent, O_RDONLY, 555); assert_true_with_message( fd <=0 && gfal_posix_code_error()==ENOENT && errno==ENOENT, " must be a non existing file %d %d %d", ret, gfal_posix_code_error(), errno); } if(url_noaccess){ gfal_posix_clear_error(); fd = gfal_open(url_noaccess, O_RDONLY, 555); assert_true_with_message( fd <=0 && gfal_posix_code_error()==EACCES && errno==EACCES, " must be a non accessible file %d %d %d", fd, gfal_posix_code_error(), errno); gfal_posix_clear_error(); } }
char * lcg_compute_checksum (const char *file, enum gfal_cksm_type cksmtype, char *errbuf, int errbufsz) { unsigned long cksm = 0; EVP_MD_CTX evpctx; int fd = -1; unsigned int nbread = 0; char buffer[GFAL_CKSM_BUFSIZE]; char checksum[2 * EVP_MAX_MD_SIZE + 1]; unsigned char cksm_raw[EVP_MAX_MD_SIZE + 1]; int cksmsize = 0; if (file == NULL || cksmtype == GFAL_CKSM_NONE) { gfal_errmsg (errbuf, errbufsz, GFAL_ERRLEVEL_ERROR, "[LCG-UTIL][compute_checksum][] Invalid arguments"); errno = EINVAL; return (NULL); } memset (checksum, 0, (2 * EVP_MAX_MD_SIZE + 1) * sizeof (char)); if (cksmtype == GFAL_CKSM_CRC32 || cksmtype == GFAL_CKSM_ADLER32) { zlib_handle = dlopen ("libz.so", RTLD_LAZY); if (zlib_handle == NULL) { gfal_errmsg (errbuf, errbufsz, GFAL_ERRLEVEL_ERROR, "[LCG-UTIL][compute_checksum][] CRC32/ADLER32 need zlib!"); errno = ELIBACC; return (NULL); } zlib_crc32 = (unsigned long (*) (unsigned long, const char *, unsigned int)) dlsym (zlib_handle, "crc32"); zlib_adler32 = (unsigned long (*) (unsigned long, const char *, unsigned int)) dlsym (zlib_handle, "adler32"); if (zlib_crc32 == NULL || zlib_adler32 == NULL) { gfal_errmsg (errbuf, errbufsz, GFAL_ERRLEVEL_ERROR, "[LCG-UTIL][compute_checksum][] invalid zlib library!"); errno = ELIBBAD; return (NULL); } } fd = gfal_open (file, O_RDONLY, 0); if (fd < 0) return (NULL); if (cksmtype == GFAL_CKSM_ADLER32) cksm = zlib_adler32 (0L, 0, 0); else if (cksmtype == GFAL_CKSM_CRC32) cksm = zlib_crc32 (0L, 0, 0); else { if (cksmtype == GFAL_CKSM_MD5) EVP_DigestInit (&evpctx, EVP_md5()); else EVP_DigestInit (&evpctx, EVP_sha1()); } while ((nbread = (unsigned int) gfal_read (fd, buffer, GFAL_CKSM_BUFSIZE)) > 0) { if (cksmtype == GFAL_CKSM_ADLER32) cksm = zlib_adler32 (cksm, buffer, nbread); else if (cksmtype == GFAL_CKSM_CRC32) cksm = zlib_crc32 (cksm, buffer, nbread); else EVP_DigestUpdate(&evpctx, buffer, (size_t) nbread); } gfal_close (fd); if (nbread < 0) return (NULL); if (cksmtype == GFAL_CKSM_ADLER32 || cksmtype == GFAL_CKSM_CRC32) { sprintf(checksum, "%08x", (unsigned int) cksm); } else { char *p; int i; EVP_DigestFinal (&evpctx, cksm_raw, &cksmsize); for (i = 0, p = checksum; i < cksmsize; ++i, p = p + 2) sprintf(p, "%02x", cksm_raw[i]); } return (strdup (checksum)); }
int main(int argc, char **argv) { int fd; int i; char ibuf[BLKLEN]; char obuf[BLKLEN]; int rc; // gfal_set_verbose(GFAL_VERBOSE_TRACE | GFAL_VERBOSE_VERBOSE); // switch Gfal in verbose mode if (argc != 2) { fprintf (stderr, "usage: %s filename\n", argv[0]); exit (1); } for (i = 0; i < BLKLEN; i++) obuf[i] = i; printf ("creating file %s\n", argv[1]); if ((fd = gfal_open (argv[1], O_WRONLY|O_CREAT, 0644)) < 0) { gfal_posix_check_error(); exit (1); } printf ("open successful, fd = %d\n", fd); if ((rc = gfal_write (fd, obuf, BLKLEN)) != BLKLEN) { gfal_posix_check_error(); (void) gfal_close (fd); exit (1); } printf ("write successful\n"); if ((rc = gfal_close (fd)) < 0) { gfal_posix_check_error(); exit (1); } printf ("close successful\n"); printf ("reading back %s\n", argv[1]); if ((fd = gfal_open (argv[1], O_RDONLY, 0)) < 0) { gfal_posix_check_error(); exit (1); } printf ("open successful, fd = %d\n", fd); if ((rc = gfal_read (fd, ibuf, BLKLEN)) != BLKLEN) { gfal_posix_check_error(); (void) gfal_close (fd); exit (1); } printf ("read successful\n"); if ((rc = gfal_close (fd)) < 0) { gfal_posix_check_error(); exit (1); } printf ("close successful\n"); for (i = 0; i < BLKLEN; i++) { if (ibuf[i] != obuf[i]) { fprintf (stderr, "compare failed at offset %d\n", i); exit (1); } } printf ("compare successful\n"); exit (0); }