Ejemplo n.º 1
0
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);
}
Ejemplo n.º 2
0
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);
}