Changeset 79539
- Timestamp:
- 06/16/11 16:42:54 (4 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
branches/gsoc11-rev-upgrade/base/src/pextlib1.0/Pextlib.c
r79538 r79539 104 104 ui_escape(const char *source) 105 105 { 106 char *d, *dest;107 const char *s;108 size_t dlen;109 110 s = source;111 dlen = strlen(source) * 2 + 1;112 d = dest = malloc(dlen);113 if (dest == NULL) {114 return NULL;115 }116 while(*s != '\0') {117 switch(*s) {118 case '\\':119 case '}':120 case '{':121 *d = '\\';122 d++;123 *d = *s;124 d++;125 s++;126 break;127 case '\n':128 s++;129 break;130 default:131 *d = *s;132 d++;133 s++;134 break;135 }136 }137 *d = '\0';138 return dest;106 char *d, *dest; 107 const char *s; 108 size_t dlen; 109 110 s = source; 111 dlen = strlen(source) * 2 + 1; 112 d = dest = malloc(dlen); 113 if (dest == NULL) { 114 return NULL; 115 } 116 while(*s != '\0') { 117 switch(*s) { 118 case '\\': 119 case '}': 120 case '{': 121 *d = '\\'; 122 d++; 123 *d = *s; 124 d++; 125 s++; 126 break; 127 case '\n': 128 s++; 129 break; 130 default: 131 *d = *s; 132 d++; 133 s++; 134 break; 135 } 136 } 137 *d = '\0'; 138 return dest; 139 139 } 140 140 … … 142 142 ui_info(Tcl_Interp *interp, char *mesg) 143 143 { 144 const char ui_proc_start[] = "ui_info [subst -nocommands -novariables {";145 const char ui_proc_end[] = "}]";146 char *script, *string;147 size_t scriptlen, len, remaining;148 int rval;149 150 string = ui_escape(mesg);151 if (string == NULL)152 return TCL_ERROR;153 154 len = strlen(string);155 scriptlen = sizeof(ui_proc_start) + len + sizeof(ui_proc_end) - 1;156 script = malloc(scriptlen);157 if (script == NULL)158 return TCL_ERROR;159 160 memcpy(script, ui_proc_start, sizeof(ui_proc_start));161 remaining = scriptlen - sizeof(ui_proc_start);162 strncat(script, string, remaining);163 remaining -= len;164 strncat(script, ui_proc_end, remaining);165 free(string);166 rval = Tcl_EvalEx(interp, script, -1, 0);167 free(script);168 return rval;144 const char ui_proc_start[] = "ui_info [subst -nocommands -novariables {"; 145 const char ui_proc_end[] = "}]"; 146 char *script, *string; 147 size_t scriptlen, len, remaining; 148 int rval; 149 150 string = ui_escape(mesg); 151 if (string == NULL) 152 return TCL_ERROR; 153 154 len = strlen(string); 155 scriptlen = sizeof(ui_proc_start) + len + sizeof(ui_proc_end) - 1; 156 script = malloc(scriptlen); 157 if (script == NULL) 158 return TCL_ERROR; 159 160 memcpy(script, ui_proc_start, sizeof(ui_proc_start)); 161 remaining = scriptlen - sizeof(ui_proc_start); 162 strncat(script, string, remaining); 163 remaining -= len; 164 strncat(script, ui_proc_end, remaining); 165 free(string); 166 rval = Tcl_EvalEx(interp, script, -1, 0); 167 free(script); 168 return rval; 169 169 } 170 170 171 171 int StrsedCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 172 172 { 173 char *pattern, *string, *res;174 int range[2];175 Tcl_Obj *tcl_result;176 177 if (objc != 3) {178 Tcl_WrongNumArgs(interp, 1, objv, "string pattern");179 return TCL_ERROR;180 }181 182 string = Tcl_GetString(objv[1]);183 pattern = Tcl_GetString(objv[2]);184 res = strsed(string, pattern, range);185 if (!res) {186 Tcl_SetResult(interp, "strsed failed", TCL_STATIC);187 return TCL_ERROR;188 }189 tcl_result = Tcl_NewStringObj(res, -1);190 Tcl_SetObjResult(interp, tcl_result);191 free(res);192 return TCL_OK;173 char *pattern, *string, *res; 174 int range[2]; 175 Tcl_Obj *tcl_result; 176 177 if (objc != 3) { 178 Tcl_WrongNumArgs(interp, 1, objv, "string pattern"); 179 return TCL_ERROR; 180 } 181 182 string = Tcl_GetString(objv[1]); 183 pattern = Tcl_GetString(objv[2]); 184 res = strsed(string, pattern, range); 185 if (!res) { 186 Tcl_SetResult(interp, "strsed failed", TCL_STATIC); 187 return TCL_ERROR; 188 } 189 tcl_result = Tcl_NewStringObj(res, -1); 190 Tcl_SetObjResult(interp, tcl_result); 191 free(res); 192 return TCL_OK; 193 193 } 194 194 195 195 int ExistsuserCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 196 196 { 197 Tcl_Obj *tcl_result;198 struct passwd *pwent;199 char *user;200 201 if (objc != 2) {202 Tcl_WrongNumArgs(interp, 1, objv, "user");203 return TCL_ERROR;204 }205 206 user = strdup(Tcl_GetString(objv[1]));207 if (isdigit(*(user)))208 pwent = getpwuid(strtol(user, 0, 0));209 else210 pwent = getpwnam(user);211 free(user);212 213 if (pwent == NULL)214 tcl_result = Tcl_NewIntObj(0);215 else216 tcl_result = Tcl_NewIntObj(pwent->pw_uid);217 218 Tcl_SetObjResult(interp, tcl_result);219 return TCL_OK;197 Tcl_Obj *tcl_result; 198 struct passwd *pwent; 199 char *user; 200 201 if (objc != 2) { 202 Tcl_WrongNumArgs(interp, 1, objv, "user"); 203 return TCL_ERROR; 204 } 205 206 user = strdup(Tcl_GetString(objv[1])); 207 if (isdigit(*(user))) 208 pwent = getpwuid(strtol(user, 0, 0)); 209 else 210 pwent = getpwnam(user); 211 free(user); 212 213 if (pwent == NULL) 214 tcl_result = Tcl_NewIntObj(0); 215 else 216 tcl_result = Tcl_NewIntObj(pwent->pw_uid); 217 218 Tcl_SetObjResult(interp, tcl_result); 219 return TCL_OK; 220 220 } 221 221 222 222 int ExistsgroupCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc, Tcl_Obj *CONST objv[]) 223 223 { 224 Tcl_Obj *tcl_result;225 struct group *grent;226 char *group;227 228 if (objc != 2) {229 Tcl_WrongNumArgs(interp, 1, objv, "groupname");230 return TCL_ERROR;231 }232 233 group = strdup(Tcl_GetString(objv[1]));234 if (isdigit(*(group)))235 grent = getgrgid(strtol(group, 0, 0));236 else237 grent = getgrnam(group);238 free(group);239 240 if (grent == NULL)241 tcl_result = Tcl_NewIntObj(0);242 else243 tcl_result = Tcl_NewIntObj(grent->gr_gid);244 245 Tcl_SetObjResult(interp, tcl_result);246 return TCL_OK;224 Tcl_Obj *tcl_result; 225 struct group *grent; 226 char *group; 227 228 if (objc != 2) { 229 Tcl_WrongNumArgs(interp, 1, objv, "groupname"); 230 return TCL_ERROR; 231 } 232 233 group = strdup(Tcl_GetString(objv[1])); 234 if (isdigit(*(group))) 235 grent = getgrgid(strtol(group, 0, 0)); 236 else 237 grent = getgrnam(group); 238 free(group); 239 240 if (grent == NULL) 241 tcl_result = Tcl_NewIntObj(0); 242 else 243 tcl_result = Tcl_NewIntObj(grent->gr_gid); 244 245 Tcl_SetObjResult(interp, tcl_result); 246 return TCL_OK; 247 247 } 248 248 … … 252 252 int NextuidCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc UNUSED, Tcl_Obj *CONST objv[] UNUSED) 253 253 { 254 Tcl_Obj *tcl_result;255 int cur;256 257 cur = MIN_USABLE_UID;258 259 while (getpwuid(cur) != NULL) {260 cur++;261 }262 263 tcl_result = Tcl_NewIntObj(cur);264 Tcl_SetObjResult(interp, tcl_result);265 return TCL_OK;254 Tcl_Obj *tcl_result; 255 int cur; 256 257 cur = MIN_USABLE_UID; 258 259 while (getpwuid(cur) != NULL) { 260 cur++; 261 } 262 263 tcl_result = Tcl_NewIntObj(cur); 264 Tcl_SetObjResult(interp, tcl_result); 265 return TCL_OK; 266 266 } 267 267 … … 269 269 int NextgidCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc UNUSED, Tcl_Obj *CONST objv[] UNUSED) 270 270 { 271 Tcl_Obj *tcl_result;272 int cur;273 274 cur = MIN_USABLE_GID;275 276 while (getgrgid(cur) != NULL) {277 cur++;278 }279 280 tcl_result = Tcl_NewIntObj(cur);281 Tcl_SetObjResult(interp, tcl_result);282 return TCL_OK;271 Tcl_Obj *tcl_result; 272 int cur; 273 274 cur = MIN_USABLE_GID; 275 276 while (getgrgid(cur) != NULL) { 277 cur++; 278 } 279 280 tcl_result = Tcl_NewIntObj(cur); 281 Tcl_SetObjResult(interp, tcl_result); 282 return TCL_OK; 283 283 } 284 284 285 285 int UmaskCmd(ClientData clientData UNUSED, Tcl_Interp *interp, int objc UNUSED, Tcl_Obj *CONST objv[] UNUSED) 286 286 { 287 Tcl_Obj *tcl_result;288 char *tcl_mask, *p;289 const size_t stringlen = 5; /* 4 digits & \0 */290 int i;291 mode_t *set;292 mode_t newmode;293 mode_t oldmode;294 295 if (objc != 2) {296 Tcl_WrongNumArgs(interp, 1, objv, "mode");297 return TCL_ERROR;298 }299 300 tcl_mask = Tcl_GetString(objv[1]);301 if ((set = setmode(tcl_mask)) == NULL) {302 Tcl_SetResult(interp, "Invalid umask mode", TCL_STATIC);303 return TCL_ERROR;304 }305 306 newmode = getmode(set, 0);307 free(set);308 309 oldmode = umask(newmode);310 311 tcl_mask = calloc(1, stringlen); /* 4 digits & \0 */312 if (!tcl_mask) {313 return TCL_ERROR;314 }315 316 /* Totally gross and cool */317 p = tcl_mask + stringlen - 1;318 for (i = stringlen - 1; i > 0; i--) {319 p--;320 *p = (oldmode & 7) + '0';321 oldmode >>= 3;322 }323 324 tcl_result = Tcl_NewStringObj(p, -1);325 free(tcl_mask);326 327 Tcl_SetObjResult(interp, tcl_result);328 return TCL_OK;287 Tcl_Obj *tcl_result; 288 char *tcl_mask, *p; 289 const size_t stringlen = 5; /* 4 digits & \0 */ 290 int i; 291 mode_t *set; 292 mode_t newmode; 293 mode_t oldmode; 294 295 if (objc != 2) { 296 Tcl_WrongNumArgs(interp, 1, objv, "mode"); 297 return TCL_ERROR; 298 } 299 300 tcl_mask = Tcl_GetString(objv[1]); 301 if ((set = setmode(tcl_mask)) == NULL) { 302 Tcl_SetResult(interp, "Invalid umask mode", TCL_STATIC); 303 return TCL_ERROR; 304 } 305 306 newmode = getmode(set, 0); 307 free(set); 308 309 oldmode = umask(newmode); 310 311 tcl_mask = calloc(1, stringlen); /* 4 digits & \0 */ 312 if (!tcl_mask) { 313 return TCL_ERROR; 314 } 315 316 /* Totally gross and cool */ 317 p = tcl_mask + stringlen - 1; 318 for (i = stringlen - 1; i > 0; i--) { 319 p--; 320 *p = (oldmode & 7) + '0'; 321 oldmode >>= 3; 322 } 323 324 tcl_result = Tcl_NewStringObj(p, -1); 325 free(tcl_mask); 326 327 Tcl_SetObjResult(interp, tcl_result); 328 return TCL_OK; 329 329 } 330 330 … … 566 566 int Pextlib_Init(Tcl_Interp *interp) 567 567 { 568 if (Tcl_InitStubs(interp, "8.4", 0) == NULL)569 return TCL_ERROR;570 571 Tcl_CreateObjCommand(interp, "system", SystemCmd, NULL, NULL);572 Tcl_CreateObjCommand(interp, "flock", FlockCmd, NULL, NULL);573 Tcl_CreateObjCommand(interp, "readdir", ReaddirCmd, NULL, NULL);574 Tcl_CreateObjCommand(interp, "strsed", StrsedCmd, NULL, NULL);575 Tcl_CreateObjCommand(interp, "mkstemp", MkstempCmd, NULL, NULL);576 Tcl_CreateObjCommand(interp, "mktemp", MktempCmd, NULL, NULL);577 Tcl_CreateObjCommand(interp, "mkdtemp", MkdtempCmd, NULL, NULL);578 Tcl_CreateObjCommand(interp, "existsuser", ExistsuserCmd, NULL, NULL);579 Tcl_CreateObjCommand(interp, "existsgroup", ExistsgroupCmd, NULL, NULL);580 Tcl_CreateObjCommand(interp, "nextuid", NextuidCmd, NULL, NULL);581 Tcl_CreateObjCommand(interp, "nextgid", NextgidCmd, NULL, NULL);582 Tcl_CreateObjCommand(interp, "md5", MD5Cmd, NULL, NULL);583 Tcl_CreateObjCommand(interp, "xinstall", InstallCmd, NULL, NULL);584 Tcl_CreateObjCommand(interp, "fs-traverse", FsTraverseCmd, NULL, NULL);585 Tcl_CreateObjCommand(interp, "filemap", FilemapCmd, NULL, NULL);586 Tcl_CreateObjCommand(interp, "rpm-vercomp", RPMVercompCmd, NULL, NULL);587 Tcl_CreateObjCommand(interp, "rmd160", RMD160Cmd, NULL, NULL);588 Tcl_CreateObjCommand(interp, "sha256", SHA256Cmd, NULL, NULL);589 Tcl_CreateObjCommand(interp, "base32encode", Base32EncodeCmd, NULL, NULL);590 Tcl_CreateObjCommand(interp, "base32decode", Base32DecodeCmd, NULL, NULL);591 Tcl_CreateObjCommand(interp, "sha1", SHA1Cmd, NULL, NULL);592 Tcl_CreateObjCommand(interp, "umask", UmaskCmd, NULL, NULL);593 Tcl_CreateObjCommand(interp, "pipe", PipeCmd, NULL, NULL);594 Tcl_CreateObjCommand(interp, "curl", CurlCmd, NULL, NULL);595 Tcl_CreateObjCommand(interp, "symlink", CreateSymlinkCmd, NULL, NULL);596 Tcl_CreateObjCommand(interp, "unsetenv", UnsetEnvCmd, NULL, NULL);597 Tcl_CreateObjCommand(interp, "lchown", lchownCmd, NULL, NULL);598 Tcl_CreateObjCommand(interp, "fileIsBinary", fileIsBinaryCmd, NULL, NULL);599 Tcl_CreateObjCommand(interp, "realpath", RealpathCmd, NULL, NULL);600 601 Tcl_CreateObjCommand(interp, "readline", ReadlineCmd, NULL, NULL);602 Tcl_CreateObjCommand(interp, "rl_history", RLHistoryCmd, NULL, NULL);603 604 Tcl_CreateObjCommand(interp, "getuid", getuidCmd, NULL, NULL);605 Tcl_CreateObjCommand(interp, "geteuid", geteuidCmd, NULL, NULL);606 Tcl_CreateObjCommand(interp, "getgid", getgidCmd, NULL, NULL);607 Tcl_CreateObjCommand(interp, "getegid", getegidCmd, NULL, NULL);608 Tcl_CreateObjCommand(interp, "setuid", setuidCmd, NULL, NULL);609 Tcl_CreateObjCommand(interp, "seteuid", seteuidCmd, NULL, NULL);610 Tcl_CreateObjCommand(interp, "setgid", setgidCmd, NULL, NULL);611 Tcl_CreateObjCommand(interp, "setegid", setegidCmd, NULL, NULL);612 Tcl_CreateObjCommand(interp, "name_to_uid", name_to_uidCmd, NULL, NULL);613 Tcl_CreateObjCommand(interp, "uid_to_name", uid_to_nameCmd, NULL, NULL);614 Tcl_CreateObjCommand(interp, "uname_to_gid", uname_to_gidCmd, NULL, NULL);615 Tcl_CreateObjCommand(interp, "name_to_gid", name_to_gidCmd, NULL, NULL);616 Tcl_CreateObjCommand(interp, "gid_to_name", gid_to_nameCmd, NULL, NULL);617 618 Tcl_CreateObjCommand(interp, "tracelib", TracelibCmd, NULL, NULL);619 Tcl_CreateObjCommand(interp, "isatty", IsattyCmd, NULL, NULL);620 Tcl_CreateObjCommand(interp, "term_get_size", TermGetSizeCmd, NULL, NULL);621 622 if (Tcl_PkgProvide(interp, "Pextlib", "1.0") != TCL_OK)623 return TCL_ERROR;624 625 return TCL_OK;626 } 568 if (Tcl_InitStubs(interp, "8.4", 0) == NULL) 569 return TCL_ERROR; 570 571 Tcl_CreateObjCommand(interp, "system", SystemCmd, NULL, NULL); 572 Tcl_CreateObjCommand(interp, "flock", FlockCmd, NULL, NULL); 573 Tcl_CreateObjCommand(interp, "readdir", ReaddirCmd, NULL, NULL); 574 Tcl_CreateObjCommand(interp, "strsed", StrsedCmd, NULL, NULL); 575 Tcl_CreateObjCommand(interp, "mkstemp", MkstempCmd, NULL, NULL); 576 Tcl_CreateObjCommand(interp, "mktemp", MktempCmd, NULL, NULL); 577 Tcl_CreateObjCommand(interp, "mkdtemp", MkdtempCmd, NULL, NULL); 578 Tcl_CreateObjCommand(interp, "existsuser", ExistsuserCmd, NULL, NULL); 579 Tcl_CreateObjCommand(interp, "existsgroup", ExistsgroupCmd, NULL, NULL); 580 Tcl_CreateObjCommand(interp, "nextuid", NextuidCmd, NULL, NULL); 581 Tcl_CreateObjCommand(interp, "nextgid", NextgidCmd, NULL, NULL); 582 Tcl_CreateObjCommand(interp, "md5", MD5Cmd, NULL, NULL); 583 Tcl_CreateObjCommand(interp, "xinstall", InstallCmd, NULL, NULL); 584 Tcl_CreateObjCommand(interp, "fs-traverse", FsTraverseCmd, NULL, NULL); 585 Tcl_CreateObjCommand(interp, "filemap", FilemapCmd, NULL, NULL); 586 Tcl_CreateObjCommand(interp, "rpm-vercomp", RPMVercompCmd, NULL, NULL); 587 Tcl_CreateObjCommand(interp, "rmd160", RMD160Cmd, NULL, NULL); 588 Tcl_CreateObjCommand(interp, "sha256", SHA256Cmd, NULL, NULL); 589 Tcl_CreateObjCommand(interp, "base32encode", Base32EncodeCmd, NULL, NULL); 590 Tcl_CreateObjCommand(interp, "base32decode", Base32DecodeCmd, NULL, NULL); 591 Tcl_CreateObjCommand(interp, "sha1", SHA1Cmd, NULL, NULL); 592 Tcl_CreateObjCommand(interp, "umask", UmaskCmd, NULL, NULL); 593 Tcl_CreateObjCommand(interp, "pipe", PipeCmd, NULL, NULL); 594 Tcl_CreateObjCommand(interp, "curl", CurlCmd, NULL, NULL); 595 Tcl_CreateObjCommand(interp, "symlink", CreateSymlinkCmd, NULL, NULL); 596 Tcl_CreateObjCommand(interp, "unsetenv", UnsetEnvCmd, NULL, NULL); 597 Tcl_CreateObjCommand(interp, "lchown", lchownCmd, NULL, NULL); 598 Tcl_CreateObjCommand(interp, "fileIsBinary", fileIsBinaryCmd, NULL, NULL); 599 Tcl_CreateObjCommand(interp, "realpath", RealpathCmd, NULL, NULL); 600 601 Tcl_CreateObjCommand(interp, "readline", ReadlineCmd, NULL, NULL); 602 Tcl_CreateObjCommand(interp, "rl_history", RLHistoryCmd, NULL, NULL); 603 604 Tcl_CreateObjCommand(interp, "getuid", getuidCmd, NULL, NULL); 605 Tcl_CreateObjCommand(interp, "geteuid", geteuidCmd, NULL, NULL); 606 Tcl_CreateObjCommand(interp, "getgid", getgidCmd, NULL, NULL); 607 Tcl_CreateObjCommand(interp, "getegid", getegidCmd, NULL, NULL); 608 Tcl_CreateObjCommand(interp, "setuid", setuidCmd, NULL, NULL); 609 Tcl_CreateObjCommand(interp, "seteuid", seteuidCmd, NULL, NULL); 610 Tcl_CreateObjCommand(interp, "setgid", setgidCmd, NULL, NULL); 611 Tcl_CreateObjCommand(interp, "setegid", setegidCmd, NULL, NULL); 612 Tcl_CreateObjCommand(interp, "name_to_uid", name_to_uidCmd, NULL, NULL); 613 Tcl_CreateObjCommand(interp, "uid_to_name", uid_to_nameCmd, NULL, NULL); 614 Tcl_CreateObjCommand(interp, "uname_to_gid", uname_to_gidCmd, NULL, NULL); 615 Tcl_CreateObjCommand(interp, "name_to_gid", name_to_gidCmd, NULL, NULL); 616 Tcl_CreateObjCommand(interp, "gid_to_name", gid_to_nameCmd, NULL, NULL); 617 618 Tcl_CreateObjCommand(interp, "tracelib", TracelibCmd, NULL, NULL); 619 Tcl_CreateObjCommand(interp, "isatty", IsattyCmd, NULL, NULL); 620 Tcl_CreateObjCommand(interp, "term_get_size", TermGetSizeCmd, NULL, NULL); 621 622 if (Tcl_PkgProvide(interp, "Pextlib", "1.0") != TCL_OK) 623 return TCL_ERROR; 624 625 return TCL_OK; 626 }
Note: See TracChangeset
for help on using the changeset viewer.

