'개발&컴퓨터시스템'에 해당되는 글 14건

  1. 2011.05.23 [C] "rm -rf" 명령 수행 함수 1
  2. 2011.05.23 [C] "mkdir -p" 명령 수행 함수
  3. 2011.05.22 PROPFIND 302 FOUND ERROR
  4. 2011.05.22 svn merge 방법

가끔 필요하지만 막상구현하려면 귀찮는 함수 ^^

파일이 존재하는 디렉토리 지우는 C코드입니다.

출처 : http://kldp.org/node/108793
위 출처에서 clique 님이 작성하신 코드를 조금 수정했습니다.

ftw(), nftw()라는 file tree walking(traversing) 함수가 있습니다. SUS에 속해 있죠
http://www.opengroup.org/onlinepubs/9699919799/
기본적으로는 pre-order traverse입니다만, 옵션을 줘서 post-order로 traverse할 수 있습니다.


#define _XOPEN_SOURCE 500
#include <ftw.h>
#include <stdio.h>
#include <stdlib.h>

static int rmdir_helper(const char *fpath, const struct stat *sb, int tflag, struct FTW *ftwbuf)
{
    switch ( tflag )
    {
    case FTW_D:
    case FTW_DP:
        if ( rmdir(fpath) == -1 )
            perror("unlink");
        break;
    case FTW_F:
    case FTW_SL:
        if ( unlink(fpath) == -1 )
            perror("unlink");
        break;
    default:
        puts("do nothing");
    }
    return 0;
}

int rmdir_rf(const char * dir_to_remove)
{
    int flags = 0;

    if ( dir_to_remove == NULL )
        return 1;

    flags |= FTW_DEPTH; // post-order traverse

    if (nftw(dir_to_remove, rmdir_helper, 10, flags) == -1)
        perror("nftw");
        exit(EXIT_FAILURE);
    

    return 0;
}


int main(int argc, char *argv[])
{
    if ( argc == 2 )
        rmdir_rf(argv[1]);
    return 0;
}

Posted by kabangkle
가끔 필요할때까 있는데 구현하기는 귀찮은 함수

출처 : http://niallohiggins.com/2009/01/08/mkpath-mkdir-p-alike-in-c-for-unix/

Most people are probably familiar with the UNIX utility, mkdir(1). The mkdir utility makes directories (surprise surprise). There is a matching mkdir(2) system call available in the POSIX standard C library. The usage is pretty straightforward - how ever, the command-line executable, mkdir(1), supports a useful option -p to "create intermediate directories as required". Its very convenient to run `mkdir -p' on a long path before copying things or whatever, since you don't have to worry about the directory structure not existing. However, the mkdir(2) library function doesn't support an analogous mode. If you want to recursively create all the intermediate directories in a path in your program, you must implement this yourself. I've used this same function in at least three distinct projects now and so I decided to post the code:

/* Function with behaviour like `mkdir -p'  */

int
mkpath(const char *s, mode_t mode){
        char *q, *r = NULL, *path = NULL, *up = NULL;
        int rv;

        rv = -1;
        if (strcmp(s, ".") == 0 || strcmp(s, "/") == 0)
                return (0);

        if ((path = strdup(s)) == NULL)
                exit(1);
     
        if ((q = strdup(s)) == NULL)
                exit(1);

        if ((r = dirname(q)) == NULL)
                goto out;
        
        if ((up = strdup(r)) == NULL)
                exit(1);

        if ((mkpath(up, mode) == -1) && (errno != EEXIST))
                goto out;

        if ((mkdir(path, mode) == -1) && (errno != EEXIST))
                rv = -1;
        else
                rv = 0;

out:
        if (up != NULL)
                free(up);
        free(q);
        free(path);
        return (rv);
}

Posted by kabangkle

Apache + SVN(Subversion) 환경에서 http 프로토콜로 svn을 사용하다보면

커맨드라인에서 아래의 명령을 수행할때 정말 원인도 모르게

$ svn add newfile.txt
$ svn commit newfile.txt

