예제 #1
0
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;
}
예제 #2
0
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;
}
예제 #3
0
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);
}