示例#1
0
dbs_sVolRef *
dbs_VolRef(pwr_tStatus *sts, pwr_tUInt32 index, dbs_sVolRef *vp, const dbs_sEnv *ep)
{
  dbs_sSect sect;
  
  int nVolref = 0;
  
  fseek(ep->f, ep->file.offset + (dbs_eSect_volref * dbs_dAlign(sizeof(sect))), SEEK_SET);

  if (fread(&sect, sizeof(sect), 1, ep->f) == 0) {
    *sts = errno_GetStatus();
    return NULL;
  }

  nVolref = sect.size / dbs_dAlign(sizeof(*vp));
  if (index >= nVolref)
    return NULL;
    
    
  fseek(ep->f, sect.offset + (index * dbs_dAlign(sizeof(*vp))), SEEK_SET);
    
  if (fread(vp, sizeof(*vp), 1, ep->f) == 0) {
    *sts = errno_GetStatus();
    return NULL;
  }
  
  return vp;
}
示例#2
0
pwr_tStatus
proc_Start (
  proc_sProcess *p
)
{
  pwr_tStatus sts = PROC__SUCCESS;
  char **argv;

  p->pid = fork();
  if (p->pid) {
    if (p->pid == -1) {
      errh_Error("Could not start %s, %m\nfile: %s", p->name, errno_GetStatus(), p->file);	
    } else {
      errh_Info("Started %s, prio: %d, pid: %d\nfile: %s", p->name, p->p_prio, (int)p->pid, p->file);	
    }
  } else {
    sts = proc_SetPriority(p->p_prio);
    if (EVEN(sts)) errh_Warning("%s: error setprio, %m\nfile: %s", p->name, sts, p->file);
    argv = co_StrToArgv(p->file, p->arg);
    execvp(p->file, argv);
    errh_Error("%s: error execvp, %m\nfile: %s", p->name, errno_GetStatus(), p->file);
    exit(EXIT_FAILURE);
  }

  return sts;
}
示例#3
0
dbs_sEnv *
dbs_Open(pwr_tStatus *sts, dbs_sEnv *ep, const char *filename)
{
    FILE *f;
    co_mFormat srcFormat, ownFormat;
    PDR pdrs;
    dbs_sSect sect;

    *sts = DBS__SUCCESS;
    memset(ep, 0, sizeof(*ep));
    
    f = fopen(filename, "r");
    if (f == NULL) {
        *sts = errno_GetStatus();
        return NULL;
    } 

    if (fread(&ep->file, sizeof(ep->file), 1, f) == 0) {
        *sts = errno_GetStatus();
        fclose(f);
        return NULL;
    }
    
    fseek(f, ep->file.offset, SEEK_SET);

    if (fread(&sect, sizeof(sect), 1, f) == 0) {
        *sts = errno_GetStatus();
        fclose(f);
        return NULL;
    }

    ep->nSect = sect.size / dbs_dAlign(sizeof(sect));
    

#if 0
    srcFormat.m = ntohl(ep->file.format.m);    
#else
    srcFormat.m = ep->file.format.m;    
#endif
    co_GetOwnFormat(&ownFormat);

    if (srcFormat.m != ownFormat.m) {
        pdrmem_create(&pdrs, &ep->file, sizeof(ep->file), PDR_DECODE, srcFormat, ownFormat);
        if (!pdr_dbs_sFile(&pdrs, &ep->file)) {
            *sts = DBS__PDRFILE;
            fclose(f);
            return NULL;
        }
    }
    
    fseek(f, 0, SEEK_SET);
    ep->f = f;

    return ep;
}
示例#4
0
pwr_tBoolean 
dbs_AlignedRead(pwr_tStatus *sts, void *buf, pwr_tUInt32 size, const dbs_sEnv *ep)
{
    int offset;
    *sts = DBS__SUCCESS;   
    

    if (fread(buf, size, 1, ep->f) == 0)
      pwr_Return(NO, sts, errno_GetStatus());

    if ((offset = dbs_dPadding(size)) > 0)
        if(fseek(ep->f, offset, SEEK_CUR))
            pwr_Return(NO, sts, errno_GetStatus());

    return YES;
}
示例#5
0
dbs_sVolume *
dbs_Volume(pwr_tStatus *sts, dbs_sVolume *vp, const dbs_sEnv *ep)
{
  dbs_sSect sect;
  
  fseek(ep->f, ep->file.offset + (dbs_eSect_volume * dbs_dAlign(sizeof(sect))), SEEK_SET);

  if (fread(&sect, sizeof(sect), 1, ep->f) == 0) {
    *sts = errno_GetStatus();
    return NULL;
  }

  fseek(ep->f, sect.offset, SEEK_SET);
    
  if (fread(vp, sizeof(*vp), 1, ep->f) == 0) {
    *sts = errno_GetStatus();
    return NULL;
  }
  
  return vp;
}
示例#6
0
void disksup_object::exec()
{
#if defined OS_LINUX
  struct statfs buf;
  int sts;

  pwr_sClass_DiskSup *o = (pwr_sClass_DiskSup *)p;

  sts = statfs( o->DiskName, &buf);
  if ( sts != 0) {
    sts = errno_GetStatus();
    if ( o->Status != sts) {
      o->Status = sts;
      printf( "Can't find disk\n");
    }
    return;
  }

  o->CurrentUse = 100.0 - 100.0 * buf.f_bfree / buf.f_blocks;

  // Check if limit is exceeded
  if ( !(o->CurrentUse < o->UsedMaxLimit)) {
    if ( o->Status != SMON__DISKHIGHLIMIT) {
      o->Status = SMON__DISKHIGHLIMIT;
      if ( o->Action & pwr_mDiskSupActionMask_Alarm) {
	pwr_tOName name;

	sts = gdh_ObjidToName( aref.Objid, name, sizeof(name), cdh_mNName);
	rt_sysmon::alarm_send( aref.Objid, o->DetectText, name, o->EventPriority);
      }
      if ( o->Action & pwr_mDiskSupActionMask_Command) {
	if ( strcmp( o->Command, "") != 0) {
	  char msg[200];

	  system( o->Command);
	  sprintf( msg, "Command %s: %s", o->DiskName, o->Command);
	  errh_Info( msg);
	}
      }
    }
  }
  else
    o->Status = SMON__SUCCESS;
#endif
}
示例#7
0
pwr_tStatus
wb_dbs::openFile()
{
  struct stat sb;
  pwr_tStatus sts;
  int ret;  

  m_fp = fopen(m_fileName, "w+b");
  if (m_fp == NULL) {
    printf("** Cannot open file: %s\n", m_fileName);
    perror("   Reason");
    return LDH__FILEOPEN;
  }

  if ((ret = stat(m_fileName, &sb)) != 0) {
    sts = errno_GetStatus();
    return sts;
  }

  return LDH__SUCCESS;
}
示例#8
0
dbs_sMenv *
dbs_Map(pwr_tStatus *sts, const char *filename)
{
    struct stat sb;
    int ret;
    int fd;
    int tfd;
    int i;
    dbs_sSect *sect;
    void *base = 0;
    int nVolRef;
    dbs_sVolRef *vrp;
    dbs_sMenv *mep = 0;
    dbs_sVenv *vep = 0;
    char buf[512];
    char tfname[] = "/tmp/loadfile.dbs_XXXXXX";
    
    *sts = DBS__SUCCESS;

    if ((ret = stat(filename, &sb)) != 0) {
        *sts = errno_GetStatus();
        return NULL;
    }

    fd = open(filename, O_RDWR);
    tfd = mkstemp(tfname);
    
    while (1) {
      int count;
      
      count = read(fd, buf, sizeof(buf));
      if (count <= 0)
        break;
      write(tfd, buf, count);
    }

    ret = close(fd);
    
    errno = 0;
    
    base = mmap(NULL, sb.st_size, PROT_READ, MAP_SHARED, tfd, 0);
    if (base == NULL) {
        *sts = errno_GetStatus();
        perror("mmap");
        ret = close(tfd);
        return NULL;
    }
    ret = close(tfd);
#if !defined OS_CYGWIN
    unlink(tfname);
#endif    

    sect = (dbs_sSect*)(base + dbs_dAlign(sizeof(dbs_sFile)));
    vrp = (dbs_sVolRef*)(base + sect[dbs_eSect_volref].offset);
    nVolRef = sect[dbs_eSect_volref].size / dbs_dAlign(sizeof(dbs_sVolRef));

    mep = (dbs_sMenv *)calloc(1, sizeof(dbs_sMenv) + (nVolRef * sizeof(dbs_sVenv)));
    
    mep->size = sb.st_size;
    mep->flags.b.isMapped = 1;
    mep->vrp     = vrp;
    mep->nVolRef = nVolRef;
    mep->base = base;
    strncpy(mep->tfname, tfname, sizeof(tfname));
    vep = mep->venv;

    vep->mp       = mep;
    vep->index    = 0;
    vep->base     = base;
    vep->sect     = (dbs_sSect*)(vep->base + dbs_dAlign(sizeof(dbs_sFile)));
    vep->vp       = (dbs_sVolume*)(vep->base + vep->sect[dbs_eSect_volume].offset);
    vep->name_bt  = &vep->vp->name_bt;
    vep->oid_bt   = &vep->vp->oid_bt;
    vep->class_bt = &vep->vp->class_bt;

    for (i = 0; i < nVolRef; i++) {
      vep = &mep->venv[i + 1];
      
      vep->mp       = mep;
      vep->index    = i + 1;
      vep->base     = base + vrp[i].offset;
      vep->sect     = (dbs_sSect*)(vep->base + dbs_dAlign(sizeof(dbs_sFile)));
      vep->vp       = (dbs_sVolume*)(vep->base + vep->sect[dbs_eSect_volume].offset);
      vep->name_bt  = &vep->vp->name_bt;
      vep->oid_bt   = &vep->vp->oid_bt;
      vep->class_bt = &vep->vp->class_bt;
      vep->size     = ((dbs_sFile*)vep->base)->size;
    }
    
    return mep;
}