void SpGetInfo(void) { unsigned char item; int replymax; char name[MAX_SLICE_LENGTH]; dbgmsg("SP.GETINFO"); InBuf = &Tbuf[3]; OutBuf = &Tbuf[2]; OutCount = 0; item = get_8(); replymax = get_16(); switch (item) { case INFO_SWITCH: put_8(ER_SUCCESS); put_8(SWITCH_CHAR); break; case INFO_EOL: put_8(ER_SUCCESS); put_slice(strlen(NEWLINE_SEQUENCE), NEWLINE_SEQUENCE); break; case INFO_STDERR: put_8(ER_SUCCESS); put_8(REDIRECT_STDERR); break; case INFO_SERVERID: put_8(ER_SUCCESS); sprintf(name,"%s %s", PROGRAM_NAME, VERSION_NAME); put_slice(strlen(name), name); break; case INFO_SERVERMAJ: put_8(ER_SUCCESS); put_32((long) MAJOR_ID); break; case INFO_SERVERMIN: put_8(ER_SUCCESS); put_32((long) MINOR_ID); break; case INFO_PKTSIZE: put_8(ER_SUCCESS); put_32((long) TRANSACTION_BUFFER_SIZE); break; default: put_8(ER_ERROR); break; } put_count(OutCount); }
void StreamPeer::put_var(const Variant &p_variant) { int len = 0; Vector<uint8_t> buf; encode_variant(p_variant, NULL, len); buf.resize(len); put_32(len); encode_variant(p_variant, buf.ptr(), len); put_data(buf.ptr(), buf.size()); }
Error FileAccessNetworkClient::connect(const String& p_host,int p_port,const String& p_password) { IP_Address ip; if (p_host.is_valid_ip_address()) { ip=p_host; } else { ip=IP::get_singleton()->resolve_hostname(p_host); } DEBUG_PRINT("IP: "+String(ip)+" port "+itos(p_port)); Error err = client->connect(ip,p_port); ERR_FAIL_COND_V(err,err); while(client->get_status()==StreamPeerTCP::STATUS_CONNECTING) { //DEBUG_PRINT("trying to connect...."); OS::get_singleton()->delay_usec(1000); } if (client->get_status()!=StreamPeerTCP::STATUS_CONNECTED) { return ERR_CANT_CONNECT; } CharString cs = p_password.utf8(); put_32(cs.length()); client->put_data((const uint8_t*)cs.ptr(),cs.length()); int e = get_32(); if (e!=OK) { return ERR_INVALID_PARAMETER; } thread = Thread::create(_thread_func,this); return OK; }
void FileAccessNetworkClient::_thread_func() { client->set_nodelay(true); while(!quit) { DEBUG_PRINT("SEM WAIT - "+itos(sem->get())); Error err = sem->wait(); DEBUG_TIME("sem_unlock"); //DEBUG_PRINT("semwait returned "+itos(werr)); DEBUG_PRINT("MUTEX LOCK "+itos(lockcount)); DEBUG_PRINT("POPO"); DEBUG_PRINT("PEPE"); lock_mutex(); DEBUG_PRINT("MUTEX PASS"); blockrequest_mutex->lock(); while(block_requests.size()) { put_32(block_requests.front()->get().id); put_32(FileAccessNetwork::COMMAND_READ_BLOCK); put_64(block_requests.front()->get().offset); put_32(block_requests.front()->get().size); block_requests.pop_front(); } blockrequest_mutex->unlock(); DEBUG_PRINT("THREAD ITER"); DEBUG_TIME("sem_read"); int id = get_32(); int response = get_32(); DEBUG_PRINT("GET RESPONSE: "+itos(response)); FileAccessNetwork *fa=NULL; if (response!=FileAccessNetwork::RESPONSE_DATA) { ERR_FAIL_COND(!accesses.has(id)); } if (accesses.has(id)) fa=accesses[id]; switch(response) { case FileAccessNetwork::RESPONSE_OPEN: { DEBUG_TIME("sem_open"); int status = get_32(); if (status!=OK) { fa->_respond(0,Error(status)); } else { uint64_t len = get_64(); fa->_respond(len,Error(status)); } fa->sem->post(); } break; case FileAccessNetwork::RESPONSE_DATA: { int64_t offset = get_64(); uint32_t len = get_32(); Vector<uint8_t> block; block.resize(len); client->get_data(block.ptr(),len); if (fa) //may have been queued fa->_set_block(offset,block); } break; case FileAccessNetwork::RESPONSE_FILE_EXISTS: { int status = get_32(); fa->exists_modtime=status!=0; fa->sem->post(); } break; case FileAccessNetwork::RESPONSE_GET_MODTIME: { uint64_t status = get_64(); fa->exists_modtime=status; fa->sem->post(); } break; } unlock_mutex(); } }
static void send_command (int s, int command, uint32_t switches, uint32_t extra, int length, char *data) { command_t cmd; int len8; len8 = (length + 7) / 8; cmd.num_bytes = 0; put_32 (&cmd, 0x00000001); /* start sequence */ put_32 (&cmd, 0xB00BFACE); /* #-)) */ put_32 (&cmd, len8*8 + 32); put_32 (&cmd, 0x20534d4d); /* protocol type "MMS " */ put_32 (&cmd, len8 + 4); put_32 (&cmd, seq_num); seq_num++; put_32 (&cmd, 0x0); /* unknown */ put_32 (&cmd, 0x0); put_32 (&cmd, len8+2); put_32 (&cmd, 0x00030000 | command); /* dir | command */ put_32 (&cmd, switches); put_32 (&cmd, extra); memcpy (&cmd.buf[48], data, length); if (length & 7) memset(&cmd.buf[48 + length], 0, 8 - (length & 7)); if (send (s, cmd.buf, len8*8+48, 0) != (len8*8+48)) { mp_tmsg(MSGT_NETWORK,MSGL_ERR,"write error\n"); } }
void SpOpenRec(void) { char fname[MAX_SLICE_LENGTH+1]; int namelen; int fileorg; int filemode; int filetype; int format; long mrs; long fileid; FILE *fd; struct FILE_INFO *info; #ifdef VMS struct RAB *rab; RecInfo *rinfo; unsigned int rfm,rat; #endif /* VMS */ dbgmsg("SP.OPENREC"); InBuf = &Tbuf[3]; OutBuf = &Tbuf[2]; OutCount = 0; namelen = get_slice((unsigned char *) fname); fname[namelen] = '\0'; fileorg = (int) get_8(); filemode = (int) get_8(); filetype = (int) get_8(); format = (int) get_8(); mrs = get_32(); dbgmsg("file=\"%s\" %d:%d:%d:%d %ld", fname, fileorg, filemode, filetype, format, mrs); /* Validate request */ if ((strlen(fname) == 0) || (fileorg < 3) || (fileorg > 4) || (filetype < 0) || (filetype > 2) || (filemode < 1) || (filemode > 6) || (format < 0) || (format > 1)) { SpFail(ER_ERROR); return; } if (filetype == TYPE_DONTCARE) filetype = TYPE_RECORD; #ifdef VMS if (fileorg == ORG_VARIABLE) rfm = FAB$C_VAR; rfm = (fileorg == ORG_VARIABLE)?FAB$C_VAR:FAB$C_FIX; rat = (filetype == TYPE_RECORD)?FAB$M_FTN:0; /* FTN:FAB$M_CR */ /* We ignore format under VMS */ /* decide whether to open or create file */ if ((filemode == 1) || (filemode == 4)) rab = vmsopen(fname, rfm, rat); else rab = vmscreate(fname, rfm, rat, rfm); if (rab == (struct RAB *) NULL) { SpFail(ER_NOFILE); return; } rinfo = newinfo(); if (rinfo == (RecInfo *) NULL) { vmsclose(rab); SpFail(ER_ERROR); } else { rinfo->baserec = 0; rinfo->prev = (FilePos *) NULL; rinfo->next = (FilePos *) NULL; } fd = stdout; /* Must be something ! */ #else fd = fopen(fname, OpenModes[fileorg-1][filemode-1]); if (fd == NULL) { SpFail(ER_NOFILE); return; } #endif /* VMS */ /* File opened OK */ fileid = RememberFile(fd, fileorg); if (fileid == NO_SLOT) { SpFail(ER_NORESOURCE); return; } /* Things are looking good Houston....beep */ info = &FileInfo[fileid]; info->buff = (unsigned char *) malloc((int) mrs+3); /* Room for CR, NL, EOS */ if (info->buff == (unsigned char *) NULL) { ForgetFile(fileid); SpFail(ER_NORESOURCE); return; } info->mrs = mrs; info->recordsize = -1; info->format = format; info->type = filetype; info->recno = 0; info->lastop = FIOP_NONE; info->pasteof = false; #ifdef VMS info->rab = rab; info->poslist = rinfo; #else if (fileorg == ORG_VARIABLE) { info->putfn = (format == FMT_FORMATTED)?form_seq_write_rec:unform_seq_write_rec; info->getfn = (format == FMT_FORMATTED)?form_seq_read_rec:unform_seq_read_rec; /* Need to allocate a read-ahead buffer for formatted files */ if (format == FMT_FORMATTED) { info->llbuff = (unsigned char *) malloc(LL_BUF_SIZE); info->llind = LL_BUF_SIZE; if (info->llbuff == (unsigned char *) NULL) { free(info->buff); ForgetFile(fileid); SpFail(ER_NORESOURCE); return; } } else { info->llbuff = NULL; info->llind = 0; } } else { info->putfn = direct_write_rec; info->getfn = direct_read_rec; info->llbuff = NULL; info->llind = 0; } #endif /* VMS */ put_8(ER_SUCCESS); put_32(mrs); put_32(fileid); put_32(filetype); put_count(OutCount); }
void SpGetRec(void) { long fileid; FILE *fd; int chunksize; long offset; bool doread=false; struct FILE_INFO *info; int res=ER_SUCCESS; dbgmsg("SP.GETREC"); InBuf = &Tbuf[3]; OutBuf = &Tbuf[2]; OutCount = 0; fileid = get_32(); chunksize = get_16(); offset = get_32(); if (get_8()) doread = true; dbgmsg("fileid=%d, chunksize=%d, offset=%ld, doread=%d", fileid, chunksize, offset, doread); if ((fileid < 0) || (fileid > MAX_FILES)) { put_8(ER_BADID); put_count(OutCount); return; } info = &FileInfo[fileid]; if (info->lastop == FIOP_WRITE) { put_8(ER_NOPOSN); put_count(OutCount); return; } if ((offset > info->mrs) || (offset < 0)) { put_8(ER_ERROR); put_count(OutCount); return; } if (doread == true) { info->recno++; #ifdef VMS res = vmsget(info); vmssavepos(info); #else res = info->getfn(info); #endif } dbgmsg("res=%d", res); if ((offset + (long)chunksize) > info->recordsize) chunksize = info->recordsize - offset; dbgmsg("recsiz=%ld, offset=%ld, chunksize=%d", info->recordsize, offset, chunksize); info->lastop = FIOP_READ; put_8(res); if (res == ER_SUCCESS) { put_32(info->recordsize); put_slice(chunksize, &(info->buff[offset])); } put_count(OutCount); }