[완료] 입력받은 권한을 파일에 적용하는 프로그램을 만들고 있습니다!

고양이를부탁해의 이미지

안녕하세요 ^^

예전에 비슷한 질문을 올렸엇는데...그 후로 계속 혼자 하다보니 진척이 되긴 했는데
다됬다 싶으니 여기서 턱 막히네요..

프로그램 개요는 인자로 주는 권한을 설정하는 것인데 파일이 존재하지 않을 경우에는 파일을 생성하면서 권한설정을 하고
파일이 있을 경우에는 권한만(시간도) 설정해주는 겁니다.

그런데 존재하는 파일명을 줄 경우에는 안그러는데
존재하지 않는 파일명을 줄 경우에는 특정 권한이 적용이 안됩니다.

한 예로 likeastouch what -rwx -rw -w 입니다.
이렇게 실행시켜보면 없는 파일이므로 open으로 파일이 생성은 되지만 쓰기권한이(다른 권한은 다 되요) 설정이 안됩니다.
그치만 다시 한번 실행시켜보면 chmod를 이용해서 쓰기권한이 의도한 대로 설정이 됩니다..

도대체 무엇이 문제일까요??

도움 부탁드리겠습니다 감사합니다 ^^;;

아래는 지저분하지만 소스입니다!

#include <stdio.h>
#include <unistd.h>
#include <sys/stat.h>
#include <fcntl.h>
 
int main(int argc, char *argv[])
{
 
	mode_t mode;
	int perm[3]={0,0,0};
	int fd;
	int i,j;
	int len;
 
	/* 프로그램 설명문 보여주기 */
	if(argc!=5){
		printf("Useage: likeastouch  <filename> <-USR_RWX> <-GRP_RWX> <OTH_RWX>\n");
		printf("[examplue]\nlikeastouch file.out -r -rw -rwx\n");
	}
 
	/* 권한값 구하기
	 * 첫 for문은 소유자권한, 그룹권한, 기타권한을 접근하는데 사용
	 * 둘째 for문은 입력값으로 주어진 각 권한을 검사해 대응하는 정수값으로 바꾸기 */
	for(i=2; i<argc; i++){
		for(j=1; argv[i][j] != '\0'; j++){
			if(argv[i][j] == 'r')
			{
				printf("we fount %c\n",argv[i][j]);
				perm[i-2] += 4;
			}	
			else if(argv[i][j] == 'w')
			{
				printf("we fount %c\n",argv[i][j]);
				perm[i-2] += 2;
			}
			else
			{
				printf("we fount %c\n",argv[i][j]);
				perm[i-2] += 1;
			}
 
		}		
	}
 
	/* 권한을 합치기 
	 * perm[0]은 소유자, perm[1]은 그룹 perm[2]는 다른유저 */	
	mode = perm[2];
	mode |= perm[1] << 3;
	mode |= perm[0] << 6; 
 
 
	printf("%d\n",mode);	
 
	/* 파일이 존재하지 않으면 인자로 받은 권한값으로 만들고 
	 * 존재하면 함수를 사용, 날짜와 권한 바꿈 */
 
	if( access(argv[1],F_OK) != 0){
		fd = open(argv[1], O_RDONLY|O_CREAT,mode);
		close(fd);
	}
	else{
		chmod(argv[1],mode);
		utime(argv[1],NULL);
	}
 
	return 0;
 
} 

rhheo의 이미지

umask가 0022로 잡혀 있을 것 같네요.

열심히 하고 계신듯.. ^^
참고로 글 쓰실 때 include문에서 글자 안 잡혀 먹을려면 < 를 &lt;로 변환해서 적어 보세요.

고양이를부탁해의 이미지

기본으로 설정되어있는 umask가 있었네요!!
open or create호출을 통해 파일을 만들때 mode매개변수를 umask와 비교해 권한이 설정된다는 걸
왜 몰랐을까요 정말 고맙습니다 우헤헤 ^_^

아 그리구 코드올리는 방법에 대해서 고맙습니다!

------------
힘들면 즐겁다.


------------
힘들면 즐겁다.

bushi의 이미지

else 를 빼면 어떨까요 ?

소스 적으실 땐

&lt;code&gt;
&lt;/code&gt;

OTL
고양이를부탁해의 이미지

답변 감사합니다! 코드올리는 법도 잘몰랐네요 :)

그런데 else를 빼라는 말은 else이하에 있는 chmod,utime을

파일이 있든 없든간에 실행되게 하라는 건가요??

------------
힘들면 즐겁다.


------------
힘들면 즐겁다.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.