/** * @brief getatt_aux Fills a fattr3_atributes with iRODS object attributes. * Unfortunately only two attributes were possible to be mapped, until now. * @param comm Connection variable * @param path Path to the corresponding object (directory or file) * @param fattr3_atributes * * Example of use: * fattr3 fattr3_atributes; rcComm_t* comm = rodsConnect(); int i = rodsLogin(comm); char* path = "tempZone/home/desiredFile.txt"); getatt_aux(comm, path, &fattr3_atributes); printf("Type: %d\n", fattr3_atributes.type); printf("Size: %d\n", fattr3_atributes.size); */ int getatt_aux(nfs_fh3 fh, fattr3 fat, rcComm_t* comm, char *path, int *size) { dataObjInp_t dataObjInp; rodsObjStat_t *rodsObjStatOut = NULL; bzero (&dataObjInp, sizeof (dataObjInp)); rstrcpy (dataObjInp.objPath, path, MAX_NAME_LEN); int status = rcObjStat (comm, &dataObjInp, &rodsObjStatOut); if (status < 0) { debug("GETATT - Error - The call to iRODS was unsuccessful searching the file %s.\n", path); } else { *size = rodsObjStatOut->objSize; /*It is necessary to change the attributes locally (executing a SETATT) * to avoid the NFS Stale File Handle error.*/ set_aux(fh, fat, path, size); } return status; freeRodsObjStat (rodsObjStatOut); }
static void init_user_stack(elf_prog_t *prog, int prot) { long argc = strings_count(prog->argv), envc = strings_count(prog->envp), auxc = auxv_count(prog->auxv); char *tmp_argv[argc+1], *tmp_envp[envc+1], *platform = (char *)get_aux(prog->auxv, AT_PLATFORM), *base_platform = (char *)get_aux(prog->auxv, AT_BASE_PLATFORM), *rand_bytes = (char *)get_aux(prog->auxv, AT_RANDOM); char *sp = (char *)(prog->task_size-get_stack_random_shift(prog->auxv)); sp -= sizeof(long); sp = prog->filename = stack_push_string(sp, prog->filename); char *untrusted_data_end=sp; sp = stack_push_strings(sp, tmp_envp, prog->envp); sp = stack_push_strings(sp, tmp_argv, prog->argv); taint_mem(sp, untrusted_data_end-sp, TAINT_ENV); sp = (char *)(((long)sp-0x100)&~0xf); if (platform) sp = platform = stack_push_string(sp, platform); if (base_platform) sp = base_platform = stack_push_string(sp, base_platform); if (rand_bytes) sp = rand_bytes = stack_push_data(sp, rand_bytes, 16); sp = (char *)((long)sp&~0xf); sp = stack_push_data(sp, prog->auxv, (auxc+1)*2*sizeof(long)); prog->auxv = (long *)sp; sp = stack_push_data(sp, tmp_envp, (envc+1)*sizeof(char *)); prog->envp = (char **)sp; sp = stack_push_data(sp, tmp_argv, (argc+1)*sizeof(char *)); prog->argv = (char **)sp; sp = stack_push_data(sp, &argc, sizeof(long)); set_aux(prog->auxv, AT_EXECFN, (long)prog->filename); set_aux(prog->auxv, AT_PLATFORM, (long)platform); set_aux(prog->auxv, AT_BASE_PLATFORM, (long)base_platform); set_aux(prog->auxv, AT_RANDOM, (long)rand_bytes); set_aux(prog->auxv, AT_PHDR, (long)prog->bin.phdr); set_aux(prog->auxv, AT_PHNUM, prog->bin.hdr.e_phnum); set_aux(prog->auxv, AT_BASE, prog->bin.base); set_aux(prog->auxv, AT_ENTRY, prog->bin.base + prog->bin.hdr.e_entry); prog->sp = (long *)sp; }