int dataObjCreateByFusePath (rcComm_t *conn, char *path, int mode, char *irodsPath) { dataObjInp_t dataObjInp; int status; memset (&dataObjInp, 0, sizeof (dataObjInp)); rstrcpy(dataObjInp.objPath, irodsPath, MAX_NAME_LEN); if (strlen (MyRodsEnv.rodsDefResource) > 0) { addKeyVal (&dataObjInp.condInput, RESC_NAME_KW, MyRodsEnv.rodsDefResource); } addKeyVal (&dataObjInp.condInput, DATA_TYPE_KW, "generic"); /* dataObjInp.createMode = DEF_FILE_CREATE_MODE; */ dataObjInp.createMode = mode; dataObjInp.openFlags = O_RDWR; dataObjInp.dataSize = -1; status = rcDataObjCreate (conn, &dataObjInp); clearKeyVal (&dataObjInp.condInput); return status; }
int irods_file_open_( char *filename, char *mode ) { int i; int status; dataObjInp_t dataObjInp; char **outPath; char *cp1, *cp2; int nameLen; if ( debug ) { printf( "irods_file_open filename input:%s:\n", filename ); } /* Remove trailing blanks from the filename */ cp1 = filename; cp2 = cp1 + strlen( filename ) - 1; for ( ; *cp2 == ' ' && cp2 > cp1; cp2-- ) { } cp2++; if ( cp2 > cp1 ) { *cp2 = '\0'; } if ( debug ) printf( "irods_file_open filename w/o trailing blanks:%s:\n", filename ); if ( setupFlag == 0 ) { status = irods_connect_(); if ( status ) { return -1; } } memset( &dataObjInp, 0, sizeof( dataObjInp ) ); status = parseRodsPathStr( filename , &myRodsEnv, dataObjInp.objPath ); if ( status < 0 ) { rodsLogError( LOG_ERROR, status, "irods_file_open" ); return -1; } /* Set the openFlags based on the input mode (incomplete * currently) // */ dataObjInp.openFlags = O_RDONLY; if ( strstr( mode, "WRITE" ) != NULL ) { dataObjInp.openFlags = O_RDWR; } /* may want a O_WRONLY mode too sometime */ status = rcDataObjOpen( Comm, &dataObjInp ); if ( status == CAT_NO_ROWS_FOUND && dataObjInp.openFlags == O_WRONLY ) { status = rcDataObjCreate( Comm, &dataObjInp ); } if ( status < 0 ) { rodsLogError( LOG_ERROR, status, "irods_file_open" ); return -1; } return status; }
int irods_file_create_( char *filename ) { int i; int status; dataObjInp_t dataObjInp; char **outPath; char *cp1, *cp2; int nameLen; if ( debug ) { printf( "irods_file_create filename input:%s:\n", filename ); } /* Remove trailing blanks from the filename */ cp1 = filename; cp2 = cp1 + strlen( filename ) - 1; for ( ; *cp2 == ' ' && cp2 > cp1; cp2-- ) { } cp2++; if ( cp2 > cp1 ) { *cp2 = '\0'; } if ( debug ) printf( "irods_file_create filename w/o trailing blanks:%s:\n", filename ); if ( setupFlag == 0 ) { status = irods_connect_(); if ( status ) { return -1; } } memset( &dataObjInp, 0, sizeof( dataObjInp ) ); status = parseRodsPathStr( filename , &myRodsEnv, dataObjInp.objPath ); if ( status < 0 ) { rodsLogError( LOG_ERROR, status, "irods_file_create" ); return -1; } dataObjInp.openFlags = O_RDWR; /* may want a O_WRONLY mode too sometime */ status = rcDataObjCreate( Comm, &dataObjInp ); if ( status < 0 ) { rodsLogError( LOG_ERROR, status, "irods_file_open" ); return -1; } return status; }
FILE *isioFileOpen( char *filename, char *modes ) { int i; int status; dataObjInp_t dataObjInp; char **outPath; if ( debug ) { printf( "isioFileOpen: %s\n", filename ); } if ( setupFlag == 0 ) { status = isioSetup(); if ( status ) { return NULL; } } for ( i = ISIO_MIN_OPEN_FD; i < ISIO_MAX_OPEN_FILES; i++ ) { if ( openFiles[i] == 0 ) { break; } } if ( i >= ISIO_MAX_OPEN_FILES ) { fprintf( stderr, "Too many open files in isioFileOpen\n" ); return NULL; } memset( &dataObjInp, 0, sizeof( dataObjInp ) ); status = parseRodsPathStr( filename , &myRodsEnv, dataObjInp.objPath ); if ( status < 0 ) { rodsLogError( LOG_ERROR, status, "isioFileOpen" ); return NULL; } /* Set the openFlags based on the input mode (incomplete * currently) // */ dataObjInp.openFlags = O_RDONLY; if ( strncmp( modes, "w", 1 ) == 0 ) { dataObjInp.openFlags = O_WRONLY; /* Need to handle other cases sometime */ } if ( strncmp( modes, "r+", 2 ) == 0 ) { dataObjInp.openFlags = O_RDWR; } status = rcDataObjOpen( Comm, &dataObjInp ); if ( status == CAT_NO_ROWS_FOUND && dataObjInp.openFlags == O_WRONLY ) { status = rcDataObjCreate( Comm, &dataObjInp ); } if ( status < 0 ) { rodsLogError( LOG_ERROR, status, "isioFileOpen" ); return NULL; } openFiles[i] = status; cacheInfo[i].base = ( char * )malloc( sizeof( char ) * ISIO_INITIAL_BUF_SIZE ); if ( cacheInfo[i].base == NULL ) { fprintf( stderr, "Memory Allocation error\n" ); return NULL; } cacheInfo[i].bufferSize = sizeof( char ) * ISIO_INITIAL_BUF_SIZE; cacheInfo[i].ptr = cacheInfo[i].base; cacheInfo[i].count = 0; cacheInfo[i].usingUsersBuffer = 'n'; cacheInfo[i].written = 0; return ( FILE * )i; }
struct irods_file * irods_reli_open ( const char *host, const char *path, int flags, int mode ) { struct irods_file *file; struct irods_server *server; dataObjInp_t request; int result; server = connect_to_host(host); if(!server) return 0; memset(&request,0,sizeof(request)); strcpy(request.objPath,path); request.openFlags = flags; debug(D_IRODS,"rcDataObjOpen %s %s",host,path); result = rcDataObjOpen (server->conn,&request); debug(D_IRODS,"= %d",result); if(result<0 && flags&O_CREAT) { memset(&request,0,sizeof(request)); strcpy(request.objPath,path); request.createMode = mode; request.openFlags = flags; request.dataSize = -1; addKeyVal (&request.condInput, DATA_TYPE_KW, "generic"); if(irods_env.rodsDefResource[0]) { addKeyVal (&request.condInput, RESC_NAME_KW,irods_env.rodsDefResource); } debug(D_IRODS,"rcDataObjCreate %s %s",host,path); result = rcDataObjCreate (server->conn,&request); debug(D_IRODS,"= %d",result); } /* An attempt to open a directory returns CAT_NO_ROWS_FOUND. For Unix compatibility, we must check for a directory by that name, and return EISDIR if it exists. */ if(result==CAT_NO_ROWS_FOUND) { struct pfs_stat info; if(irods_reli_stat(host,path,&info)>=0) { if(S_ISDIR(info.st_mode)) { errno = EISDIR; return 0; } } } if(result<0) { errno = irods_reli_errno(result); return 0; } if(flags&O_TRUNC) { irods_reli_truncate(host,path,0); } file = malloc(sizeof(*file)); file->host = strdup(host); file->path = strdup(path); file->fd = result; file->offset = 0; file->serial = server->serial; file->flags = flags; return file; }
int main (int argc, char **argv) { rcComm_t *conn = NULL; rodsEnv irods_env; rErrMsg_t err_msg; dataObjInp_t data_obj; openedDataObjInp_t open_obj; int open_fd; char *new_host = NULL; int status; char *obj_name = NULL; char *buffer; char prog_name[255]; size_t buf_size = DEFAULT_BUFFER_SIZE; int verbose = 0; int opt; unsigned long total_written = 0; int write_to_irods = 1; int server_set = 0; while ((opt = getopt(argc, argv, "b:vhrdw")) != -1) { switch (opt) { case 'b': buf_size = atoi(optarg); if (buf_size <= 0) { error_and_exit(conn, "Error: buffer size must be greater than 0.\n"); } break; case 'v': verbose = 1; break; case 'r': write_to_irods = 0; break; case 'w': // dummy write option to be enforced later break; case 'd': server_set = 1; break; case 'h': usage_and_exit(argv[0], EXIT_SUCCESS); break; default: usage_and_exit(argv[0], EXIT_FAILURE); break; } } if (optind >= argc) { fprintf(stderr, "Error: Missing iRODS file.\n"); usage_and_exit(argv[0], EXIT_FAILURE); } obj_name = argv[optind]; if ((buffer = malloc(buf_size)) == NULL) { error_and_exit(conn, "Error: unable to set buffer to size %ld\n", buf_size); } // set the client name so iRODS knows what program is connecting to it sprintf(prog_name, "%s:%s", PACKAGE_NAME, PACKAGE_VERSION); if (verbose) { fprintf(stderr, "Setting client name to: %s\n", prog_name); } setenv(SP_OPTION, prog_name, 1); // lets get the irods environment if ((status = getRodsEnv(&irods_env)) < 0) { error_and_exit(conn, "Error: getRodsEnv failed with status %d:%s\n", status, get_irods_error_name(status, verbose)); } if ((status = irods_uri_check(obj_name, &irods_env, verbose)) < 0) { error_and_exit(conn, "Error: invalid uri: %s\n", obj_name); } else if (status > 0) { server_set = 1; } if (verbose) { fprintf(stderr, "host %s\nzone %s\nuser %s\nport %d\n", irods_env.rodsHost, irods_env.rodsZone, irods_env.rodsUserName, irods_env.rodsPort); } #if IRODS_VERSION_INTEGER && IRODS_VERSION_INTEGER >= 4001008 init_client_api_table(); #endif // make the irods connections conn = rcConnect(irods_env.rodsHost, irods_env.rodsPort, irods_env.rodsUserName, irods_env.rodsZone, 0, &err_msg); if (!conn) { print_irods_error("Error: rcConnect failed:", &err_msg); exit(EXIT_FAILURE); } #if IRODS_VERSION_INTEGER && IRODS_VERSION_INTEGER >= 4001008 status = clientLogin(conn, "", ""); #else status = clientLogin(conn); #endif if (status < 0) { error_and_exit(conn, "Error: clientLogin failed with status %d:%s\n", status, get_irods_error_name(status, verbose)); } // set up the data object memset(&data_obj, 0, sizeof(data_obj)); strncpy(data_obj.objPath, obj_name, MAX_NAME_LEN); if (write_to_irods) { data_obj.openFlags = O_WRONLY; } else { data_obj.openFlags = O_RDONLY; } data_obj.dataSize = 0; // talk to server if (write_to_irods) { if (!server_set) { if ((status = rcGetHostForPut(conn, &data_obj, &new_host)) < 0) { error_and_exit(conn, "Error: rcGetHostForPut failed with status %d:%s\n", status, get_irods_error_name(status, verbose)); } choose_server(&conn, new_host, &irods_env, verbose); free(new_host); } if ((open_fd = rcDataObjCreate(conn, &data_obj)) < 0) { error_and_exit(conn, "Error: rcDataObjCreate failed with status %d:%s\n", open_fd, get_irods_error_name(open_fd, verbose)); } } else { if (!server_set) { if ((status = rcGetHostForGet(conn, &data_obj, &new_host)) < 0) { error_and_exit(conn, "Error: rcGetHostForGet failed with status %d:%s\n", status, get_irods_error_name(status, verbose)); } choose_server(&conn, new_host, &irods_env, verbose); free(new_host); } if ((open_fd = rcDataObjOpen(conn, &data_obj)) < 0) { error_and_exit(conn, "Error: rcDataObjOpen failed with status %d:%s\n", open_fd, get_irods_error_name(open_fd, verbose)); } } // the read/write loop while (1) { bytesBuf_t data_buffer; long read_in; long written_out; // set up common data elements memset(&open_obj, 0, sizeof(open_obj)); open_obj.l1descInx = open_fd; data_buffer.buf = buffer; // time to read something if (write_to_irods) { read_in = fread(buffer, 1, buf_size, stdin); open_obj.len = read_in; data_buffer.len = open_obj.len; } else { open_obj.len = buf_size; data_buffer.len = open_obj.len; if ((read_in = rcDataObjRead(conn, &open_obj, &data_buffer)) < 0) { error_and_exit(conn, "Error: rcDataObjRead failed with status %ld:%s\n", read_in, get_irods_error_name(read_in, verbose)); } } if (verbose) { fprintf(stderr, "%ld bytes read\n", read_in); } if (!read_in) break; // now try and write something if (write_to_irods) { open_obj.len = read_in; data_buffer.len = open_obj.len; if ((written_out = rcDataObjWrite(conn, &open_obj, &data_buffer)) < 0) { error_and_exit(conn, "Error: rcDataObjWrite failed with status %ld\n", written_out, get_irods_error_name(written_out, verbose)); } } else { written_out = fwrite(buffer, 1, read_in, stdout); } if (verbose) { fprintf(stderr, "%ld bytes written\n", written_out); } total_written += written_out; if (read_in != written_out) { error_and_exit(conn, "Error: write fail %ld written, should be %ld.\n", written_out, read_in); } }; if (verbose) { fprintf(stderr, "Total bytes written %ld\n", total_written); } if ((status = rcDataObjClose(conn, &open_obj)) < 0) { error_and_exit(conn, "Error: rcDataObjClose failed with status %d:%s\n", status, get_irods_error_name(status, verbose)); } rcDisconnect(conn); free(buffer); exit(EXIT_SUCCESS); }