Ejemplo n.º 1
0
 /*
 * initiate a gfal's context with default parameters for use
 */
gfal2_context_t gfal_initG (GError** err)
{
	GError* tmp_err=NULL;
	gfal2_context_t handle = g_new0(struct gfal_handle_,1);// clear allocation of the struct and set defautl options
	if(handle == NULL){
		errno= ENOMEM;
        g_set_error(err, gfal2_get_plugins_quark(), ENOMEM, "[gfal_initG] bad allocation, no more memory free");
		return NULL;
	}
	handle->plugin_opt.plugin_number= 0;

    if((handle->conf = gfal_conf_new(&tmp_err)) && !tmp_err){
        // load and instanciate all the plugins
        gfal_plugins_instance(handle, &tmp_err);
        // cancel logic init
        handle->cancel = FALSE;
        handle->running_ops = 0;
        handle->mux_cancel = g_mutex_new();
        g_hook_list_init(&handle->cancel_hooks, sizeof(GHook));
    }


    if(tmp_err){
        if (handle && handle->conf)
            gfal_conf_delete(handle->conf);
        g_free(handle);
        handle = NULL;
    }
    G_RETURN_ERR(handle, tmp_err, err);
}
Ejemplo n.º 2
0
static int gfal_rw_dir_handle_close(gfal_handle handle, gfal_file_handle fh, GError** err){
    g_return_val_err_if_fail(handle && fh, -1, err, "[gfal_posix_gfalfilehandle_close] invalid args");
    GError *tmp_err=NULL;
    int ret = -1;

    ret = gfal_plugin_closedirG(handle, fh, &tmp_err);
    G_RETURN_ERR(ret, tmp_err, err);
}
Ejemplo n.º 3
0
static int gfal_rw_dir_handle_delete(gfal_fdesc_container_handle container, int key, GError** err){
    g_return_val_err_if_fail(container, -1, err, "[gfal_posix_dir_handle_delete] invalid args");
    GError *tmp_err=NULL;
    int ret = -1;
    if(container){
        ret = (gfal_remove_file_desc(container, key, &tmp_err))?0:-1;
    }
    G_RETURN_ERR(ret, tmp_err, err);
}
Ejemplo n.º 4
0
inline static int gfal_rw_dir_handle_store(gfal_handle handle, gfal_file_handle fhandle, GError** err){
    g_return_val_err_if_fail(handle && fhandle, 0, err, "[gfal_rw_dir_handle_store] handle invalid");
    GError* tmp_err=NULL;
    int key = 0;
    gfal_fdesc_container_handle container= gfal_dir_handle_container_instance(&(handle->fdescs), &tmp_err);
    if(container)
        key = gfal_add_new_file_desc(container, (gpointer) fhandle, &tmp_err);
    G_RETURN_ERR(key, tmp_err, err);
}
Ejemplo n.º 5
0
extern "C" ssize_t gfal_gridftp_writeG(plugin_handle ch, gfal_file_handle fd,
        const void* buff, size_t s_buff, GError** err)
{
    g_return_val_err_if_fail(ch != NULL && fd != NULL, -1, err,
            "[gfal_gridftp_writeG][gridftp] Invalid parameters");

    GError * tmp_err = NULL;
    int ret = -1;
    gfal_log(GFAL_VERBOSE_TRACE, "  -> [gfal_gridftp_writeG]");
    CPP_GERROR_TRY
        ret = (int) ((static_cast<GridFTPModule*>(ch))->write(fd, buff, s_buff));
    CPP_GERROR_CATCH(&tmp_err);
    gfal_log(GFAL_VERBOSE_TRACE, "  [gfal_gridftp_writeG] <-");
    G_RETURN_ERR(ret, tmp_err, err);
}
Ejemplo n.º 6
0
// open C bind
extern "C" gfal_file_handle gfal_gridftp_openG(plugin_handle handle,
        const char* url, int flag, mode_t mode, GError** err)
{
    g_return_val_err_if_fail(handle != NULL && url != NULL, NULL, err,
            "[gfal_gridftp_openG][gridftp] Invalid parameters");

    GError * tmp_err = NULL;
    gfal_file_handle ret = NULL;
    gfal_log(GFAL_VERBOSE_TRACE, "  -> [gfal_gridftp_openG]");
    CPP_GERROR_TRY
        ret = ((static_cast<GridFTPModule*>(handle))->open(url, flag, mode));
    CPP_GERROR_CATCH(&tmp_err);
    gfal_log(GFAL_VERBOSE_TRACE, "  [gfal_gridftp_openG]<-");
    G_RETURN_ERR(ret, tmp_err, err);
}
Ejemplo n.º 7
0
static int gfal_checksumG_srmv2_internal(srm_context_t context, const char* surl,
        char* buf_checksum, size_t s_checksum, char* buf_chktype, size_t s_chktype, GError** err)
{
	g_return_val_err_if_fail(context && surl && buf_checksum && buf_chktype,
                             -1, err, "[gfal_checksumG_srmv2_internal] Invalid input parameters : endpoint, surl, checksum, checksum_type");
	GError* tmp_err=NULL;
	struct srm_ls_input input;
	struct srm_ls_output output;
	struct srmv2_mdfilestatus *srmv2_mdstatuses=NULL;
	const int nb_request=1;
	int ret=-1;
	char* tab_surl[] = { (char*)surl, NULL};

    input.nbfiles = nb_request;
    input.surls = tab_surl;
    input.numlevels = 0;
    input.offset = 0;
    input.count = 0;

    ret = gfal_srm_external_call.srm_ls(context,&input,&output);					// execute ls

    if(ret >=0){
        srmv2_mdstatuses = output.statuses;
        if(srmv2_mdstatuses->status != 0){
            gfal2_set_error(&tmp_err, gfal2_get_plugin_srm_quark(), srmv2_mdstatuses->status, __func__,
                    "Error reported from srm_ifce : %d %s", srmv2_mdstatuses->status, srmv2_mdstatuses->explanation);
            ret = -1;
        }else{
            if(srmv2_mdstatuses->checksum && srmv2_mdstatuses->checksumtype){
                g_strlcpy(buf_checksum, srmv2_mdstatuses->checksum, s_checksum);
                g_strlcpy(buf_chktype, srmv2_mdstatuses->checksumtype, s_chktype);
            }else{
                if(s_checksum > 0)
                    buf_checksum='\0';
                if(s_chktype > 0)
                    buf_chktype ='\0';
            }
            ret = 0;
        }
    }else{
        gfal_srm_report_error(context->errbuf, &tmp_err);
        ret=-1;
    }
    gfal_srm_external_call.srm_srmv2_mdfilestatus_delete(srmv2_mdstatuses, 1);
    gfal_srm_external_call.srm_srm2__TReturnStatus_delete(output.retstatus);

    G_RETURN_ERR(ret, tmp_err, err);
}
Ejemplo n.º 8
0
extern "C" int gfal_gridftp_unlinkG(plugin_handle handle, const char* url,
        GError** err)
{
    g_return_val_err_if_fail(handle != NULL && url != NULL, -1, err,
            "[gfal_gridftp_unlinkG][gridftp] Invalid parameters");

    GError * tmp_err = NULL;
    int ret = -1;
    gfal_log(GFAL_VERBOSE_TRACE, "  -> [gfal_gridftp_unlinkG]");
    CPP_GERROR_TRY
                (static_cast<GridFTPModule*>(handle))->unlink(url);
                ret = 0;
            CPP_GERROR_CATCH(&tmp_err);
    gfal_log(GFAL_VERBOSE_TRACE, "  [gfal_gridftp_unlinkG] <-");
    G_RETURN_ERR(ret, tmp_err, err);
}
Ejemplo n.º 9
0
DIR* gfal2_opendir(gfal2_context_t handle, const char* name, GError ** err){
    GError* tmp_err=NULL;
    gfal_file_handle ret= NULL;
    GFAL2_BEGIN_SCOPE_CANCEL(handle, NULL, err);
    if(name == NULL || handle ==NULL){
        g_set_error(&tmp_err, 0, EFAULT, "uri  or/and handle are NULL");
    }else{
        ret = gfal_plugin_opendirG(handle, name, &tmp_err);
    }

    int key = 0;
    if(ret)
        key = gfal_rw_dir_handle_store(handle, ret, &tmp_err);
    GFAL2_END_SCOPE_CANCEL(handle);
    G_RETURN_ERR( GINT_TO_POINTER(key), tmp_err, err);
}
Ejemplo n.º 10
0
extern "C" off_t gfal_gridftp_lseekG(plugin_handle ch, gfal_file_handle fd,
        off_t offset, int whence, GError** err)
{
    g_return_val_err_if_fail(ch != NULL && fd != NULL, -1, err,
            "[gfal_gridftp_lseekG][gridftp] Invalid parameters");

    GError * tmp_err = NULL;
    off_t ret = -1;
    gfal_log(GFAL_VERBOSE_TRACE, "  -> [gfal_gridftp_lseekG]");
    CPP_GERROR_TRY
                ret = ((static_cast<GridFTPModule*>(ch))->lseek(fd, offset,
                        whence));
            CPP_GERROR_CATCH(&tmp_err);
    gfal_log(GFAL_VERBOSE_TRACE, "  [gfal_gridftp_lseekG]<-");
    G_RETURN_ERR(ret, tmp_err, err);

}
Ejemplo n.º 11
0
struct dirent* gfal2_readdir(gfal2_context_t handle, DIR* dir, GError ** err){
    GError* tmp_err=NULL;
    struct dirent* res= NULL;
    GFAL2_BEGIN_SCOPE_CANCEL(handle, NULL, err);
    if(dir == NULL || handle ==NULL){
       g_set_error(&tmp_err, 0, EFAULT, "file descriptor or/and handle are NULL");
    }else{
       gfal_fdesc_container_handle container= gfal_dir_handle_container_instance(&(handle->fdescs), &tmp_err);
       const int key = GPOINTER_TO_INT(dir);
       gfal_file_handle fh = gfal_file_handle_bind(container, key, &tmp_err);
       if( fh != NULL){
           res = gfal_rw_gfalfilehandle_readdir(handle, fh, &tmp_err);
       }
    }
    GFAL2_END_SCOPE_CANCEL(handle);
    G_RETURN_ERR(res, tmp_err, err);
}
Ejemplo n.º 12
0
static int gfal_access_srmv2_internal(srm_context_t context, const char* surl, int mode, GError** err)
{
    GError* tmp_err = NULL;
    struct srm_checkpermission_input checkpermission_input;
    struct srmv2_filestatus *resu;
    int ret = -1;
    char* tab_surl[] = { (char*) surl, NULL };

    checkpermission_input.nbfiles = 1;
    checkpermission_input.amode = mode;
    checkpermission_input.surls = tab_surl;

    ret = gfal_srm_external_call.srm_check_permission(context, &checkpermission_input, &resu);
    if (ret != 1) {
        gfal_srm_report_error(context->errbuf, &tmp_err);
        gfal2_propagate_prefixed_error(err, tmp_err, __func__);
        return -1;
    }

    if (resu[0].status) {
        if (strnlen(resu[0].surl, GFAL_URL_MAX_LEN) >= GFAL_URL_MAX_LEN ||
            strnlen(resu[0].explanation, GFAL_URL_MAX_LEN) >= GFAL_URL_MAX_LEN) {
            gfal2_set_error(&tmp_err, gfal2_get_plugin_srm_quark(),
                    resu[0].status, __func__, "Memory corruption in the libgfal_srm_ifce answer, fatal");
        }
        else {
            gfal2_set_error(&tmp_err, gfal2_get_plugin_srm_quark(),
                    resu[0].status, __func__,
                    "Error %d : %s , file %s: %s", resu[0].status,
                    strerror(resu[0].status), resu[0].surl, resu[0].explanation);
        }
        ret = -1;
    }
    // resu[0].status == 0 is success
    else {
        ret = 0;
        errno = 0;
    }

    gfal_srm_external_call.srm_srmv2_filestatus_delete(resu, 1);

    G_RETURN_ERR(ret, tmp_err, err);
}
Ejemplo n.º 13
0
int gfal2_closedir(gfal2_context_t handle, DIR* d, GError ** err){
    GError* tmp_err=NULL;
    int ret = -1;

    if(d == NULL || handle ==NULL){
        g_set_error(&tmp_err, 0, EFAULT, "file descriptor or/and handle are NULL");
    }else{
        gfal_fdesc_container_handle container= gfal_dir_handle_container_instance(&(handle->fdescs), &tmp_err);
        int key = GPOINTER_TO_INT(d);
        gfal_file_handle fh = gfal_file_handle_bind(container, key, &tmp_err);
        if( fh != NULL){
            ret = gfal_rw_dir_handle_close(handle, fh, &tmp_err);
            if(ret==0){
                ret = gfal_rw_dir_handle_delete(container, key, &tmp_err);
            }
        }
    }

    G_RETURN_ERR(ret, tmp_err, err);
}
Ejemplo n.º 14
0
inline static struct dirent* gfal_rw_gfalfilehandle_readdir(gfal_handle handle, gfal_file_handle fh, GError** err){
    g_return_val_err_if_fail(handle && fh, NULL, err, "[gfal_posix_gfalfilehandle_readdir] incorrect args");
    GError *tmp_err=NULL;
    struct dirent* ret = gfal_plugin_readdirG(handle, fh, &tmp_err);
    G_RETURN_ERR(ret, tmp_err, err);
}
Ejemplo n.º 15
0
int gfal_srm_checksumG_fallback(plugin_handle handle, const char* url, const char* check_type,
                       char * checksum_buffer, size_t buffer_length,
                       off_t start_offset, size_t data_length,
                       gboolean turl_fallback,
                       GError ** err){
    gfal_log(GFAL_VERBOSE_TRACE, " [gfal_srm_checksumG] ->");
    gfal_log(GFAL_VERBOSE_DEBUG, "[gfal_srm_checksumG] try to get checksum %s for %s", check_type, url);

    char buffer_type[GFAL_URL_MAX_LEN]={0};
    GError * tmp_err=NULL;
    gfal_srmv2_opt* opts = (gfal_srmv2_opt*)handle;
    const gboolean srm_url = srm_check_url(url);
    int res =  -1;

    // try SRM checksum only if full file checksum is requested
    if(srm_url && start_offset==0 && data_length==0 ) {
        res = gfal_srm_cheksumG_internal(handle, url,
                                   checksum_buffer, buffer_length,
                                   buffer_type, GFAL_URL_MAX_LEN, &tmp_err);
    }

    // Make sure the returned type matches the requested one
    if(res == 0) {
        gfal_log(GFAL_VERBOSE_DEBUG, "registered checksum type %s", buffer_type);
        if(strncasecmp(check_type, buffer_type,GFAL_URL_MAX_LEN) != 0){
            // does not match the correct type
            // this can be because checksum is nto populated on DPM server, cause the first gsiftp checksum calculation
            res = -1; // cancel result
        }
    }



    // If we got no error, but neither a valid checksum,
    // fallback into the turl
    if(res != 0 && !tmp_err && turl_fallback){
        gfal_log(GFAL_VERBOSE_TRACE, "\t\tNo valid SRM checksum, fallback to the TURL checksum");
        char buff_turl[GFAL_URL_MAX_LEN];
        char *res_turl;
        if(srm_url){ // SRM URL do TURL resolution
            if( (res = gfal_srm_getTURL_checksum(handle, url, buff_turl, GFAL_URL_MAX_LEN,  &tmp_err)) >= 0){
                 res_turl = buff_turl;
            }else{
                res = -1;
            }
        }else{ // native protocol -> act like this
            res_turl = (char*)url;
            res =0;
        }
        if(res == 0){
          gfal_log(GFAL_VERBOSE_TRACE, "\t\t\tExecute checksum on turl %s", res_turl);
          res= gfal2_checksum(opts->handle, res_turl, check_type, 0,0, checksum_buffer, buffer_length, &tmp_err);
        }

    }
    // If no fallback, then return an empty value
    else if (!turl_fallback && (tmp_err || res  != 0)) {
        res = 0;
        memset(checksum_buffer, '\0', buffer_length);
    }

    G_RETURN_ERR(res, tmp_err, err);
}