Пример #1
0
static rc_t init_ictx( struct ictx * ictx, const dump_context * ctx, const Args * args )
{
    rc_t rc = KFileMakeStdIn ( &( ictx->std_in ) );
    DISP_RC( rc, "KFileMakeStdIn() failed" );
    if ( rc == 0 )
    {
        ictx->ctx = ctx;
        ictx->args = args;
        VectorInit( &ictx->history, 0, 10 );
        ictx->interactive = ( KFileType ( ictx->std_in ) == kfdCharDev );
        ictx->done = false;
        
        CONST_STRING( &(ictx->PROMPT), "\nvdb $" );
        StringInit( &(ictx->SInputLine), &( ictx->inputline[0] ), sizeof( ictx->inputline ), 0 );
        
        rc = vdp_init_ctx( &ictx->vsctx, args );
    }
    return rc;
}
Пример #2
0
static
rc_t privReadStdinLine(char* buf, size_t bsize, bool destroy)
{
    rc_t rc = 0;
    static const KFile* std_in = NULL;
    static uint64_t pos = 0;
    size_t num_read = 0;
    if (destroy) {
        RELEASE(KFile, std_in);
        pos = 0;
        return rc;
    }
    if (std_in == NULL) {
        rc = KFileMakeStdIn(&std_in);
        if (rc != 0) {
            DISP_RC(rc, "KFileMakeStdIn");
            return rc;
        }
    }
    rc = KFileRead(std_in, pos, buf, bsize, &num_read);
    DISP_RC(rc, "KFileRead");
    pos += num_read;
    if (num_read) {
        bool done = false;
        buf[num_read] = '\0';
        while (num_read > 0 && !done) {
            switch (buf[num_read - 1]) {
                case '\n':
                case '\r':
                    buf[--num_read] = '\0';
                    break;
                default:
                    done = true;
                    break;
            }
        }
    }
    return rc;
}
Пример #3
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;
}
Пример #4
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);
}
Пример #5
0
static
rc_t run ()
{
    const KFile * in;
    rc_t rc = 0;

    do {
        uint64_t in_pos = 0;
        size_t num_read;
        char buffer [8 * 1024];

        rc = KFileMakeStdIn (&in);
        if (rc) break;

        for ( ;; )
        {
            VPath * path;

            rc = KOutMsg ("Enter a system specific path: ");
            if (rc) break;

            memset (buffer, 0, sizeof buffer);

            rc = KFileRead (in, in_pos, buffer, sizeof buffer, &num_read);

            if (rc)
            {
                LOGERR (klogFatal, rc, "error with KFileRead");
                break;
            }

            if (num_read == 0) break;

            in_pos += num_read;
            
            if (buffer[num_read-1] == '\n')
                buffer[num_read-1] = '\0';
            if (buffer[num_read-2] == '\r')
                buffer[num_read-2] = '\0';

            rc = VPathMakeSysPath (&path, buffer);
            if (rc)
            {
                LOGERR (klogErr, rc, "error with MakeSysPath");
                break;
            }

            memset (buffer, 0, sizeof buffer);

            rc = VPathReadPath (path, buffer, sizeof buffer, &num_read);
            if (rc)
            {
                LOGERR (klogErr, rc, "error wth ReadPath");
                break;
            }

            rc = KOutMsg ("VPath path is '%s' size '%zu'\n\n", buffer, num_read);
            if (rc)
            {
                LOGERR (klogErr, rc, "error with KOuMsg");
                break;
            }
        }
    } while (0);
    return rc;
}