"PROPFIND 궁시렁 궁시렁 ... 302 궁시렁" 하는 에러가 발생하는 경우가 있다.
 

만일 windows 환경에서 TortoiseSVN을 사용한다면 다음과 같은 형태로 에러를 볼수 있다.

Error Commit failed (details follow):

Error Repository moved temporarity to

Error 주소표시

Error please relocate

Error Repository moved temporarity to

Error 주소표시

Error please relocate


위 에러는 원인은...

apache 설정파일 중에 "ErrorDocument 404" 에대한 handler가 등록되 있을 경우

svn add/commit 이 302 에러로 실패 할수 있다고 한다.. 정말 지저분하다.. 망할.. -_-;;

물론 본인이 "ErrorDocument 404" 헨들러를 설정하지 않았어도..

apache랑 연동되는 수많은 프로그램중 하나가 설정 했을 수 있다.

여튼 해결 방법을 알아보면 httpd 설정파일에서 svn 관련 설정부분에

다음 예제와 같이 "ErrorDocument 404 defaut" 처리 해서 "ErrorDocument 404" 를 꺼버리면 된다.

<Location /repos>
DAV svn
SVNParentPath /var/www/svn
SVNIndexXSLT /svnindex.xsl

# Limit access to list of valid users.
# Require SSL connection for password protection.
# SSLRequireSSL

AuthType Basic
AuthName "Multiplex Systems Subversion Repository"
AuthUserFile /var/www/auth-file
Require valid-user
ErrorDocument 404 default
</Location>



* 추가 내용 *

처음부터 302 에러가 나는 것은 아니고.. svn move, svn delete 등 명령이 수행된 이후나 여튼

어떤 알수 없는 조건이 충족되고 나면 발생하는 듯함.


'개발&컴퓨터시스템 > Subversion' 카테고리의 다른 글

svn merge 방법  (0) 2011.05.22
Posted by kabangkle

svn merge 작업은 몇달에 한번씩만 하다보니 명령어를 까먹어서 매번 검색을 하는거 같다.
그냥 내 블로그에 정리를 해두자~

"1.1-stable" 이라는 브랜치의 작업 내용을 "trunk"에 반영(merge) 작업을 한다고 가정함. 

1. "1.1-stable"이 최초로 생성된 revision을 얻는다. 아래의 명령어를 이용하여 가장 밑에 로그 revision을 확인함.

$ svn log --stop-on-copy svn://www.test.com/test/branches/1.1-stable


2. 1에서 얻은 revision이 3000일 경우 "trunk"로 이동하여 아래의 명령어와 --dry-run 옵션을 추가로 이용하여 가상으로 merge 결과를 확인해본다. (--dry-run 옵션은 실제로 merge 작업을 하지 않고 merge 결과만 보여준다.)
아래의 명령은  revision 3000~최신 까지 "1.1-stable" 브랜치에서 작업된 내용을 "trunk"에 가상으로 반영해본다는 내용이다.

$ cd trunk
$ svn merge --dry-run -r3000:HEAD svn://www.test.com/test/branches/1.1-stable ./


3. 2의 결과를 보고 별다른 문제가 없으면 --dry-run을 제거하고 실제로 merge를 실행한다. 이때 소스코드에서 충돌이 발생하면 충돌난 부분을 찾아서 수정해준다.

$ svn merge -r3000:HEAD svn://www.test.com/test/branches/1.1-stable ./


4. merge가 완료된 trunk 코드를 diff 나 기타 방식대로 점검을 해본다.(귀찮거나 자신있으면 생략~ ^^)

$ svn diff | vi -


5. merge된 trunk를 commit 하여 작업을 완료한다. 

$ svn commit -m "브랜치 1.1-stable 작업 내역을 trunk에 반영함"



이제 merge된 코드를 빌드하여 테스트를 즐긴다~

'개발&컴퓨터시스템 > Subversion' 카테고리의 다른 글

PROPFIND 302 FOUND ERROR  (0) 2011.05.22
Posted by kabangkle