static void HandleRPCFailure(long cid, long rcode, long op) { ConnVector[cid].Status = BROKEN; if (rcode == RPC2_CONNBUSY) { connbusies++; return; } if (op == 7 && rcode == RPC2_NAKED) { lostunbinds++; assert(RPC2_Unbind(ConnVector[cid].ConnHandle) == RPC2_SUCCESS); FLUSH(); return; } printf ("\n%s: call %ld on %#x to %s for %s failed (%s) at %s", MYNAME, op, ConnVector[cid].ConnHandle, ConnVector[cid].RemoteHost.Value.Name, ConnVector[cid].NameBuf, RPC2_ErrorMsg(rcode), TimeNow()); DumpAndQuit(op); }
static void InitRPC(void) { SFTP_Initializer sftpi; char *cstring; int rc; LWP_Init(LWP_VERSION, LWP_NORMAL_PRIORITY, &ParentPid); PortId.Tag = RPC2_PORTBYINETNUMBER; PortId.Value.InetPortNumber = htons(TESTPORT); SFTP_SetDefaults(&sftpi); SFTP_Activate(&sftpi); rc = RPC2_Init(RPC2_VERSION, 0, &PortId, -1, NULL); if (rc != RPC2_SUCCESS) { printf("RPC2_Init() --> %s\n", RPC2_ErrorMsg(rc)); exit(-1); } if (RPC2_Trace && (RPC2_InitTraceBuffer(TBSIZE) != RPC2_SUCCESS)) exit(-1); SubsysId.Tag = RPC2_SUBSYSBYID; SubsysId.Value.SubsysId = SUBSYS_SRV; RPC2_Export(&SubsysId); cstring = "Listener1"; LWP_CreateProcess(ListenerBody, 16384, LWP_NORMAL_PRIORITY, NULL, cstring, &ListenerPid); }
char *U_Error(const int rc) { if(rc < 0) return((char *)RPC2_ErrorMsg(rc)); else return((char *)U_AuthErrorMsg(rc)); }
static void BulkErr(RPC2_Handle cid, SE_Descriptor *sed, int retcode, int op) { char *x; printf ("\n%s: File transfer failed conn: %#x code: %s op: %d time: %s\n", MYNAME, cid, RPC2_ErrorMsg(retcode), op, TimeNow()); if (sed->Value.SmartFTPD.TransmissionDirection == CLIENTTOSERVER) x = "CLIENTTOSERVER"; else x = "SERVERTOCLIENT"; printf("\t\tFile: %s Direction: %s\n", sed->Value.SmartFTPD.FileInfo.ByName.LocalFileName, x); DumpAndQuit(op); }
char *ViceErrorMsg(int errorCode) { if(errorCode < 0) return(RPC2_ErrorMsg((long)errorCode)); switch(errorCode) { case 0: return("Success"); case VSALVAGE: return("Volume needs to be salvaged"); case VNOVNODE: return("Bad vnode number"); case VNOVOL: return("Volume not online"); case VVOLEXISTS: return("Volume already exists"); case VNOSERVICE: return("Volume is not in service"); case VOFFLINE: return("Volume offline"); case VONLINE: return("Volume is already online"); case EINCONS: return("Inconsistent Object"); } return strerror(errorCode); }
int main(int argc, char *argv[]) { RPC2_Handle cid; long subsys = 1001; long rc; char *host; short port; if (argc == 1) goto badargs; if (strcmp(argv[1], "-p") == 0) { if (argc < 4) goto badargs; host = argv[3]; port = atoi(argv[2]); } else { struct servent *s = coda_getservbyname("codasrv", "udp"); host = argv[1]; port = ntohs(s->s_port); subsys = 1001; /* SUBSYS_SRV */ } Initialize(); rc = Bind(host, port, subsys, &cid); RPC2_Unbind(cid); if (rc != RPC2_SUCCESS) { printf("RPC2 connection to %s:%d failed with %s.\n", host, port, RPC2_ErrorMsg(rc)); exit(EXIT_FAILURE); } printf("RPC2 connection to %s:%d successful.\n", host, port); exit(EXIT_SUCCESS); badargs: printf("Usage %s [-p port] hostname\n", argv[0]); exit(EXIT_FAILURE); }
static void DoBindings(void) { int i, rc; RPC2_BindParms bp; for (i = 0; i < CVCount; i++) { bp.SecurityLevel = ConnVector[i].SecurityLevel; bp.EncryptionType = RPC2_XOR; bp.SideEffectType = SMARTFTP; bp.ClientIdent = &ConnVector[i].Identity; bp.SharedSecret = &ConnVector[i].Password; rc = RPC2_NewBinding(&ConnVector[i].RemoteHost, &PortId, &SubsysId, &bp,&ConnVector[i].ConnHandle); if (rc < RPC2_ELIMIT) { printf("Couldn't bind to %s for %s ---> %s\n", ConnVector[i].RemoteHost.Value.Name, ConnVector[i].Identity.SeqBody, RPC2_ErrorMsg(rc)); ConnVector[i].Status = BROKEN; continue; } } }
int main(int argc, char **argv) { char *p; int insist; int flags; int c, pwlen; char oldpw[128], newpw[128]; int ok, rc; char *username = NULL; const char *realm = NULL; char *host = NULL; struct RPC2_addrinfo *srvs; if (argc > 1) { if (strcmp(argv[1], "-h") == 0) { if (argc < 3) { printf("Usage: %s [-h SCM-host-name] [coda-user-name][@realm]\n", argv[0]); exit(1); } host = argv[2]; argv += 2; argc -= 2; } } insist = 0; if (argc >= 2) { username = argv[1]; SplitRealmFromName(username, &realm); } if (!username || *username == '\0') { #ifdef __CYGWIN32__ username = getlogin(); #else struct passwd *pw = getpwuid(geteuid()); if (pw) { username=pw->pw_name; } #endif } codaconf_init("venus.conf"); codaconf_init("auth2.conf"); CODACONF_STR(realm, "realm", NULL); if (!username || !realm) { fprintf (stderr, "Can't figure out your username or realm.\n"); fprintf (stderr, "Try \"cpasswd user[@realm]\"\n"); exit (1); } /* Make sure our arrays don't overflow. */ if (strlen(username) > 20) { fprintf(stderr, "User name is invalid.\n"); exit(1); } printf("Changing password for %s@%s\n", username, realm); /* if (U_InitRPC() != 0) { fprintf(stderr, "Internal error: RPC or vstab problems.\n"); exit(1); } */ U_InitRPC(); strncpy(oldpw, getpass("Old password: "******"New password: "******"Password unchanged.\n"); exit(1); } /* * Insure password is of reasonable length and * composition. If we really wanted to make things * sticky, we could check the dictionary for common * words, but then things would really be slow. */ ok = 0; flags = 0; p = newpw; while (( c = *p++) ) { if (c >= 'a' && c <= 'z') flags |= 2; else if (c >= 'A' && c <= 'Z') flags |= 4; else if (c >= '0' && c <= '9') flags |= 1; else flags |= 8; } if (flags >= 7 && pwlen >= 4) ok = 1; if ((flags == 2 || flags == 4) && pwlen >= 6) ok = 1; if ((flags == 3 || flags == 5 || flags == 6) && pwlen >= 5) ok = 1; if (!ok && insist < 2) { printf("Please use %s.\n", flags == 1 ? "at least one non-numeric character" : "a longer password"); insist++; goto tryagain; } if (strcmp(newpw, getpass("Retype new password: "******"Mismatch - password unchanged.\n"); exit(1); } srvs = U_GetAuthServers(realm, host); rc = U_ChangePassword (srvs, username, newpw, AUTH_METHOD_CODAUSERNAME, username, strlen(username)+1, oldpw, strlen(oldpw)+1); RPC2_freeaddrinfo(srvs); switch(rc) { case RPC2_DEAD: printf("Server to change passwords down, try again later\n"); break; case AUTH_DENIED: printf("authentication failed, unable to change passwd for %s\n", username); break; case AUTH_SUCCESS: printf("Password changed\n"); break; case AUTH_BADKEY: printf("Bad new password. Try again\n"); break; case AUTH_READONLY: printf("Auth server is read-only\n"); break; case AUTH_FAILED: printf("Auth failed\n"); break; case RPC2_NOTAUTHENTICATED: printf("bind failed; user unauthenticated\n"); break; default: printf("Authentication Failed: %s\n", RPC2_ErrorMsg(rc)); } fflush(stdout); exit(0); }
static void WorkerBody(void *arg) { long i, rc; RPC2_RequestFilter reqfilter; RPC2_PacketBuffer *InBuff, *OutBuff; RPC2_Handle workercid; char myprivatefile[256]; char myhashmark; SE_Descriptor sed; memset(&sed, 0, sizeof(SE_Descriptor)); sed.Tag = SMARTFTP; strcpy(myprivatefile, MakeName(LWP_Name())); myhashmark = NextHashMark++; LWP_DispatchProcess(); /* initial courtesy to parent */ reqfilter.FromWhom = ONESUBSYS; reqfilter.ConnOrSubsys.SubsysId = SUBSYS_SRV; assert(reqfilter.ConnOrSubsys.SubsysId != -1); reqfilter.OldOrNew = OLD; RPC2_AllocBuffer(1000, &OutBuff); InBuff = NULL; while (1) { RanDelay(MaxComputeTime); if (InBuff != NULL) RPC2_FreeBuffer(&InBuff); i = RPC2_GetRequest(&reqfilter, &workercid, &InBuff, NULL, NULL, 0, NULL); if (i != RPC2_SUCCESS) { printf("\n%s: GetRequest failed (%s) at %s", MYNAME, RPC2_ErrorMsg(i), TimeNow()); DumpAndQuit(0); } switch(InBuff->Header.Opcode) { case 1: /* return Unix epoch time */ { strcpy((char *)OutBuff->Body, TimeNow()); OutBuff->Header.ReturnCode = RPC2_SUCCESS; OutBuff->Header.BodyLength = sizeof(struct RPC2_PacketHeader) + strlen((char *)OutBuff->Body) + 1; break; } case 2: /* square the input integer */ { uint32_t *ip = (uint32_t *)InBuff->Body; uint32_t *op = (uint32_t *)OutBuff->Body; uint32_t x = ntohl(*ip); *op = htonl(x * x); OutBuff->Header.ReturnCode = RPC2_SUCCESS; OutBuff->Header.BodyLength = sizeof(RPC2_Integer); break; } case 3: /* cube the input integer */ { uint32_t *ip = (uint32_t *)InBuff->Body; uint32_t *op = (uint32_t *)OutBuff->Body; uint32_t x = ntohl(*ip); *op = htonl(x*x*x); OutBuff->Header.ReturnCode = RPC2_SUCCESS; OutBuff->Header.BodyLength = sizeof(RPC2_Integer); break; } case 4: /* Return your machine name */ { gethostname((char *)OutBuff->Body, 100); OutBuff->Header.ReturnCode = RPC2_SUCCESS; OutBuff->Header.BodyLength = strlen((char *)OutBuff->Body) + 1; break; } case 5: /* Fetch a random file */ { uint32_t randval; if (VerboseFlag) sed.Value.SmartFTPD.hashmark = myhashmark; else sed.Value.SmartFTPD.hashmark = 0; randval = (uint32_t)random(); strcpy(sed.Value.SmartFTPD.FileInfo.ByName.LocalFileName, SysFiles[randval % SysFileCount]); sed.Value.SmartFTPD.TransmissionDirection = SERVERTOCLIENT; sed.Value.SmartFTPD.SeekOffset = 0; sed.Value.SmartFTPD.Tag = FILEBYNAME; if ((rc = RPC2_InitSideEffect(workercid, &sed)) != RPC2_SUCCESS) { BulkErr(workercid, &sed, rc, InBuff->Header.Opcode); assert(RPC2_Unbind(workercid) == RPC2_SUCCESS); continue; } if ((rc = RPC2_CheckSideEffect(workercid, &sed, SE_AWAITLOCALSTATUS)) != RPC2_SUCCESS) { BulkErr(workercid, &sed, rc, InBuff->Header.Opcode); assert(RPC2_Unbind(workercid) == RPC2_SUCCESS); continue; } else if (VerboseFlag) fprintf(stderr, "%ld bytes transferred\n", sed.Value.SmartFTPD.BytesTransferred); OutBuff->Header.ReturnCode = (long)sed.LocalStatus; OutBuff->Header.BodyLength = 0; break; } case 6: /* Store a random file */ { if (VerboseFlag) sed.Value.SmartFTPD.hashmark = myhashmark; else sed.Value.SmartFTPD.hashmark = 0; strcpy(sed.Value.SmartFTPD.FileInfo.ByName.LocalFileName, myprivatefile); sed.Value.SmartFTPD.FileInfo.ByName.ProtectionBits = 0644; sed.Value.SmartFTPD.TransmissionDirection = CLIENTTOSERVER; sed.Value.SmartFTPD.SeekOffset = 0; sed.Value.SmartFTPD.Tag = FILEBYNAME; if ((rc = RPC2_InitSideEffect(workercid, &sed)) != RPC2_SUCCESS) { BulkErr(workercid, &sed, rc, InBuff->Header.Opcode); } if ((rc = RPC2_CheckSideEffect(workercid, &sed, SE_AWAITLOCALSTATUS)) != RPC2_SUCCESS) { BulkErr(workercid, &sed, rc, InBuff->Header.Opcode); } else if (VerboseFlag) fprintf(stderr, "%ld bytes transferred\n", sed.Value.SmartFTPD.BytesTransferred); OutBuff->Header.ReturnCode = (long)sed.LocalStatus; OutBuff->Header.BodyLength = 0; break; } case 7: /* Unbind */ { OutBuff->Header.ReturnCode = RPC2_SUCCESS; OutBuff->Header.BodyLength = 0; break; } case 999: /* Quit */ { OutBuff->Header.ReturnCode = RPC2_SUCCESS; OutBuff->Header.BodyLength = 0; break; } default: /* unknown opcode */ OutBuff->Header.ReturnCode = RPC2_FAIL; OutBuff->Header.BodyLength = 1 + strlen("Get your act together"); strcpy((char *)OutBuff->Body, "Get your act together"); break; } i = RPC2_SendResponse(workercid, OutBuff); if (i != RPC2_SUCCESS) { printf ("\n%s: response for opcode %d on connection %#x failed (%s) at %s", MYNAME, InBuff->Header.Opcode, workercid, RPC2_ErrorMsg(i), TimeNow()); DumpAndQuit(InBuff->Header.Opcode); } if (InBuff->Header.Opcode == 7) assert(RPC2_Unbind(workercid) == RPC2_SUCCESS); } }