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(§, 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; }
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; }
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(§, 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; }
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; }
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(§, 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; }
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 }
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; }
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; }