Пример #1
0
 void push(int data){
     int parent = PARENT(size);
     int idx = size;
     arr[size] = data;
     while (!ISROOT(idx) && arr[parent] < arr[idx]){
         swap(arr[parent], arr[idx]);
         idx = parent;
         parent = PARENT(parent);
     }
     size++;
 }
Пример #2
0
/************************************************************************
 * iumfs_make_directory_with_name()
 *
 *   名前付で新しいディレクトリを作成する。
 *   内部で、iumfs_make_directory() を呼び、かつ iumnode 構造体の pathname
 *   に新しいディレクトリのパス名をセットする。
 *   
 * 引数:
 *
 *     vfsp    : vfs 構造体
 *     vpp     : 呼び出し側から渡された vnode 構造体のポインタのアドレス
 *     mvp     : ディレクトリマウントポイントの vnode 構造体のポインタ
 *     cr      : システムコールを呼び出したユーザのクレデンシャル
 *     dirname : 新しいディレクトリの名前
 *     nodeid  : 新しいディレクトリがもつ node 番号(0だと自動割当)
 *
 * 戻り値:
 *
 *     成功時   : SUCCESS(=0)
 *     エラー時 : エラー番号
 *     
 ************************************************************************/
int
iumfs_make_directory_with_name(vfs_t *vfsp, vnode_t **vpp, vnode_t *parentvp,
                               struct cred *cr, char *dirname, ino_t nodeid)
{
    int err = SUCCESS;
    iumnode_t *newdirinp; // 新しいディレクトリの iumnode(ノード情報)
    vnode_t *newdirvp; // 新しいディレクトリの vnode
    iumnode_t *parentinp; // 親ディレクトリの iumnode(ノード情報)
    int namelen;

    DEBUG_PRINT((CE_CONT, "iumfs_make_directory_with_name is called\n"));

    parentinp = VNODE2IUMNODE(parentvp);

    /*
     * まずは、渡されたディレクトリ名の長さをチェック
     */
    namelen = strlen(dirname);
    if (namelen > MAXNAMLEN) {
        DEBUG_PRINT((CE_CONT, "iumfs_make_directory_with_name: return(ENAMETOOLONG)\n"));
        return (ENAMETOOLONG);
    }
    /*
     * つづいて、パス名の長さもチェック
     */
    if (strlen(parentinp->pathname) + namelen > IUMFS_MAXPATHLEN) {
        DEBUG_PRINT((CE_CONT, "iumfs_make_directory_with_name: return(ENAMETOOLONG)\n"));
        return (ENAMETOOLONG);
    }

    /*
     * iumfs_make_directory() を呼び新規ディレクトリを作成する。
     */
    err = iumfs_make_directory(vfsp, vpp, parentvp, cr, nodeid);
    if (err) {
        DEBUG_PRINT((CE_CONT, "iumfs_make_directory_with_name: return(%d)\n", err));
        return (err);
    }

    /*
     * 新しいディレクトリのパス名をセットする。
     * パス名は「親ディレクトリのパス名 + 新しいディレクトリ名」
     * もし親ディレクトリがファイルシステムルートだったら、余計な「/」はつけない。
     */
    newdirvp = *vpp;
    newdirinp = VNODE2IUMNODE(newdirvp);
    if (ISROOT(parentinp->pathname))
        snprintf(newdirinp->pathname, IUMFS_MAXPATHLEN, "/%s", dirname);        
    else
        snprintf(newdirinp->pathname, IUMFS_MAXPATHLEN, "%s/%s", parentinp->pathname, dirname);
    
    DEBUG_PRINT((CE_CONT, "iumfs_make_directory_with_name: return(0)\n"));
    return (0);
}