chmod.cpp
上传用户:surprise9
上传日期:2007-01-04
资源大小:426k
文件大小:6k
源码类别:

Ftp客户端

开发平台:

Visual C++

  1. // This is part of the WAR SOFTWARE SERIES initiated by Jarle Aase
  2. // Copyright 1996 by Jarle Aase. All rights reserved.
  3. // See the "War Software Series Licende Agreement" for details concerning 
  4. // use and distribution.
  5. // ---
  6. // This source code, executables and programs containing source code or
  7. // binaries or proprietetary technology from the War Software Series are
  8. // NOT alloed used, viewed or tested by any governmental agencies in
  9. // any countries. This includes the government, departments, police, 
  10. // military etc.
  11. // ---
  12. // This file is intended for use with Tab space = 2
  13. // Created and maintained in MSVC Developer Studio
  14. // ---
  15. // NAME : chmod.cpp
  16. // PURPOSE : extended UNIX chmod command
  17. // PROGRAM : 
  18. // DATE : Oct. 13 1996
  19. // AUTHOR : Jarle Aase
  20. // ---
  21. // REVISION HISTORY
  22. // 
  23. #include "stdafx.h"
  24. #include "WarDaemon.h"
  25. #include "Unix.h"
  26. #include "FsysSecurity.h"
  27. #ifdef _DEBUG
  28. #define new DEBUG_NEW
  29. #undef THIS_FILE
  30. static char THIS_FILE[] = __FILE__;
  31. #endif
  32. CChmod::CChmod()
  33. {
  34. set = NULL;
  35. m_Owner = -1;
  36. m_Group = -1;
  37. m_Comment = NULL;
  38. m_DefDirPerms = -1;
  39. m_DefFilePerms = -1;
  40. omode = -1;
  41. m_SetMode = FALSE;
  42. }
  43. CChmod::~CChmod()
  44. {
  45. if (set)
  46. free(set);
  47. }
  48. int CChmod::main(int argc, char **argv)
  49. {
  50. char *ep, *mode;
  51. BOOL Alternate = FALSE;
  52. set = NULL;
  53. omode = 0;
  54. Hflag = Lflag = Pflag = Rflag = fflag = hflag = 0;
  55. while ((ch = getopt(argc, argv, "O:G:C:D:F:HLPRXfgorstuwx")) != EOF)
  56. switch (ch) 
  57. {
  58. case 'O': // chown
  59. if (!optarg || !*optarg)
  60. goto badarg;
  61. if ((m_Owner = CUsr::FindUser(UT_USER, optarg)) == 0)
  62. {
  63. printf("Unknown user name '%s'n", optarg);
  64. return -1;
  65. }
  66. Alternate = TRUE;
  67. break;
  68. case 'G': // chown
  69. if (!optarg || !*optarg)
  70. goto badarg;
  71. if ((m_Group = CUsr::FindUser(UT_CLASS, optarg)) == 0)
  72. {
  73. printf("Unknown class name '%s'n", optarg);
  74. return -1;
  75. }
  76. Alternate = TRUE;
  77. break;
  78. case 'C': // change comment
  79. if (!optarg)
  80. goto badarg;
  81. m_Comment = optarg;
  82. Alternate = TRUE;
  83. break;
  84. case 'D':
  85. if (!optarg || !*optarg || (*optarg < '0') || (*optarg > '8'))
  86. goto badarg;
  87. m_DefDirPerms = strtol(optarg, &ep, 8);
  88. Alternate = TRUE;
  89. break;
  90. case 'F':
  91. if (!optarg || !*optarg || (*optarg < '0') || (*optarg > '8'))
  92. goto badarg;
  93. m_DefFilePerms = strtol(optarg, &ep, 8);
  94. Alternate = TRUE;
  95. break;
  96. case 'H':
  97. Hflag = 1;
  98. Lflag = Pflag = 0;
  99. break;
  100. case 'L':
  101. Lflag = 1;
  102. Hflag = Pflag = 0;
  103. break;
  104. case 'P':
  105. Pflag = 1;
  106. Hflag = Lflag = 0;
  107. break;
  108. case 'R':
  109. Rflag = 1;
  110. break;
  111. case 'f': /* XXX: undocumented. */
  112. fflag = 1;
  113. break;
  114. case 'h':
  115. /*
  116.  * In System V (and probably POSIX.2) the -h option
  117.  * causes chmod to change the mode of the symbolic
  118.  * link.  4.4BSD's symbolic links don't have modes,
  119.  * so it's an undocumented noop.  Do syntax checking,
  120.  * though.
  121.  */
  122. hflag = 1;
  123. break;
  124. /*
  125.  * XXX
  126.  * "-[rwx]" are valid mode commands.  If they are the entire
  127.  * argument, getopt has moved past them, so decrement optind.
  128.  * Regardless, we're done argument processing.
  129.  */
  130. case 'g': case 'o': case 'r': case 's':
  131. case 't': case 'u': case 'w': case 'X': case 'x':
  132. if (argv[optind - 1][0] == '-' &&
  133.     argv[optind - 1][1] == ch &&
  134.     argv[optind - 1][2] == '')
  135. --optind;
  136. Alternate = FALSE;
  137. goto done;
  138. case '?':
  139. default:
  140. return usage();
  141. }
  142. done:
  143. argv += optind;
  144. argc -= optind;
  145. if (Rflag) 
  146. {
  147. if (hflag)
  148. {
  149. printf("the -R and -h options may not be specified together.");
  150. return usage();
  151. }
  152. }
  153. if (!Alternate)
  154. {
  155. if (argc < 2)
  156. return usage();
  157. m_SetMode = TRUE;
  158. mode = *argv;
  159. --argc;
  160. ++argv;
  161. if (*mode >= '0' && *mode <= '7') 
  162. {
  163. val = strtol(mode, &ep, 8);
  164. if (val > INT_MAX || val < 0)
  165. {
  166. printf("invalid file mode: %s", mode);
  167. return 1;
  168. }
  169. if (*ep)
  170. {
  171. printf("invalid file mode: %s", mode);
  172. return 1;
  173. }
  174. omode = val;
  175. oct = 1;
  176. else 
  177. {
  178. if ((set = setmode(mode)) == NULL)
  179. {
  180. printf("invalid file mode: %s", mode);
  181. return 1;
  182. }
  183. oct = 0;
  184. }
  185. }
  186. return Process(argc, argv);
  187. badarg:
  188. return usage();
  189. }
  190. int CChmod::Process(int argc, char **argv)
  191. {
  192. BOOL UsePrint = TRUE;
  193. CString cShowPath, cCurrentPath;
  194. LPSTR p;
  195. ASSERT(argc >= 1);
  196. for(;argc ; argc--, argv++)
  197. {
  198. CFileInfoList FileList;
  199. if (!strcmp(*argv,".\") || !strcmp(*argv,"."))
  200. {
  201. cCurrentPath = ".";
  202. cShowPath = "";
  203. }
  204. else
  205. cCurrentPath = cShowPath = *argv;
  206. p = cShowPath.GetBuffer(1);
  207. while (*p)
  208. {
  209. if (*p == '\')
  210. *p = '/';
  211. ++p;
  212. }
  213. LPSTR xpath;
  214. xpath = strrchr(cShowPath,'\');
  215. if (xpath)
  216. *xpath++= 0;
  217. cShowPath.ReleaseBuffer();
  218. ASSERT(AfxIsValidString(*argv));
  219. BldFileInfoList(FileList, *argv, FALSE);
  220. if (!ChmodFileList(FileList, xpath ? cShowPath : NULL))
  221. return -1;
  222. if (Rflag)
  223. {
  224. // Grab subdirs too
  225. CFileInfo *Info;
  226. LPSTR buf = new char[MAX_PATH];
  227. *buf = 0;
  228. int Rval;
  229. for(Info = NULL; Info = FileList.GetNext(Info); )
  230. {
  231. if (IS_DIRECTORY(Info) && strcmp(Info->FileName(),".") && strcmp(Info->FileName(),".."))
  232. {
  233. CString cBuf;
  234. cBuf.Format("%s\%s", cCurrentPath, Info->FileName());
  235. LPSTR MyArgs[1];
  236. MyArgs[0] = cBuf.GetBuffer(1);
  237. if (Rval = Process(1, MyArgs))
  238. return Rval; // Error
  239. }
  240. }
  241. }
  242. }
  243. return 0;
  244. }
  245. BOOL CChmod::ChmodFileList(CFileInfoList& FileList, LPCSTR Path)
  246. {
  247. CFileInfo *Info;
  248. LPCSTR FileName;
  249. char MyPath[MAX_PATH * 2];
  250. for(Info = NULL; Info = FileList.GetNext(Info);)
  251. {
  252. FileName = Info->FileName();
  253. ASSERT(AfxIsValidString(FileName));
  254. if (!strcmp(FileName,".") || !strcmp(FileName,".."))
  255. continue;
  256. //MkPath(Path,FileName,MyPath);
  257. if (chmod(MyPath, 
  258. m_SetMode ? oct ? omode : getmode(set,Info->m_Flags) : -1,
  259. m_Owner, m_Group, m_Comment, m_DefDirPerms, m_DefFilePerms))
  260. {
  261. printf("chmod: %s - mode change failed %sn", Path, GetLastErrorText());
  262. }
  263. }
  264. return TRUE;
  265. }
  266. int CChmod::usage()
  267. {
  268. printf("usage: chmod [-R [-H | -L | -P]] mode file ...n");
  269. printf("  or   chmod [-O Owner] [-G Class] [-C "Comment"] [-D DefDirPerms] [-F DefFilePerms] file ...n");
  270. return 1;
  271. }