rc_t init_out_redir( out_redir * self, out_redir_mode_t mode, const char * filename, size_t bufsize ) { rc_t rc; KFile *output_file; if ( filename != NULL ) { KDirectory *dir; rc = KDirectoryNativeDir( &dir ); if ( rc != 0 ) LOGERR( klogInt, rc, "KDirectoryNativeDir() failed" ); else { rc = KDirectoryCreateFile ( dir, &output_file, false, 0664, kcmInit, "%s", filename ); KDirectoryRelease( dir ); } } else rc = KFileMakeStdOut ( &output_file ); if ( rc == 0 ) { KFile *temp_file; /* wrap the output-file in compression, if requested */ switch ( mode ) { case orm_gzip : rc = KFileMakeGzipForWrite( &temp_file, output_file ); break; case orm_bzip2 : rc = KFileMakeBzip2ForWrite( &temp_file, output_file ); break; case orm_uncompressed : break; } if ( rc == 0 ) { if ( mode != orm_uncompressed ) { KFileRelease( output_file ); output_file = temp_file; } /* wrap the output/compressed-file in buffering, if requested */ if ( bufsize != 0 ) { rc = KBufFileMakeWrite( &temp_file, output_file, false, bufsize ); if ( rc == 0 ) { KFileRelease( output_file ); output_file = temp_file; } } if ( rc == 0 ) { self->kfile = output_file; self->org_writer = KOutWriterGet(); self->org_data = KOutDataGet(); self->pos = 0; rc = KOutHandlerSet( out_redir_callback, self ); if ( rc != 0 ) LOGERR( klogInt, rc, "KOutHandlerSet() failed" ); } } } return rc; }
static rc_t FileToFile (const KDirectory * sd, const char * source, KDirectory *dd, const char * dest_, bool try_rename, char * base) { const KFile * infile; rc_t rc; uint32_t access; KTime_t date; bool is_tmp; char dest [MY_MAX_PATH + sizeof EncExt]; strcpy (dest, dest_); if (try_rename) NameFixUp (dest); if ((sd == dd) && (strcmp (source, dest) == 0)) return FileInPlace (dd, dest, try_rename); if (base == NULL) STSMSG (1, ("%scrypting file %s to %s", De, source, dest)); else STSMSG (1, ("%scrypting file %s to %s/%s", De, source, base, dest)); /* * A Hack to make stdin/stout work within KFS */ if (UseStdin) { const KFile * iinfile; rc = KFileMakeStdIn (&iinfile); if (rc == 0) { rc = KBufReadFileMakeRead (&infile, iinfile, 64 * 1024); KFileRelease (iinfile); if (rc == 0) { access = 0640; date = 0; goto stdin_shortcut; } LOGERR (klogErr, rc, "error wrapping stdin"); return rc; } } rc = 0; is_tmp = IsTmpFile (source); if (is_tmp) { TmpFoundFlag = true; if (ForceFlag) ; /* LOG OVERWRITE */ else ; /* LOG TMP */ } if (!is_tmp || ForceFlag) { rc = KDirectoryAccess (sd, &access, "%s", source); if (rc) LOGERR (klogErr, rc, "Error check permission of source"); else { rc = KDirectoryDate (sd, &date, "%s", source); if (rc) LOGERR (klogErr, rc, "Error check date of source"); else { rc = KDirectoryOpenFileRead (sd, &infile, "%s", source); if (rc) PLOGERR (klogErr, (klogErr, rc, "Error opening source file '$(S)'", "S=%s", source)); else { EncScheme scheme; stdin_shortcut: rc = EncryptionTypeCheck (infile, source, &scheme); if (rc == 0) { KFile * outfile; uint32_t kcm; /* * Hack to support stdout before VFS is complete enough to use here */ if (UseStdout) { rc = KFileMakeStdOut (&outfile); if (rc) LOGERR (klogErr, rc, "error wrapping stdout"); } else { kcm = ForceFlag ? kcmInit|kcmParents : kcmCreate|kcmParents; rc = KDirectoryCreateFile (dd, &outfile, false, 0600, kcm, "%s", dest); if (rc) PLOGERR (klogErr,(klogErr, rc, "error opening output '$(O)'", "O=%s", dest)); } if (rc == 0) { const KFile * Infile; KFile * Outfile; rc = CryptFile (infile, &Infile, outfile, &Outfile, scheme); if (rc == 0) { rc = CopyFile (Infile, Outfile, source, dest); if (rc == 0) { if (UseStdin || UseStdout) ; else { rc = KDirectorySetAccess (dd, false, access, 0777, "%s", dest); if (rc == 0 && date != 0) rc = KDirectorySetDate (dd, false, date, "%s", dest); } } KFileRelease (Infile); KFileRelease (Outfile); } KFileRelease (outfile); } } KFileRelease (infile); } } } } return rc; }
static rc_t WorkerThreadFn ( const KThread *self, void *data ) { KStream* stream = (KStream*)data; char buf[256]; size_t num; rc_t rc = KStreamReadAll(stream, buf, 1, &num); if (rc == 0) { if (num == 1) { size_t toRead = (unsigned char)buf[0]; pLogMsg(klogInfo, "KeyringServer: worker received length=$(l)\n", "l=%d", toRead); rc = KStreamReadAll(stream, buf, toRead, &num); if (rc == 0) { /*pLogMsg(klogInfo, "KeyringServer: worker received msg='$(buf)'\n", "buf=%.*s", num, buf);*/ switch (buf[0]) { case 'I': if (buf[0] == 'I') /* init */ { LogMsg ( klogInfo, "KeyringServer: received Init"); if (keyring == 0) { const KFile* std_in; rc = KFileMakeStdIn ( &std_in ); if (rc == 0) { KFile* std_out; rc = KFileMakeStdOut ( &std_out ); if (rc == 0) { rc = KeyRingOpen(&keyring, keyRingFileName, std_in, std_out); if (rc == 0) { LogMsg ( klogInfo, "KeyringServer: Init successful"); pLogMsg(klogInfo, "KeyringServer: sending '$(buf)'\n", "buf=%.*s", string_size(initMsgSuccess), initMsgSuccess); rc = KStreamWrite(stream, initMsgSuccess, string_size(initMsgSuccess), NULL); } else { rc_t rc2; LogErr(klogErr, rc, "KeyringServer: Init failed"); rc2 = KStreamWrite(stream, initMsgFailure, string_size(initMsgFailure), NULL); if (rc == 0) rc = rc2; } KFileRelease(std_out); } KFileRelease(std_in); } } else { /* already running */ LogMsg ( klogInfo, "KeyringServer: Init successful"); rc = KStreamWrite(stream, initMsgSuccess, string_size(initMsgSuccess), NULL); } } break; case 'X': if (buf[0] == 'X') /* shutDown */ { LogMsg ( klogInfo, "KeyringServer: received Shutdown"); shutDown = true; } break; case 'P': /* project */ if (toRead > 1 && buf[1] == 'A') /* Add */ { String pkey; String dlkey; String enckey; size_t idx = 2; /*TODO: make sure idx is in range*/ StringInit(&pkey, buf + idx + 1, buf[idx], buf[idx]); pkey.len = string_len(pkey.addr, pkey.size); idx += pkey.size + 1; /*TODO: make sure idx is in range*/ StringInit(&dlkey, buf + idx + 1, buf[idx], buf[idx]); dlkey.len = string_len(dlkey.addr, dlkey.size); idx += dlkey.size + 1; /*TODO: make sure idx is in range*/ StringInit(&enckey, buf + idx + 1, buf[idx], buf[idx]); enckey.len = string_len(enckey.addr, enckey.size); pLogMsg(klogInfo, "KeyringServer: received Project Add(pkey='$(pkey)',dlkey='$(dlkey)',enckey='$(.....)')'\n", "pkey=%.*s,dlkey=%.*s,enckey=%.*s", pkey.len, pkey.addr, dlkey.len, dlkey.addr, enckey.len, enckey.addr); rc = KeyRingAddProject(keyring, &pkey, &dlkey, &enckey); if (rc != 0) LogErr(klogErr, rc, "KeyringServer: KeyRingAddProject() failed"); } break; default: LogMsg ( klogInfo, "KeyringServer: unrecognised message received"); break; } } else LogErr(klogErr, rc, "KeyringServer: KStreamRead(body) failed"); } else /* end of stream = the client closed the connection */ LogMsg(klogInfo, "KeyringServer: worker received EOF\n"); } else LogErr(klogErr, rc, "KeyringServer: KStreamRead(length) failed"); LogMsg ( klogInfo, "KeyringServer: worker done"); return KThreadRelease(self); }