void orcaccess (char *args) { int str_len,mode,access_mode; char *envname; char *in_filename; char buf_path[STR_LEN]; char filename[STR_LEN]; char *fullpath; char *out_dirname; char *out_filename; int *writable,*file_exists,*retcode; struct stat buf ; char *p; p = args; str_len = *(size_t *)(p); p += sizeof(int); mode = *(int *)(p); p += sizeof(int); envname=p; StringCobol2C(envname, str_len); p += str_len; in_filename=p; StringCobol2C(in_filename, str_len); p += str_len; fullpath=p; p += str_len; out_dirname=p; p += str_len; out_filename=p; p += str_len; writable = (int *)(p); p += sizeof(int); file_exists = (int *)(p); p += sizeof(int); retcode = (int *)(p); *writable=0; *file_exists=0; *file_exists=0; access_mode = F_OK; if ((mode & 1 ) > 0){ access_mode += X_OK; } if ((mode & 2 ) > 0){ access_mode += W_OK; } if ((mode & 4 ) > 0){ access_mode += R_OK; } if ( *envname != 0 && strchr(in_filename,'/') == 0 && (access_mode & X_OK)){ *retcode= search_file(str_len,access_mode,envname,in_filename,fullpath,out_dirname,out_filename,writable,file_exists); }else{ strncpy(filename,in_filename,str_len); if (strchr(in_filename,'/') == 0){ getcwd(filename,sizeof(filename)); sprintf(filename,"%s/%s",filename,in_filename); } strncpy(fullpath,filename,str_len); strncpy(buf_path,filename,str_len); strncpy(out_dirname,dirname(buf_path),str_len); strncpy(buf_path,filename,str_len); strncpy(out_filename,basename(buf_path),str_len); if (stat(out_dirname, &buf) == 0 && S_ISDIR(buf.st_mode) == 1 && access(out_dirname,W_OK) == 0){ if (access(filename,F_OK) == 0){ if (stat(filename, &buf) == 0 && S_ISDIR(buf.st_mode) == 0){ *writable = 1; } }else{ *writable = 1; } }; if (stat(filename, &buf) == 0 && S_ISREG(buf.st_mode) == 1){ if (access(filename,F_OK) == 0){ *file_exists = 1; }; *retcode= access(filename,access_mode); }else{ *retcode = -1; } } StringC2Cobol(envname, str_len); StringC2Cobol(in_filename, str_len); StringC2Cobol(fullpath, str_len); StringC2Cobol(out_dirname, str_len); StringC2Cobol(out_filename, str_len); }
extern size_t OpenCOBOL_UnPackValue(CONVOPT *opt, unsigned char *p, ValueStruct *value) { int32_t i; char buff[SIZE_NUMBUF + 1]; unsigned char *q; ValueStruct *child; q = p; if (value != NULL) { ValueIsNonNil(value); switch (ValueType(value)) { case GL_TYPE_INT: i = *(int32_t*)p; IntegerCobol2C(opt, &i); SetValueInteger(value, (int64_t)i); p += sizeof(int32_t); break; case GL_TYPE_FLOAT: ValueFloat(value) = *(double *)p; p += sizeof(double); break; case GL_TYPE_BOOL: SetValueBool(value,(*(char *)p == 'T') ? TRUE : FALSE); p++; break; case GL_TYPE_OBJECT: StringCobol2C(p, SIZE_UUID); memcpy(ValueBody(value), p, SIZE_UUID); p += SIZE_UUID; break; case GL_TYPE_BYTE: memcpy(ValueByte(value), p, ValueByteLength(value)); p += ValueByteLength(value); break; case GL_TYPE_BINARY: SetValueBinary(value, p, opt->textsize); p += opt->textsize; break; case GL_TYPE_TEXT: case GL_TYPE_SYMBOL: StringCobol2C(p, opt->textsize); SetValueStringWithLength(value, p, opt->textsize, ConvCodeset(opt)); p += opt->textsize; break; case GL_TYPE_CHAR: case GL_TYPE_VARCHAR: case GL_TYPE_DBCODE: StringCobol2C(p, ValueStringLength(value)); SetValueStringWithLength(value, p, ValueStringLength(value), ConvCodeset(opt)); p += ValueStringLength(value); break; case GL_TYPE_NUMBER: memcpy(buff, p, ValueFixedLength(value)); FixedCobol2C(buff, ValueFixedLength(value)); strcpy(ValueFixedBody(value), buff); p += ValueFixedLength(value); break; case GL_TYPE_TIMESTAMP: ValueDateTimeYear(value) = StrToInt(p, 4); p += 4; ValueDateTimeMon(value) = StrToInt(p, 2) - 1; p += 2; ValueDateTimeMDay(value) = StrToInt(p, 2); p += 2; ValueDateTimeHour(value) = StrToInt(p, 2); p += 2; ValueDateTimeMin(value) = StrToInt(p, 2); p += 2; ValueDateTimeSec(value) = StrToInt(p, 2); p += 2; mktime(ValueDateTime(value)); break; case GL_TYPE_TIME: ValueDateTimeYear(value) = 0; ValueDateTimeMon(value) = 0; ValueDateTimeMDay(value) = 0; ValueDateTimeHour(value) = StrToInt(p, 2); p += 2; ValueDateTimeMin(value) = StrToInt(p, 2); p += 2; ValueDateTimeSec(value) = StrToInt(p, 2); p += 2; break; case GL_TYPE_DATE: ValueDateTimeYear(value) = StrToInt(p, 4); p += 4; ValueDateTimeMon(value) = StrToInt(p, 2) - 1; p += 2; ValueDateTimeMDay(value) = StrToInt(p, 2); p += 2; ValueDateTimeHour(value) = 0; ValueDateTimeMin(value) = 0; ValueDateTimeSec(value) = 0; mktime(ValueDateTime(value)); break; case GL_TYPE_ARRAY: for (i = 0; i < ValueArraySize(value); i++) { child = ValueArrayItem(value, i); if (child != NULL) { p += OpenCOBOL_UnPackValue(opt, p, child); ValueParent(child) = value; } } break; case GL_TYPE_ROOT_RECORD: case GL_TYPE_RECORD: for (i = 0; i < ValueRecordSize(value); i++) { child = ValueRecordItem(value, i); if (child != NULL) { p += OpenCOBOL_UnPackValue(opt, p, child); ValueParent(child) = value; } } break; default: ValueIsNil(value); break; } } return (p - q); }