Mercurial > hg > toybox
comparison lib/lib.c @ 553:75da5d793fc8
Unwind gratuitous macros.
author | Rob Landley <rob@landley.net> |
---|---|
date | Mon, 19 Mar 2012 20:56:18 -0500 |
parents | 2548e6e590b2 |
children | 997e016fbdf0 |
comparison
equal
deleted
inserted
replaced
552:7b85b0a0e9c0 | 553:75da5d793fc8 |
---|---|
897 } | 897 } |
898 | 898 |
899 | 899 |
900 /* mode parsing */ | 900 /* mode parsing */ |
901 | 901 |
902 #define USR_FLAGS (S_IRWXU) | 902 mode_t apply_mode(int who, int how, int what, mode_t base) |
903 #define GRP_FLAGS (S_IRWXG) | 903 { |
904 #define OTH_FLAGS (S_IRWXO) | 904 mode_t new_mode = 0, tmp_mode = 0, tmp_mask = 0; |
905 #define SGT_FLAGS (S_ISUID | S_ISGID | S_ISVTX) | 905 |
906 | 906 if (!who) tmp_mask = 07777; |
907 #define MODE_WHAT(v, w, x, y, z) { \ | 907 if (who & 0x01) { // u |
908 if (x & v) \ | 908 if (what & 0x01) tmp_mode |= S_IXUSR; |
909 y |= S_I##w##z;\ | 909 if (what & 0x02) tmp_mode |= S_IWUSR; |
910 } | 910 if (what & 0x04) tmp_mode |= S_IRUSR; |
911 #define MODE_READ(x, y, z) MODE_WHAT(0x04, R, x, y, z) | 911 if (what & 0x08) tmp_mode |= S_ISUID; |
912 #define MODE_WRITE(x, y, z) MODE_WHAT(0x02, W, x, y, z) | 912 tmp_mask |= S_IRWXU; |
913 #define MODE_EXEC(x, y, z) MODE_WHAT(0x01, X, x, y, z) | 913 } |
914 #define MODE_SUID(x, y) MODE_WHAT(0x08, S, x, y, UID) | 914 if (who & 0x02) { // g |
915 #define MODE_SGID(x, y) MODE_WHAT(0x08, S, x, y, GID) | 915 if (what & 0x01) tmp_mode |= S_IXGRP; |
916 #define MODE_SVTX(x, y) MODE_WHAT(0x10, S, x, y, VTX) | 916 if (what & 0x02) tmp_mode |= S_IWUSR; |
917 | 917 if (what & 0x04) tmp_mode |= S_IRUSR; |
918 mode_t | 918 if (what & 0x08) tmp_mode |= S_ISGID; |
919 apply_mode(int who, int how, int what, mode_t base) | 919 tmp_mask |= S_IRWXG; |
920 { | 920 } |
921 mode_t new_mode = 0; | 921 if (who & 0x04) { // o |
922 mode_t tmp_mode = 0; | 922 if (what & 0x01) tmp_mode |= S_IXOTH; |
923 mode_t tmp_mask = USR_FLAGS | GRP_FLAGS | OTH_FLAGS | SGT_FLAGS; | 923 if (what & 0x02) tmp_mode |= S_IWOTH; |
924 if (who & 0x01) { | 924 if (what & 0x04) tmp_mode |= S_IROTH; |
925 /* u */ | 925 tmp_mask |= S_IRWXO; |
926 MODE_READ(what, tmp_mode, USR); | |
927 MODE_WRITE(what, tmp_mode, USR); | |
928 MODE_EXEC(what, tmp_mode, USR); | |
929 MODE_SUID(what, tmp_mode) | |
930 tmp_mask &= (GRP_FLAGS | OTH_FLAGS | SGT_FLAGS); | |
931 } | |
932 if (who & 0x02) { | |
933 /* g */ | |
934 MODE_READ(what, tmp_mode, GRP); | |
935 MODE_WRITE(what, tmp_mode, GRP); | |
936 MODE_EXEC(what, tmp_mode, GRP); | |
937 MODE_SGID(what, tmp_mode) | |
938 tmp_mask &= (USR_FLAGS | OTH_FLAGS | SGT_FLAGS); | |
939 } | |
940 if (who & 0x04) { | |
941 /* o */ | |
942 MODE_READ(what, tmp_mode, OTH); | |
943 MODE_WRITE(what, tmp_mode, OTH); | |
944 MODE_EXEC(what, tmp_mode, OTH); | |
945 tmp_mask &= (USR_FLAGS | GRP_FLAGS | SGT_FLAGS); | |
946 } | 926 } |
947 /* check sticky */ | 927 /* check sticky */ |
948 MODE_SVTX(what, tmp_mode); | 928 if (what & 0x10) tmp_mode |= S_ISVTX; |
949 switch (how){ | 929 |
950 case 1: | 930 if (how == 1) new_mode = tmp_mode | (base & tmp_mask); |
951 /* set */ | 931 else if (how == 2) new_mode = base | tmp_mode; |
952 new_mode = tmp_mode | (base & tmp_mask); | 932 else if (how == 3) new_mode = base & ~(tmp_mode); |
953 break; | 933 |
954 case 2: | |
955 /* add */ | |
956 new_mode = base | tmp_mode; | |
957 break; | |
958 case 3: | |
959 /* remove */ | |
960 new_mode = base & ~(tmp_mode); | |
961 break; | |
962 } | |
963 return new_mode; | 934 return new_mode; |
964 } | 935 } |
965 | 936 |
966 | 937 |
967 mode_t | 938 mode_t string_to_mode(char *mode_str, mode_t base) |
968 string_to_mode(char *mode_str, mode_t base) | |
969 { | 939 { |
970 mode_t new_mode; | 940 mode_t new_mode; |
971 int what = 0; | 941 int what = 0; |
972 int who = 0; | 942 int who = 0; |
973 int how = 0; | 943 int how = 0; |
975 long tmp; | 945 long tmp; |
976 if (!mode_str) | 946 if (!mode_str) |
977 return base; | 947 return base; |
978 if (isdigit(mode_str[0])) { | 948 if (isdigit(mode_str[0])) { |
979 tmp = strtol(mode_str, &p, 8); | 949 tmp = strtol(mode_str, &p, 8); |
980 if (*p || tmp < 0 || | 950 if (*p || tmp < 0 || (tmp & ~(07777))) return base; |
981 (tmp & ~(OTH_FLAGS | SGT_FLAGS | GRP_FLAGS | USR_FLAGS))) | |
982 return base; | |
983 new_mode = (mode_t) tmp; | 951 new_mode = (mode_t) tmp; |
984 return new_mode; | 952 return new_mode; |
985 } | 953 } |
986 new_mode = base; | 954 new_mode = base; |
987 while (*mode_str) { | 955 while (*mode_str) { |