int fs_mount_sd(int sock, void* pClient, void* pCmd) { while (bss.lock) GX2WaitForVsync(); bss.lock = 1; int is_mounted = 0; char buffer[1]; if (sock != -1) { buffer[0] = BYTE_MOUNT_SD; sendwait(sock, buffer, 1); } // mount sdcard FSMountSource mountSrc; char mountPath[FS_MAX_MOUNTPATH_SIZE]; int status = FSGetMountSource(pClient, pCmd, FS_SOURCETYPE_EXTERNAL, &mountSrc, FS_RET_NO_ERROR); if (status == FS_STATUS_OK) { status = FSMount(pClient, pCmd, &mountSrc, mountPath, sizeof(mountPath), FS_RET_UNSUPPORTED_CMD); if (status == FS_STATUS_OK) { // set as mounted is_mounted = 1; } } if (sock != -1) { buffer[0] = is_mounted ? BYTE_MOUNT_SD_OK : BYTE_MOUNT_SD_BAD; sendwait(sock, buffer, 1); } bss.lock = 0; return is_mounted; }
int bound_mpi_int(int boundstage, int boundvartype, PFTYPE (*prim)[NSTORE2][NSTORE3][NUMPFLAGS]) { int dir; #if(USEMPI) /* These arrays contain designations that identify * each recv and send */ static MPI_Request requests[COMPDIM * 2 * 2]; // format of map for requests[dir*2+recv/send(0/1)] #endif #if(USEMPI) /////////////// // dir=1 if((boundstage==STAGE0)||(boundstage==STAGEM1)){ for(dir=X1UP;dir<=X1DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) pack_int(dir,boundvartype,prim,workbc_int); for(dir=X1UP;dir<=X1DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendrecv_int(dir,boundvartype,workbc_int,requests); } if((boundstage==STAGE1)||(boundstage==STAGEM1)){ for(dir=X1UP;dir<=X1DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) recvwait(dir,requests); for(dir=X1UP;dir<=X1DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) unpack_int(dir,boundvartype,workbc_int,prim); for(dir=X1UP;dir<=X1DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendwait(dir,requests); } /////////////// // dir=2 if((boundstage==STAGE2)||(boundstage==STAGEM1)){ for(dir=X2UP;dir<=X2DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) pack_int(dir,boundvartype,prim,workbc_int); for(dir=X2UP;dir<=X2DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendrecv_int(dir,boundvartype,workbc_int,requests); } if((boundstage==STAGE3)||(boundstage==STAGEM1)){ for(dir=X2UP;dir<=X2DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) recvwait(dir,requests); for(dir=X2UP;dir<=X2DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) unpack_int(dir,boundvartype,workbc_int,prim); for(dir=X2UP;dir<=X2DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendwait(dir,requests); } /////////////// // dir=3 if((boundstage==STAGE4)||(boundstage==STAGEM1)){ for(dir=X3UP;dir<=X3DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) pack_int(dir,boundvartype,prim,workbc_int); for(dir=X3UP;dir<=X3DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendrecv_int(dir,boundvartype,workbc_int,requests); } if((boundstage==STAGE5)||(boundstage==STAGEM1)){ for(dir=X3UP;dir<=X3DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) recvwait(dir,requests); for(dir=X3UP;dir<=X3DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) unpack_int(dir,boundvartype,workbc_int,prim); for(dir=X3UP;dir<=X3DN;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendwait(dir,requests); } // now corner zones will be filled correctly // GODMARK: If made fixup_utoprim() and check_solution() not use corner zones could bound all directions at once -- probably not important performance hit // end if mpi #endif return(0); }
int bound_mpi_int(int boundstage, int prim[][N2M][N3M][NUMPFLAGS]) { int dir; #if(USEMPI) /* These arrays contain designations that identify * each recv and send */ static MPI_Request requests[COMPDIM * 2 * 2]; // format of map for requests[dir*2+recv/send(0/1)] #endif #if(USEMPI) if((boundstage==STAGE0)||(boundstage==STAGEM1)){ for(dir=X1UP;dir<=X1DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) pack_int(dir,prim,workbc_int); for(dir=X1UP;dir<=X1DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendrecv_int(dir,workbc_int,requests); } if((boundstage==STAGE1)||(boundstage==STAGEM1)){ for(dir=X1UP;dir<=X1DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) recvwait(dir,requests); for(dir=X1UP;dir<=X1DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) unpack_int(dir,workbc_int,prim); for(dir=X1UP;dir<=X1DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendwait(dir,requests); } if((boundstage==STAGE2)||(boundstage==STAGEM1)){ for(dir=X2UP;dir<=X2DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) pack_int(dir,prim,workbc_int); for(dir=X2UP;dir<=X2DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendrecv_int(dir,workbc_int,requests); } if((boundstage==STAGE3)||(boundstage==STAGEM1)){ for(dir=X2UP;dir<=X2DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) recvwait(dir,requests); for(dir=X2UP;dir<=X2DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) unpack_int(dir,workbc_int,prim); for(dir=X2UP;dir<=X2DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendwait(dir,requests); } if((boundstage==STAGE4)||(boundstage==STAGEM1)){ for(dir=X3UP;dir<=X3DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) pack_int(dir,prim,workbc_int); for(dir=X3UP;dir<=X3DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendrecv_int(dir,workbc_int,requests); } if((boundstage==STAGE5)||(boundstage==STAGEM1)){ for(dir=X3UP;dir<=X3DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) recvwait(dir,requests); for(dir=X3UP;dir<=X3DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) unpack_int(dir,workbc_int,prim); for(dir=X3UP;dir<=X3DN;dir++) if(dirset[BOUNDPRIMTYPE][dir][DIRIF]) sendwait(dir,requests); } // end if mpi #endif return(0); }
void log_string(int sock, const char* str, char flag_byte) { if(sock == -1) { return; } while (bss.lock) GX2WaitForVsync(); bss.lock = 1; int i; int len_str = 0; while (str[len_str++]); // { char buffer[1 + 4 + len_str]; buffer[0] = flag_byte; *(int *)(buffer + 1) = len_str; for (i = 0; i < len_str; i++) buffer[5 + i] = str[i]; buffer[5 + i] = 0; sendwait(sock, buffer, 1 + 4 + len_str); } bss.lock = 0; }
int cafiine_fstat(int sock, int *result, int fd, void *ptr) { while (bss.lock) GX2WaitForVsync(); bss.lock = 1; CHECK_ERROR(sock == -1); int ret; char buffer[1 + 4]; buffer[0] = BYTE_STATFILE; *(int *)(buffer + 1) = fd; ret = sendwait(sock, buffer, 1 + 4); CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); CHECK_ERROR(ret == BYTE_NORMAL); ret = recvwait(sock, result, 4); CHECK_ERROR(ret < 0); int sz; ret = recvwait(sock, &sz, 4); CHECK_ERROR(ret < 0); if (ptr) { ret = recvwait(sock, ptr, sz); CHECK_ERROR(ret < 0); } bss.lock = 0; return 0; error: bss.lock = 0; return -1; }
int cafiine_fgetpos(int sock, int *result, int fd, int *pos) { while (bss.lock) GX2WaitForVsync(); bss.lock = 1; CHECK_ERROR(sock == -1); int ret; char buffer[1 + 4]; buffer[0] = BYTE_GETPOS; *(int *)(buffer + 1) = fd; ret = sendwait(sock, buffer, 1 + 4); CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); CHECK_ERROR(ret == BYTE_NORMAL); ret = recvwait(sock, result, 4); CHECK_ERROR(ret < 0); ret = recvwait(sock, pos, 4); CHECK_ERROR(ret < 0); bss.lock = 0; return 0; error: bss.lock = 0; return -1; }
int cafiine_fread(int sock, int *result, void *ptr, int size, int count, int fd) { while (bss.lock) GX2WaitForVsync(); bss.lock = 1; CHECK_ERROR(sock == -1); int ret; char buffer[1 + 12]; buffer[0] = BYTE_READ; *(int *)(buffer + 1) = size; *(int *)(buffer + 5) = count; *(int *)(buffer + 9) = fd; ret = sendwait(sock, buffer, 1 + 12); CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); CHECK_ERROR(ret == BYTE_NORMAL); ret = recvwait(sock, result, 4); CHECK_ERROR(ret < 0); int sz; ret = recvwait(sock, &sz, 4); CHECK_ERROR(ret < 0); ret = recvwait(sock, ptr, sz); CHECK_ERROR(ret < 0); ret = sendbyte(sock, BYTE_OK); CHECK_ERROR(ret < 0); bss.lock = 0; return 0; error: bss.lock = 0; return -1; }
static Result networkinstall_open_src(void* data, u32 index, u32* handle) { network_install_data* networkInstallData = (network_install_data*) data; u8 ack = 1; if(sendwait(networkInstallData->clientSocket, &ack, sizeof(ack), 0) < 0) { return R_FBI_ERRNO; } return 0; }
void fs_disconnect(int sock) { CHECK_ERROR(sock == -1); char byte = BYTE_DISCONNECT; sendwait(sock, &byte, 1); socketclose(sock); error: return; }
void log_byte(int sock, char byte) { while (bss.lock) GX2WaitForVsync(); bss.lock = 1; CHECK_ERROR(sock == -1); sendwait(sock, &byte, 1); error: bss.lock = 0; }
static int cafiine_handshake(int sock) { int ret; unsigned char buffer[16]; memcpy(buffer, &title_id, 16); ret = sendwait(sock, buffer, sizeof(buffer)); CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); return ret; error: return ret; }
int cafiine_fopen(int sock, int *result, const char *path, const char *mode, int *handle) { while (bss.lock) GX2WaitForVsync(); bss.lock = 1; CHECK_ERROR(sock == -1); int ret; int len_path = 0; while (path[len_path++]); int len_mode = 0; while (mode[len_mode++]); { char buffer[1 + 8 + len_path + len_mode]; buffer[0] = BYTE_OPEN; *(int *)(buffer + 1) = len_path; *(int *)(buffer + 5) = len_mode; for (ret = 0; ret < len_path; ret++) buffer[9 + ret] = path[ret]; for (ret = 0; ret < len_mode; ret++) buffer[9 + len_path + ret] = mode[ret]; ret = sendwait(sock, buffer, 1 + 8 + len_path + len_mode); } CHECK_ERROR(ret < 0); ret = recvbyte(sock); CHECK_ERROR(ret < 0); CHECK_ERROR(ret == BYTE_NORMAL); ret = recvwait(sock, result, 4); CHECK_ERROR(ret < 0); ret = recvwait(sock, handle, 4); CHECK_ERROR(ret < 0); bss.lock = 0; return 0; error: bss.lock = 0; return -1; }
int bound_mpi_int_dir(int boundstage, int finalstep, int whichdir, int boundvartype, PFTYPE (*prim)[NSTORE2][NSTORE3][NUMPFLAGS]) { int dir; static MPI_Request requests[COMPDIM * 2 * 2]; static int didpostrecvs[COMPDIM*2]={0}; int dirstart,dirfinish; if(whichdir==-1 || whichdir==1){ dirstart=X1UP; dirfinish=X1DN;} if(whichdir==-2 || whichdir==2){ dirstart=X2UP; dirfinish=X2DN;} if(whichdir==-3 || whichdir==3){ dirstart=X3UP; dirfinish=X3DN;} //////////// // // pre-post recv's // // OPTMARK: Could avoid dir-dependent MPI calls in step_ch.c (currently true!) and post all recv's for all dirs at once. // OPTMARK: Or setup MPIFLOWCONTROL==2 or SUPERMPI // //////////// if(whichdir==-1 || whichdir==-2 || whichdir==-3){ if((boundstage==STAGEM1)||(boundstage==STAGE0)){ for(dir=dirstart;dir<=dirfinish;dir++){ if(dirgenset[boundvartype][dir][DIRIF]){ recvonly_int(dir,boundvartype,workbc_int,requests); didpostrecvs[dir]=1; } } } } else if(whichdir==1 || whichdir==2 || whichdir==3){ ////////////////// // // per-whichdir (1,2,3) conditionals for bounding. Assume whichdir=1 done first, then 2, then 3, so that corners are done correctly as done with normal bounds. // ////////////////// /////////////////// // // x or y or z -dir // once dir=0,1(X1UP,X1DN) is done, so can start 2,3(X2UP,X2DN) // ///////////////// if((boundstage==STAGEM1)||(boundstage==STAGE0&&whichdir==1 || boundstage==STAGE2&&whichdir==2 || boundstage==STAGE4&&whichdir==3)){ for(dir=dirstart;dir<=dirfinish;dir++){ if(dirgenset[boundvartype][dir][DIRIF]){ if(didpostrecvs[dir]==0){ dualfprintf(fail_file,"Did not post recv and tried to already pack: dir=%d\n",dir); myexit(234525155); } pack_int(dir,boundvartype,prim,workbc_int); } } for(dir=dirstart;dir<=dirfinish;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendonly_int(dir,boundvartype,workbc_int,requests); } if((boundstage==STAGEM1)||(boundstage==STAGE1&&whichdir==1 || boundstage==STAGE3&&whichdir==2 || boundstage==STAGE5&&whichdir==3)){ for(dir=dirstart;dir<=dirfinish;dir++) if(dirgenset[boundvartype][dir][DIRIF]){ recvwait(dir,requests); didpostrecvs[dir]=0; // done with recv's } for(dir=dirstart;dir<=dirfinish;dir++) if(dirgenset[boundvartype][dir][DIRIF]) unpack_int(dir,boundvartype,workbc_int,prim); for(dir=dirstart;dir<=dirfinish;dir++) if(dirgenset[boundvartype][dir][DIRIF]) sendwait(dir,requests); } } else{ dualfprintf(fail_file,"No such whichdir=%d in boundmpiint.c\n",whichdir); myexit(1986290387); } // now corner zones will be filled correctly // GODMARK: If made fixup_utoprim() and check_solution() not use corner zones could bound all directions at once -- probably not important performance hit return(0); }
static int sendbyte(int sock, unsigned char byte) { unsigned char buffer[1]; buffer[0] = byte; return sendwait(sock, buffer, 1); }