binary.cpp

来自「包含客户和服务器的升级程序,在linux下可以运行的.」· C++ 代码 · 共 200 行

CPP
200
字号
/* * Copyright (C) 2006, Binary Ma * Licence: GNU GPL 1991 - version 2 * Bug report: binary@eniak.org*/#include "binary.h"#include <unistd.h>#include <stdio.h>#include <stdlib.h>#include <sys/stat.h>#include <fcntl.h>#include <signal.h>#include <errno.h>void error( const char* FILE, const char* FUNCTION, int LINE ){    fprintf( stderr, "%s->%s( %i ): %s\n", FILE, FUNCTION, LINE, strerror( errno ) );}int todaemon(){    pid_t pid;    pid = fork();    if( pid < 0 )        return -1;    if( pid > 0 )        _exit( pid );	    if( -1 == setsid() )        exit( -1 );	    int fd = open( "/dev/null", O_RDWR );    if( -1 != fd )    {        for( int i = 0; i < 3; i++ )        {            close( i );            dup2( fd, i );        }		        close( fd );    }    chdir( "/" );    umask(0);    return 0;}static int filetype( const char* path, int type ){    if( NULL == path )        return -1;	    struct stat st;    if( -1 == lstat( path, &st ) )        return -1;	    int retval = 1;    switch( type )    {    case 0:        retval = S_ISREG( st.st_mode );        break;		    case 1:        retval = S_ISDIR( st.st_mode );        break;		    case 2:        retval = S_ISLNK( st.st_mode );        break;            case 3:        retval = S_ISBLK( st.st_mode );        break;            case 4:        retval = S_ISCHR( st.st_mode );        break;            case 5:        retval = S_ISFIFO( st.st_mode );        break;            case 6:        retval = S_ISSOCK( st.st_mode );        break;    }	    return !retval;}int isreg( const char* path ){    return filetype( path, 0 );}int isdir( const char* path ){    return filetype( path, 1 );}int islink( const char* path ){    return filetype( path, 2 );}int isblk( const char* path ){    return filetype( path, 3 );}int ischr( const char* path ){    return filetype( path, 4 );}int isfifo( const char* path ){    return filetype( path, 5 );}int issock( const char* path ){    return filetype( path, 6 );}void look( const char* line ){    for( unsigned int i = 0; i < strlen( line ); i++ )    {        printf( "char: %c->%i\n", line[i], (int)(line[i] ) );    }}void version( const char* version, int size ){    if( NULL == version )        return;    printf( "version: %s", version );    if( 0 != size )        printf( " --bit%i", size * 8 );	    printf( "\n" );}void codemd5( const char* md5 ){    if( NULL == md5 )        return;	    const int LEN_MD5 = 32;    char buf[LEN_MD5 + 1];    memset( buf, 0, sizeof( buf ) );    strncpy( buf, md5, LEN_MD5 );    printf( "MD5: %s.\n", buf );}int regsignal( int signum, void(*catchfun)(int), int sigmask ){    struct sigaction sigact;    memset( &sigact, 0, sizeof( sigact ) );    if( SIGSTOP == signum )        sigact.sa_flags = SA_NOCLDSTOP;	    sigemptyset( &sigact.sa_mask );    if( -1 != sigmask )        sigaddset( &sigact.sa_mask, sigmask );	    sigact.sa_handler = catchfun;    return sigaction( signum, &sigact, NULL );}int createtree( const char* path, int mode ){    if( NULL == path )        return -__LINE__;	    const char* locate = NULL;    const char* point = path;    char create[strlen( path ) + 1];    while( NULL != ( locate = strchr( point, '/' ) ) )    {        int length = locate - path;        point = locate + 1;        bzero( create, sizeof( create ) );        strncpy( create, path, length );        if( 0 == *create )            continue;		        if( 0 != access( create, F_OK ) && -1 == mkdir( create, mode ) )            return -__LINE__;    }	    return 0;}

⌨️ 快捷键说明

复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?