アットウィキロゴ

低水準関数

#include <pwd.h>
#include <grp.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <dirent.h>

int RmDir( const char* pSrc );
int ViewFile( const char* pSrc );
int RemoveFile( const char* pSrc );
int ChownFile( const char* pSrc, const char* tOwner, const char* tGroupe );
int ChmodFile( const char* pSrc, mode_t tMode );
int RenameFile( const char* pSrc, const char* pDst ); // Moveも同様
int MakeDir( const char* pDir );
int CopyFile( const char* pSrc, const char* pDst );

#define ERRLOG()  printf( "Error Line=[%d]\n", __LINE__ );

int main(int argc, char* argv[])
{
  char* pCmd    = argv[0];
  char* pParam1 = argv[1];
  char* pParam2 = argv[2];

  printf("argv[0]=[%s]\n", pCmd );
  printf("argv[1]=[%s]\n", pParam1);
  printf("argv[2]=[%s]\n", pParam2);

  printf("main() start\n");

  RmDir( "test" );

  /**********************************/
  /* chmod */
//  char* endptr = NULL;
//  mode_t mode = 0;
//  mode = strtol( pParam1, &endptr, 8 );
//  if( endptr == pParam1 )
//  {
//    ERRLOG();
//    return -1;
//  }
//  ChmodFile( "test1.txt", mode );

  /**********************************/
//  ViewFile( "Makefile" );
//  RemoveFile( "test1.txt" );
//  ChownFile( "test1.txt", "toyo", "toyo" );
//  RenameFile( "test3.txt", "testDir2/test3.txt" );
//  MakeDir( "testDir" );
//  CopyFile( "test1.txt", "test2.txt" );

  return 0;
}

int RmDir( const char* pSrc )
{
  int iRet = 0;
  struct dirent* dir;

  printf( "File=[%s]\n", pSrc );

  DIR* dp = opendir( pSrc );
  if( dp == NULL )
  {
    ERRLOG();
    return -1;
  }

  iRet = chdir( pSrc );
  if( iRet != 0 )
  {
    printf( "dir=[%s]", pSrc );
    ERRLOG();
    return -1;
  }

  while( NULL != (dir = readdir( dp ) ) )
  {
    if( dir->d_type == 4 )
    {
      if( (0 == strcmp( ".", dir->d_name )) || (0 == strcmp( "..", dir->d_name )) )
      { continue; }
      else
      {
        RmDir( dir->d_name );
      }
      printf( "dell : dir=[%s]\n", dir->d_name ); // rmdirに置き換える
    }
    else
    {
      printf( "dell : type=[%d] name=[%s]\n", dir->d_type, dir->d_name ); //remove に置き換える
    }
  }

  closedir( dp );
  return 0;
}

int ViewFile( const char* pSrc )
{

  int iRet       = 0;
  int fdSrc      = 0;
  int iReadSize  = 0;
  char cBuff[10] = {0};
  struct stat tStat;

  /* Check File Exists */
  iRet = stat( pSrc, &tStat );
  if( iRet != 0 )
  {
    ERRLOG();
    return -1;
  }

  /* File Open */
  fdSrc = open( pSrc, O_RDONLY );
  if( fdSrc < 0 )
  {
    ERRLOG();
    return -1;
  }

  while( 0 <  ( iReadSize = read(fdSrc, cBuff, sizeof(cBuff)-1) ) )
  {
    if( iReadSize < (int)(sizeof(cBuff)-1) )
    {
       cBuff[iReadSize] = 0x00;
    }

    printf( "%s",cBuff );
  }

  printf("\n");

  return 0;
}

int RemoveFile( const char* pSrc )
{
  int iRet = 0;

  iRet = remove( pSrc );
  if( iRet != 0 )
  {
    ERRLOG();
    return -1;
  }

  return 0;
}

int ChownFile( const char* pSrc, const char* pcOwner, const char* pcGroupe )
{
  int iRet = 0;
  uid_t tUid;
  gid_t tGid;
  struct passwd* ptPasswd;
  struct group*  ptGroupe;

  ptPasswd = getpwnam( pcOwner );  // POSIX
  tUid = ptPasswd->pw_uid;

  ptGroupe = getgrnam( pcGroupe ); // POSIX
  tGid = ptGroupe->gr_gid;

  printf( "tUid=[%d]\n", tUid );
  printf( "tGid=[%d]\n", tGid );

  iRet = chown( pSrc, tUid, tGid  );
  if( iRet != 0 )
  {
    ERRLOG();
    return -1;
  }

  return 0;
}

int ChmodFile( const char* pSrc, mode_t tMode )
{
  int iRet = 0;

  iRet = chmod( pSrc, tMode );
  if( iRet != 0 )
  {
    ERRLOG();
    return -1;
  }
  return 0;
}

int RenameFile( const char* pSrc, const char* pDst )
{
  int iRet = 0;
  struct stat tStat;
  
  /* Check File Exists */
  iRet = stat( pDst, &tStat );
  if( iRet == 0 )
  {
    ERRLOG();
    return -1;
  }

  iRet = rename( pSrc, pDst );
  if( iRet != 0 )
  {
    ERRLOG();
    return -1;
  }
  return 0;
}

int MakeDir( const char* pDir )
{
  int iRet = 0;

  iRet = mkdir( pDir, 00755 );
  if( iRet != 0 )
  {
    ERRLOG();
    return -1;
  }

  return 0;
}

int CopyFile( const char* pSrc, const char* pDst )
{
  int iRet       = 0;
  int fdSrc      = 0;
  int fdDst      = 0;
  int iReadSize  = 0;
  int iWriteSize = 0;
  struct stat tStatSrc;
  struct stat tStatDst;

  char cBuff[10] = {0};

  /* Check File Exists */
  iRet = stat( pSrc, &tStatSrc );
  if( iRet != 0 )
  {
    ERRLOG();
    return -1;
  }

  /* Check File Exists */
  iRet = stat( pDst, &tStatDst );
  if( iRet == 0 )
  {
    ERRLOG();
    return -1;
  }

  /* File Open */
  fdSrc = open( pSrc, O_RDONLY );
  if( fdSrc < 0 )
  {
    ERRLOG();
    return -1;
  }

  /* File Open */
  fdDst = open( pDst, O_CREAT | O_WRONLY, tStatSrc.st_mode );
  if( fdDst < 0 )
  {
    ERRLOG();
    return -1;
  }

  /* File Read */
  while( 0 <  ( iReadSize = read(fdSrc, cBuff, sizeof(cBuff)) ) )
  {
    iWriteSize = write( fdDst, cBuff, iReadSize );
    printf( "FileSize=[%d]\n", iWriteSize );
  }

  /* File Close */
  close( fdSrc );
  close( fdDst );

  return 0;
}
最終更新:2013年12月01日 18:52