Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  svcshare.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0
/*
 * linux/fs/lockd/svcshare.c
 *
 * Management of DOS shares.
 *
 * Copyright (C) 1996 Olaf Kirch <okir@monad.swb.de>
 */


#include <linux/time.h>
#include <linux/unistd.h>
#include <linux/string.h>
#include <linux/slab.h>

#include <linux/sunrpc/clnt.h>
#include <linux/sunrpc/svc.h>
#include <linux/lockd/lockd.h>
#include <linux/lockd/share.h>

static inline int
nlm_cmp_owner(struct nlm_share *share, struct xdr_netobj *oh)
{
 return share->s_owner.len == oh->len
     && !memcmp(share->s_owner.data, oh->data, oh->len);
}

__be32
nlmsvc_share_file(struct nlm_host *host, struct nlm_file *file,
   struct nlm_args *argp)
{
 struct nlm_share *share;
 struct xdr_netobj *oh = &argp->lock.oh;
 u8   *ohdata;

 for (share = file->f_shares; share; share = share->s_next) {
  if (share->s_host == host && nlm_cmp_owner(share, oh))
   goto update;
  if ((argp->fsm_access & share->s_mode)
   || (argp->fsm_mode   & share->s_access ))
   return nlm_lck_denied;
 }

 share = kmalloc(sizeof(*share) + oh->len,
      GFP_KERNEL);
 if (share == NULL)
  return nlm_lck_denied_nolocks;

 /* Copy owner handle */
 ohdata = (u8 *) (share + 1);
 memcpy(ohdata, oh->data, oh->len);

 share->s_file     = file;
 share->s_host       = host;
 share->s_owner.data = ohdata;
 share->s_owner.len  = oh->len;
 share->s_next       = file->f_shares;
 file->f_shares      = share;

update:
 share->s_access = argp->fsm_access;
 share->s_mode   = argp->fsm_mode;
 return nlm_granted;
}

/*
 * Delete a share.
 */

__be32
nlmsvc_unshare_file(struct nlm_host *host, struct nlm_file *file,
   struct nlm_args *argp)
{
 struct nlm_share *share, **shpp;
 struct xdr_netobj *oh = &argp->lock.oh;

 for (shpp = &file->f_shares; (share = *shpp) != NULL;
     shpp = &share->s_next) {
  if (share->s_host == host && nlm_cmp_owner(share, oh)) {
   *shpp = share->s_next;
   kfree(share);
   return nlm_granted;
  }
 }

 /* X/Open spec says return success even if there was no
 * corresponding share. */

 return nlm_granted;
}

/*
 * Traverse all shares for a given file, and delete
 * those owned by the given (type of) host
 */

void nlmsvc_traverse_shares(struct nlm_host *host, struct nlm_file *file,
  nlm_host_match_fn_t match)
{
 struct nlm_share *share, **shpp;

 shpp = &file->f_shares;
 while ((share = *shpp) !=  NULL) {
  if (match(share->s_host, host)) {
   *shpp = share->s_next;
   kfree(share);
   continue;
  }
  shpp = &share->s_next;
 }
}

Messung V0.5
C=93 H=93 G=92

¤ Dauer der Verarbeitung: 0.23 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge