void makeAndDisplayCM( char* name, char* pool ) { Daemon collector( DT_COLLECTOR, name, pool ); Daemon negotiator( DT_NEGOTIATOR, name, pool ); Daemon view_collector( DT_VIEW_COLLECTOR, name, pool ); if( ! collector.locate() ) { dprintf( dflag, "%s\n", collector.error() ); } else { collector.display( dflag ); } dprintf( dflag, "\n" ); if( ! negotiator.locate() ) { dprintf( dflag, "%s\n", negotiator.error() ); } else { negotiator.display( dflag ); } dprintf( dflag, "\n" ); if( ! view_collector.locate() ) { dprintf( dflag, "%s\n", view_collector.error() ); } else { view_collector.display( dflag ); } dprintf( dflag, "\n" ); }
/* Convert a CCB_SCSIIO into a BL_CCB32 and (possibly SG array). ** */ static long sim_execute_scsi_io(Symbios *s, CCB_HEADER *ccbh) { CCB_SCSIIO *ccb = (CCB_SCSIIO *) ccbh; uchar *cdb; physical_entry pe[2]; SymTarg *targ; uchar msg[8]; targ = s->targ + ccb->cam_ch.cam_target_id; if(targ->flags & tf_ignore){ ccbh->cam_status = CAM_SEL_TIMEOUT; return B_OK; } if(ccb->cam_ch.cam_flags & CAM_CDB_POINTER) { cdb = ccb->cam_cdb_io.cam_cdb_ptr; } else { cdb = ccb->cam_cdb_io.cam_cdb_bytes; } get_memory_map((void*) (ccb->cam_sim_priv), 1536, pe, 2); /* identify message */ msg[0] = 0xC0 | (ccb->cam_ch.cam_target_lun & 0x07); /* fill out table */ prep_io((SymPriv *) ccb->cam_sim_priv, (uint32) pe[0].address); /* insure only one transaction at a time for any given target */ acquire_sem(targ->sem_targ); targ->priv = (SymPriv *) ccb->cam_sim_priv;; targ->priv_phys = (uint32 ) pe[0].address; targ->inbound = (ccb->cam_ch.cam_flags & CAM_DIR_IN) ? 1 : 0; if(ccb->cam_ch.cam_flags & CAM_SCATTER_VALID){ exec_io(targ, cdb, ccb->cam_cdb_len, msg, 1, ccb->cam_data_ptr, ccb->cam_sglist_cnt, 1); } else { exec_io(targ, cdb, ccb->cam_cdb_len, msg, 1, ccb->cam_data_ptr, ccb->cam_dxfer_len, 0); } /* dprintf("symbios%d: state = 0x%02x, status = 0x%02x\n", s->num,targ->state,targ->priv->status[0]);*/ /* decode status */ switch(targ->status){ case status_complete: if((ccb->cam_scsi_status=targ->priv->_status[0]) != 0) { ccbh->cam_status = CAM_REQ_CMP_ERR; /* nonzero status is an error ... 0x02 = check condition */ if((ccb->cam_scsi_status == 0x02) && !(ccb->cam_ch.cam_flags & CAM_DIS_AUTOSENSE) && ccb->cam_sense_ptr && ccb->cam_sense_len){ uchar command[6]; command[0] = 0x03; /* request_sense */ command[1] = ccb->cam_ch.cam_target_lun << 5; command[2] = 0; command[3] = 0; command[4] = ccb->cam_sense_len; command[5] = 0; targ->inbound = 1; exec_io(targ, command, 6, msg, 1, ccb->cam_sense_ptr, ccb->cam_sense_len, 0); if(targ->priv->_status[0]){ ccb->cam_ch.cam_status |= CAM_AUTOSENSE_FAIL; } else { ccb->cam_ch.cam_status |= CAM_AUTOSNS_VALID; } } } else { ccbh->cam_status = CAM_REQ_CMP; if(cdb[0] == 0x12) { /* inquiry just succeeded ... is it non SG and with enough data to snoop the support bits? */ if(!(ccb->cam_ch.cam_flags & CAM_SCATTER_VALID) && (ccb->cam_dxfer_len>7)){ negotiator(s, targ, ccb->cam_data_ptr, msg); } } } break; case status_timeout: ccbh->cam_status = CAM_SEL_TIMEOUT; break; default: // XXX ccbh->cam_status = CAM_SEL_TIMEOUT; } targ->status = status_inactive; // dprintf("symbios%d: releasing targ @ 0x%08x\n",s->num,targ); release_sem(targ->sem_targ); return B_OK; }
int main(int argc, char* argv[]) { bool LongFlag=false; bool HierFlag=true; int ResetUsage=0; int DeleteUser=0; int SetFactor=0; int SetPrio=0; int SetAccum=0; int SetBegin=0; int SetLast=0; bool ResetAll=false; int GetResList=0; std::string pool; bool GroupRollup = false; myDistro->Init( argc, argv ); config(); MinLastUsageTime=time(0)-60*60*24; // Default to show only users active in the last day for (int i=1; i<argc; i++) { if (IsArg(argv[i],"setprio")) { if (i+2>=argc) usage(argv[0]); SetPrio=i; i+=2; } else if (IsArg(argv[i],"setfactor")) { if (i+2>=argc) usage(argv[0]); SetFactor=i; i+=2; } else if (IsArg(argv[i],"setbegin")) { if (i+2>=argc) usage(argv[0]); SetBegin=i; i+=2; } else if (IsArg(argv[i],"setaccum")) { if (i+2>=argc) usage(argv[0]); SetAccum=i; i+=2; } else if (IsArg(argv[i],"setlast")) { if (i+2>=argc) usage(argv[0]); SetLast=i; i+=2; } else if (IsArg(argv[i],"resetusage")) { if (i+1>=argc) usage(argv[0]); ResetUsage=i; i+=1; } else if (IsArg(argv[i],"delete",3)) { if (i+1>=argc) usage(argv[0]); DeleteUser=i; i+=1; } else if (IsArg(argv[i],"resetall")) { ResetAll=true; } else if (IsArg(argv[i],"long",1)) { LongFlag=true; } else if (IsArg(argv[i],"hierarchical",2) || IsArg(argv[i],"heir")) { HierFlag=true; DashHier=true; } else if (IsArg(argv[i],"flat",2)) { HierFlag=false; DashHier=true; } else if (IsArg(argv[i],"grouprollup")) { GroupRollup=true; } else if (IsArg(argv[i],"grouporder")) { GroupOrder=true; HierFlag = false; DashHier = true; } else if (IsArg(argv[i],"quotas",1)) { DetailFlag |= DetailQuotas; DashQuota = true; } else if (IsArg(argv[i],"surplus")) { DetailFlag |= DetailSurplus; DashQuota = true; } else if (IsArg(argv[i],"sortkey",2)) { DetailFlag |= DetailSortKey; DashSortKey = true; } else if (IsArg(argv[i],"all")) { DetailFlag |= DetailAll; DashAll = true; } else if (IsArg(argv[i],"most",2)) { DetailFlag |= DetailMost; #ifdef DEBUG DetailFlag |= DetailGroup; #endif DashAll = true; } else if (IsArg(argv[i],"groupid")) { DetailFlag |= DetailGroup; } else if (IsArg(argv[i],"order")) { DetailFlag |= DetailOrder; } else if (IsArg(argv[i],"activefrom")) { if (argc-i<=3) usage(argv[0]); int month=atoi(argv[i+1]); int day=atoi(argv[i+2]); int year=atoi(argv[i+3]); MinLastUsageTime=CalcTime(month,day,year); // printf("Date translation: %d/%d/%d = %d\n",month,day,year,FromDate); i+=3; } else if (IsArg(argv[i],"allusers")) { MinLastUsageTime=-1; } else if (IsArg(argv[i],"usage",2)) { DetailFlag |= DetailUsage | DetailUseTime1 | DetailUseTime2; } else if (IsArg(argv[i],"priority",4)) { DetailFlag |= DetailPrios; } else if (IsArg(argv[i],"getreslist",6)) { if (argc-i<=1) usage(argv[0]); GetResList=i; i+=1; } else if (IsArg(argv[i],"pool",1)) { if (argc-i<=1) usage(argv[0]); pool = argv[i+1]; i++; } else { usage(argv[0]); } } //---------------------------------------------------------- // Get info on our negotiator Daemon negotiator(DT_NEGOTIATOR, NULL, (pool != "") ? pool.c_str() : NULL); if (!negotiator.locate()) { fprintf(stderr, "%s: Can't locate negotiator in %s\n", argv[0], (pool != "") ? pool.c_str() : "local pool"); exit(1); } if (SetPrio) { // set priority char* tmp; if( ! (tmp = strchr(argv[SetPrio+1], '@')) ) { fprintf( stderr, "%s: You must specify the full name of the submittor you wish\n", argv[0] ); fprintf( stderr, "\tto update the priority of (%s or %s)\n", "*****@*****.**", "*****@*****.**" ); exit(1); } float Priority=atof(argv[SetPrio+2]); // send request Sock* sock; if( !(sock = negotiator.startCommand(SET_PRIORITY, Stream::reli_sock, 0) ) || !sock->put(argv[SetPrio+1]) || !sock->put(Priority) || !sock->end_of_message()) { fprintf( stderr, "failed to send SET_PRIORITY command to negotiator\n" ); exit(1); } sock->close(); delete sock; printf("The priority of %s was set to %f\n",argv[SetPrio+1],Priority); } else if (SetFactor) { // set priority char* tmp; if( ! (tmp = strchr(argv[SetFactor+1], '@')) ) { fprintf( stderr, "%s: You must specify the full name of the submittor you wish\n", argv[0] ); fprintf( stderr, "\tto update the priority of (%s or %s)\n", "*****@*****.**", "*****@*****.**" ); exit(1); } float Factor=atof(argv[SetFactor+2]); if (Factor<1) { fprintf( stderr, "Priority factors must be greater than or equal to " "1.\n"); exit(1); } // send request Sock* sock; if( !(sock = negotiator.startCommand(SET_PRIORITYFACTOR, Stream::reli_sock, 0) ) || !sock->put(argv[SetFactor+1]) || !sock->put(Factor) || !sock->end_of_message()) { fprintf( stderr, "failed to send SET_PRIORITYFACTOR command to negotiator\n" ); exit(1); } sock->close(); delete sock; printf("The priority factor of %s was set to %f\n",argv[SetFactor+1],Factor); } else if (SetAccum) { // set accumulated usage char* tmp; if( ! (tmp = strchr(argv[SetAccum+1], '@')) ) { fprintf( stderr, "%s: You must specify the full name of the submittor you wish\n", argv[0] ); fprintf( stderr, "\tto update the Accumulated usage of (%s or %s)\n", "*****@*****.**", "*****@*****.**" ); exit(1); } float accumUsage=atof(argv[SetAccum+2]); if (accumUsage<0.0) { fprintf( stderr, "Usage must be greater than 0 seconds\n"); exit(1); } // send request Sock* sock; if( !(sock = negotiator.startCommand(SET_ACCUMUSAGE, Stream::reli_sock, 0) ) || !sock->put(argv[SetAccum+1]) || !sock->put(accumUsage) || !sock->end_of_message()) { fprintf( stderr, "failed to send SET_ACCUMUSAGE command to negotiator\n" ); exit(1); } sock->close(); delete sock; printf("The Accumulated Usage of %s was set to %f\n",argv[SetAccum+1],accumUsage); } else if (SetBegin) { // set begin usage time char* tmp; if( ! (tmp = strchr(argv[SetBegin+1], '@')) ) { fprintf( stderr, "%s: You must specify the full name of the submittor you wish\n", argv[0] ); fprintf( stderr, "\tto update the begin usage time of (%s or %s)\n", "*****@*****.**", "*****@*****.**" ); exit(1); } int beginTime=atoi(argv[SetBegin+2]); if (beginTime<0) { fprintf( stderr, "Time must be greater than 0 seconds\n"); exit(1); } // send request Sock* sock; if( !(sock = negotiator.startCommand(SET_BEGINTIME, Stream::reli_sock, 0) ) || !sock->put(argv[SetBegin+1]) || !sock->put(beginTime) || !sock->end_of_message()) { fprintf( stderr, "failed to send SET_BEGINTIME command to negotiator\n" ); exit(1); } sock->close(); delete sock; printf("The Begin Usage Time of %s was set to %d\n", argv[SetBegin+1],beginTime); } else if (SetLast) { // set last usage time char* tmp; if( ! (tmp = strchr(argv[SetLast+1], '@')) ) { fprintf( stderr, "%s: You must specify the full name of the submittor you wish\n", argv[0] ); fprintf( stderr, "\tto update the last usage time of (%s or %s)\n", "*****@*****.**", "*****@*****.**" ); exit(1); } int lastTime=atoi(argv[SetLast+2]); if (lastTime<0) { fprintf( stderr, "Time must be greater than 0 seconds\n"); exit(1); } // send request Sock* sock; if( !(sock = negotiator.startCommand(SET_LASTTIME, Stream::reli_sock, 0) ) || !sock->put(argv[SetLast+1]) || !sock->put(lastTime) || !sock->end_of_message()) { fprintf( stderr, "failed to send SET_LASTTIME command to negotiator\n" ); exit(1); } sock->close(); delete sock; printf("The Last Usage Time of %s was set to %d\n", argv[SetLast+1],lastTime); } else if (ResetUsage) { // set priority char* tmp; if( ! (tmp = strchr(argv[ResetUsage+1], '@')) ) { fprintf( stderr, "%s: You must specify the full name of the submittor you wish\n", argv[0] ); fprintf( stderr, "\tto update the priority of (%s or %s)\n", "*****@*****.**", "*****@*****.**" ); exit(1); } // send request Sock* sock; if( !(sock = negotiator.startCommand(RESET_USAGE, Stream::reli_sock, 0) ) || !sock->put(argv[ResetUsage+1]) || !sock->end_of_message()) { fprintf( stderr, "failed to send RESET_USAGE command to negotiator\n" ); exit(1); } sock->close(); delete sock; printf("The accumulated usage of %s was reset\n",argv[ResetUsage+1]); } else if (DeleteUser) { // remove a user record from the accountant char* tmp; if( ! (tmp = strchr(argv[DeleteUser+1], '@')) ) { fprintf( stderr, "%s: You must specify the full name of the record you wish\n", argv[0] ); fprintf( stderr, "\tto delete (%s or %s)\n", "*****@*****.**", "*****@*****.**" ); exit(1); } // send request Sock* sock; if( !(sock = negotiator.startCommand(DELETE_USER, Stream::reli_sock, 0) ) || !sock->put(argv[DeleteUser+1]) || !sock->end_of_message()) { fprintf( stderr, "failed to send DELETE_USER command to negotiator\n" ); exit(1); } sock->close(); delete sock; printf("The accountant record named %s was deleted\n",argv[DeleteUser+1]); } else if (ResetAll) { // send request if( ! negotiator.sendCommand(RESET_ALL_USAGE, Stream::reli_sock, 0) ) { fprintf( stderr, "failed to send RESET_ALL_USAGE command to negotiator\n" ); exit(1); } printf("The accumulated usage was reset for all users\n"); } else if (GetResList) { // get resource list char* tmp; if( ! (tmp = strchr(argv[GetResList+1], '@')) ) { fprintf( stderr, "%s: You must specify the full name of the submittor you wish\n", argv[0] ); fprintf( stderr, "\tto update the priority of (%s or %s)\n", "*****@*****.**", "*****@*****.**" ); exit(1); } // send request Sock* sock; if( !(sock = negotiator.startCommand(GET_RESLIST, Stream::reli_sock, 0) ) || !sock->put(argv[GetResList+1]) || !sock->end_of_message()) { fprintf( stderr, "failed to send GET_RESLIST command to negotiator\n" ); exit(1); } // get reply sock->decode(); AttrList* ad=new AttrList(); if (!ad->initAttrListFromStream(*sock) || !sock->end_of_message()) { fprintf( stderr, "failed to get classad from negotiator\n" ); exit(1); } sock->close(); delete sock; if (LongFlag) ad->fPrint(stdout); else PrintResList(ad); } else { // list priorities Sock* sock; if (!(sock = negotiator.startCommand((GroupRollup) ? GET_PRIORITY_ROLLUP : GET_PRIORITY, Stream::reli_sock, 0)) || !sock->end_of_message()) { fprintf(stderr, "failed to send %s command to negotiator\n", (GroupRollup) ? "GET_PRIORITY_ROLLUP" : "GET_PRIORITY"); exit(1); } // get reply sock->decode(); AttrList* ad=new AttrList(); if (!ad->initAttrListFromStream(*sock) || !sock->end_of_message()) { fprintf( stderr, "failed to get classad from negotiator\n" ); exit(1); } sock->close(); delete sock; // if no details specified, show priorities if ( ! DetailFlag) { DetailFlag = DetailDefault; #ifdef DEBUG DetailFlag |= DetailGroup; #endif } // if showing only prio, don't bother showing groups if ( ! (DetailFlag & ~DetailPrios) && GroupPrioIsMeaningless) { if ( ! DashHier ) HierFlag = false; HideGroups = !HierFlag; } if (LongFlag) ad->fPrint(stdout); else ProcessInfo(ad,GroupRollup,HierFlag); } exit(0); return 0; }