Exemplo n.º 1
0
void static_view_init(void)
{
	bluenotes_init();
	explode_init();
	greynotes_init();
	lines_init();
	rows_init();
	scoreboard_init();
	targets_init();
	register_event("set view", set_main_view);
	view_focus = 0.0;
}
Exemplo n.º 2
0
static int unz(const uint8_t *src, uint32_t csize, uint32_t usize, uint16_t method, uint16_t flags, unsigned int *fu, cli_ctx *ctx, char *tmpd, zip_cb zcb) {
    char name[1024], obuf[BUFSIZ];
    char *tempfile = name;
    int of, ret=CL_CLEAN;
    unsigned int res=1, written=0;

    if(tmpd) {
        snprintf(name, sizeof(name), "%s"PATHSEP"zip.%03u", tmpd, *fu);
        name[sizeof(name)-1]='\0';
    } else {
        if(!(tempfile = cli_gentemp(ctx->engine->tmpdir))) return CL_EMEM;
    }
    if((of = open(tempfile, O_RDWR|O_CREAT|O_TRUNC|O_BINARY, S_IRUSR|S_IWUSR))==-1) {
        cli_warnmsg("cli_unzip: failed to create temporary file %s\n", tempfile);
        if(!tmpd) free(tempfile);
        return CL_ECREAT;
    }
    switch (method) {
    case ALG_STORED:
        if(csize<usize) {
            unsigned int fake = *fu + 1;
            cli_dbgmsg("cli_unzip: attempting to inflate stored file with inconsistent size\n");
            if ((ret=unz(src, csize, usize, ALG_DEFLATE, 0, &fake, ctx, tmpd, zcb))==CL_CLEAN) {
                (*fu)++;
                res=fake-(*fu);
            }
            else break;
        }
        if(res==1) {
            if(ctx->engine->maxfilesize && csize > ctx->engine->maxfilesize) {
                cli_dbgmsg("cli_unzip: trimming output size to maxfilesize (%lu)\n", (long unsigned int) ctx->engine->maxfilesize);
                csize = ctx->engine->maxfilesize;
            }
            if(cli_writen(of, src, csize)!=(int)csize) ret = CL_EWRITE;
            else res=0;
        }
        break;

    case ALG_DEFLATE:
    case ALG_DEFLATE64: {
        union {
            z_stream64 strm64;
            z_stream strm;
        } strm;
        typedef int (*unz_init_) (void *, int);
        typedef int (*unz_unz_) (void *, int);
        typedef int (*unz_end_) (void *);
        unz_init_ unz_init;
        unz_unz_ unz_unz;
        unz_end_ unz_end;
        int wbits;
        void **next_in;
        void **next_out;
        unsigned int *avail_in;
        unsigned int *avail_out;

        if(method == ALG_DEFLATE64) {
            unz_init = (unz_init_)inflate64Init2;
            unz_unz = (unz_unz_)inflate64;
            unz_end = (unz_end_)inflate64End;
            next_in = (void *)&strm.strm64.next_in;
            next_out = (void *)&strm.strm64.next_out;
            avail_in = &strm.strm64.avail_in;
            avail_out = &strm.strm64.avail_out;
            wbits=MAX_WBITS64;
        } else {
            unz_init = (unz_init_)wrap_inflateinit2;
            unz_unz = (unz_unz_)inflate;
            unz_end = (unz_end_)inflateEnd;
            next_in = (void *)&strm.strm.next_in;
            next_out = (void *)&strm.strm.next_out;
            avail_in = &strm.strm.avail_in;
            avail_out = &strm.strm.avail_out;
            wbits=MAX_WBITS;
        }

        memset(&strm, 0, sizeof(strm));

        *next_in = (void*) src;
        *next_out = obuf;
        *avail_in = csize;
        *avail_out = sizeof(obuf);
        if (unz_init(&strm, -wbits)!=Z_OK) {
            cli_dbgmsg("cli_unzip: zinit failed\n");
            break;
        }
        while(1) {
            while((res = unz_unz(&strm, Z_NO_FLUSH))==Z_OK) {};
            if(*avail_out!=sizeof(obuf)) {
                written+=sizeof(obuf)-(*avail_out);
                if(ctx->engine->maxfilesize && written > ctx->engine->maxfilesize) {
                    cli_dbgmsg("cli_unzip: trimming output size to maxfilesize (%lu)\n", (long unsigned int) ctx->engine->maxfilesize);
                    res = Z_STREAM_END;
                    break;
                }
                if(cli_writen(of, obuf, sizeof(obuf)-(*avail_out)) != (int)(sizeof(obuf)-(*avail_out))) {
                    cli_warnmsg("cli_unzip: falied to write %lu inflated bytes\n", (unsigned long int)sizeof(obuf)-(*avail_out));
                    ret = CL_EWRITE;
                    res = 100;
                    break;
                }
                *next_out = obuf;
                *avail_out = sizeof(obuf);
                continue;
            }
            break;
        }
        unz_end(&strm);
        if (res == Z_STREAM_END) res=0;
        break;
    }


#if HAVE_BZLIB_H
#ifdef NOBZ2PREFIX
#define BZ2_bzDecompress bzDecompress
#define BZ2_bzDecompressEnd bzDecompressEnd
#define BZ2_bzDecompressInit bzDecompressInit
#endif

    case ALG_BZIP2: {
        bz_stream strm;
        memset(&strm, 0, sizeof(strm));
        strm.next_in = (char *)src;
        strm.next_out = obuf;
        strm.avail_in = csize;
        strm.avail_out = sizeof(obuf);
        if (BZ2_bzDecompressInit(&strm, 0, 0)!=BZ_OK) {
            cli_dbgmsg("cli_unzip: bzinit failed\n");
            break;
        }
        while((res = BZ2_bzDecompress(&strm))==BZ_OK || res==BZ_STREAM_END) {
            if(strm.avail_out!=sizeof(obuf)) {
                written+=sizeof(obuf)-strm.avail_out;
                if(ctx->engine->maxfilesize && written > ctx->engine->maxfilesize) {
                    cli_dbgmsg("cli_unzip: trimming output size to maxfilesize (%lu)\n", (unsigned long int) ctx->engine->maxfilesize);
                    res = BZ_STREAM_END;
                    break;
                }
                if(cli_writen(of, obuf, sizeof(obuf)-strm.avail_out) != (int)(sizeof(obuf)-strm.avail_out)) {
                    cli_warnmsg("cli_unzip: falied to write %lu bunzipped bytes\n", (long unsigned int)sizeof(obuf)-strm.avail_out);
                    ret = CL_EWRITE;
                    res = 100;
                    break;
                }
                strm.next_out = obuf;
                strm.avail_out = sizeof(obuf);
                if (res == BZ_OK) continue; /* after returning BZ_STREAM_END once, decompress returns an error */
            }
            break;
        }
        BZ2_bzDecompressEnd(&strm);
        if (res == BZ_STREAM_END) res=0;
        break;
    }
#endif /* HAVE_BZLIB_H */


    case ALG_IMPLODE: {
        struct xplstate strm;
        strm.next_in = (void*)src;
        strm.next_out = (uint8_t *)obuf;
        strm.avail_in = csize;
        strm.avail_out = sizeof(obuf);
        if (explode_init(&strm, flags)!=EXPLODE_OK) {
            cli_dbgmsg("cli_unzip: explode_init() failed\n");
            break;
        }
        while((res = explode(&strm))==EXPLODE_OK) {
            if(strm.avail_out!=sizeof(obuf)) {
                written+=sizeof(obuf)-strm.avail_out;
                if(ctx->engine->maxfilesize && written > ctx->engine->maxfilesize) {
                    cli_dbgmsg("cli_unzip: trimming output size to maxfilesize (%lu)\n", (unsigned long int) ctx->engine->maxfilesize);
                    res = 0;
                    break;
                }
                if(cli_writen(of, obuf, sizeof(obuf)-strm.avail_out) != (int)(sizeof(obuf)-strm.avail_out)) {
                    cli_warnmsg("cli_unzip: falied to write %lu exploded bytes\n", (unsigned long int) sizeof(obuf)-strm.avail_out);
                    ret = CL_EWRITE;
                    res = 100;
                    break;
                }
                strm.next_out = (uint8_t *)obuf;
                strm.avail_out = sizeof(obuf);
                continue;
            }
            break;
        }
        break;
    }


    case ALG_LZMA:
        /* easy but there's not a single sample in the zoo */

#if !HAVE_BZLIB_H
    case ALG_BZIP2:
#endif
    case ALG_SHRUNK:
    case ALG_REDUCE1:
    case ALG_REDUCE2:
    case ALG_REDUCE3:
    case ALG_REDUCE4:
    case ALG_TOKENZD:
    case ALG_OLDTERSE:
    case ALG_RSVD1:
    case ALG_RSVD2:
    case ALG_RSVD3:
    case ALG_RSVD4:
    case ALG_RSVD5:
    case ALG_NEWTERSE:
    case ALG_LZ77:
    case ALG_WAVPACK:
    case ALG_PPMD:
        cli_dbgmsg("cli_unzip: unsupported method (%d)\n", method);
        break;
    default:
        cli_dbgmsg("cli_unzip: unknown method (%d)\n", method);
        break;
    }

    if(!res) {
        (*fu)++;
        cli_dbgmsg("cli_unzip: extracted to %s\n", tempfile);
        if (lseek(of, 0, SEEK_SET) == -1) {
            cli_dbgmsg("cli_unzip: call to lseek() failed\n");
            if (!(tmpd))
                free(tempfile);
            close(of);
            return CL_ESEEK;
        }
        ret = zcb(of, ctx);
        close(of);
        if(!ctx->engine->keeptmp)
            if(cli_unlink(tempfile)) ret = CL_EUNLINK;
        if(!tmpd) free(tempfile);
        return ret;
    }

    close(of);
    if(!ctx->engine->keeptmp)
        if(cli_unlink(tempfile)) ret = CL_EUNLINK;
    if(!tmpd) free(tempfile);
    cli_dbgmsg("cli_unzip: extraction failed\n");
    return ret;
}