11dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project/* 21dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project 31dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * All rights reserved. 41dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 51dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * Redistribution and use in source and binary forms, with or without 61dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * modification, are permitted provided that the following conditions 71dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * are met: 81dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions of source code must retain the above copyright 91dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer. 101dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * * Redistributions in binary form must reproduce the above copyright 111dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * notice, this list of conditions and the following disclaimer in 121dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * the documentation and/or other materials provided with the 131dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * distribution. 141dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * 151dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 161dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 171dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS 181dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE 191dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, 201dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, 211dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS 221dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED 231dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, 241dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT 251dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 261dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project * SUCH DAMAGE. 271dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project */ 281dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <libgen.h> 291dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <errno.h> 301dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <string.h> 311dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project#include <sys/param.h> 321dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 331dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectint 341dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Projectbasename_r(const char* path, char* buffer, size_t bufflen) 351dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project{ 361dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project const char *endp, *startp; 371dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project int len, result; 381dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project char temp[2]; 391dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 401dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Empty or NULL string gets treated as "." */ 411dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (path == NULL || *path == '\0') { 421dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project startp = "."; 431dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len = 1; 441dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto Exit; 451dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 461dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 471dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Strip trailing slashes */ 481dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project endp = path + strlen(path) - 1; 491dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (endp > path && *endp == '/') 501dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project endp--; 511dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 521dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* All slashes becomes "/" */ 531dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (endp == path && *endp == '/') { 541dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project startp = "/"; 551dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len = 1; 561dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project goto Exit; 571dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 581dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 591dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project /* Find the start of the base */ 601dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project startp = endp; 611dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project while (startp > path && *(startp - 1) != '/') 621dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project startp--; 631dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 641dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len = endp - startp +1; 651dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 661dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source ProjectExit: 671dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = len; 681dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (buffer == NULL) { 691dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return result; 701dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 711dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (len > (int)bufflen-1) { 721dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project len = (int)bufflen-1; 731dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project result = -1; 741dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project errno = ERANGE; 751dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 761dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project 771dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project if (len >= 0) { 781dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project memcpy( buffer, startp, len ); 791dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project buffer[len] = 0; 801dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project } 811dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project return result; 821dc9e472e19acfe6dc7f41e429236e7eef7ceda1The Android Open Source Project} 83