Polished txt and finally threw out getter functions
This commit is contained in:
parent
acaba76cda
commit
13b9f910e1
@ -12,7 +12,7 @@ has to take some extra precautions to participate.
|
|||||||
If a program does not feel vulnerable to disturbance, then the precautions
|
If a program does not feel vulnerable to disturbance, then the precautions
|
||||||
impose much less effort than if the program feels the need for protection.
|
impose much less effort than if the program feels the need for protection.
|
||||||
|
|
||||||
Two levels are specified:
|
Two locking strategies are specified:
|
||||||
DDLP-A operates on device files only. It is very Linux specific.
|
DDLP-A operates on device files only. It is very Linux specific.
|
||||||
DDLP-B adds proxy lock files, inspired by FHS /var/lock standard.
|
DDLP-B adds proxy lock files, inspired by FHS /var/lock standard.
|
||||||
|
|
||||||
@ -30,9 +30,9 @@ So this is advisory and exclusive locking.
|
|||||||
With kernel 2.6 it seems to work on all device drivers which might get used
|
With kernel 2.6 it seems to work on all device drivers which might get used
|
||||||
to access a CD/DVD drive.
|
to access a CD/DVD drive.
|
||||||
|
|
||||||
The vulnerable programs do not start their operation before they occupied a
|
The vulnerable programs shall not start their operation before they occupied a
|
||||||
wide collection of drive representations.
|
wide collection of drive representations.
|
||||||
Non-vulnerable programs take care to detect the occupation of _one_ such
|
Non-vulnerable programs shall take care to detect the occupation of _one_ such
|
||||||
representation.
|
representation.
|
||||||
|
|
||||||
So for Friendly Programs
|
So for Friendly Programs
|
||||||
|
@ -16,8 +16,6 @@
|
|||||||
#include <sys/ioctl.h>
|
#include <sys/ioctl.h>
|
||||||
#include <scsi/scsi.h>
|
#include <scsi/scsi.h>
|
||||||
|
|
||||||
/* No getter functions. This makes the compiled code leaner. */
|
|
||||||
#define DDLPA_H_NOT_ENCAPSULATED 1
|
|
||||||
|
|
||||||
/* All callers of ddlpa must do this */
|
/* All callers of ddlpa must do this */
|
||||||
#include "ddlpa.h"
|
#include "ddlpa.h"
|
||||||
@ -322,6 +320,9 @@ static int ddlpa_std_by_btl(struct ddlpa_lock *o)
|
|||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* >>> add more info about busy and forbidden paths */
|
||||||
|
|
||||||
return ENOENT;
|
return ENOENT;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -344,7 +345,8 @@ static int ddlpa_open_all(struct ddlpa_lock *o)
|
|||||||
/* There may be the same rdev but different inode. */
|
/* There may be the same rdev but different inode. */
|
||||||
no_o_excl = (o->sibling_rdevs[i] == o->rdev);
|
no_o_excl = (o->sibling_rdevs[i] == o->rdev);
|
||||||
|
|
||||||
/* Look for multiply registered device drivers */
|
/* Look for multiply registered device drivers with
|
||||||
|
distinct inodes. */
|
||||||
for (j = 0; j < i; j++) {
|
for (j = 0; j < i; j++) {
|
||||||
if (o->sibling_devs[j] == o->sibling_devs[i] &&
|
if (o->sibling_devs[j] == o->sibling_devs[i] &&
|
||||||
o->sibling_inodes[j] == o->sibling_inodes[i])
|
o->sibling_inodes[j] == o->sibling_inodes[i])
|
||||||
@ -467,40 +469,10 @@ int ddlpa_lock_btl(int bus, int target, int lun,
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
#ifndef DDLPA_H_NOT_ENCAPSULATED
|
#ifdef DDLPA_C_STANDALONE
|
||||||
|
|
||||||
int ddlpa_get_fd(struct ddlpa_lock *lockbundle)
|
|
||||||
{
|
|
||||||
/* >>> */
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
char *ddlpa_get_fd_path(struct ddlpa_lock *lockbundle)
|
|
||||||
{
|
|
||||||
/* >>> */
|
|
||||||
return "none";
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
int ddlpa_get_siblings(struct ddlpa_lock *lockbundle,
|
|
||||||
char **std_path, int *num_siblings,
|
|
||||||
char ***sibling_paths, int **sibling_fds)
|
|
||||||
{
|
|
||||||
*num_siblings = 0;
|
|
||||||
|
|
||||||
/* >>> */
|
|
||||||
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* ! DDLPA_H_NOT_ENCAPSULATED */
|
|
||||||
|
|
||||||
|
|
||||||
/* ----------------------------- Test / Demo -------------------------- */
|
/* ----------------------------- Test / Demo -------------------------- */
|
||||||
|
|
||||||
#ifdef DDLPA_C_STANDALONE
|
|
||||||
|
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
{
|
{
|
||||||
@ -520,14 +492,19 @@ usage:;
|
|||||||
|
|
||||||
if (my_path[0] != '/' && my_path[0] != '.' &&
|
if (my_path[0] != '/' && my_path[0] != '.' &&
|
||||||
strchr(my_path, ',') != NULL) {
|
strchr(my_path, ',') != NULL) {
|
||||||
/* cdrecord style dev=Bus,Target,Lun */
|
/*
|
||||||
|
cdrecord style dev=Bus,Target,Lun
|
||||||
|
*/
|
||||||
|
|
||||||
sscanf(my_path, "%d,%d,%d", &bus, &target, &lun);
|
sscanf(my_path, "%d,%d,%d", &bus, &target, &lun);
|
||||||
ret = ddlpa_lock_btl(bus, target, lun, O_RDWR, 0, &lck,
|
ret = ddlpa_lock_btl(bus, target, lun, O_RDWR, 0, &lck,
|
||||||
&errmsg);
|
&errmsg);
|
||||||
} else {
|
} else {
|
||||||
/* This substitutes for:
|
/*
|
||||||
|
This substitutes for:
|
||||||
fd = open(my_path, O_RDWR | O_EXCL);
|
fd = open(my_path, O_RDWR | O_EXCL);
|
||||||
*/
|
*/
|
||||||
|
|
||||||
ret = ddlpa_lock_path(my_path, O_RDWR, 0, &lck, &errmsg);
|
ret = ddlpa_lock_path(my_path, O_RDWR, 0, &lck, &errmsg);
|
||||||
}
|
}
|
||||||
if (ret) {
|
if (ret) {
|
||||||
@ -537,7 +514,7 @@ usage:;
|
|||||||
errmsg);
|
errmsg);
|
||||||
free(errmsg);
|
free(errmsg);
|
||||||
fprintf(stderr, "Error condition : %d '%s'\n",
|
fprintf(stderr, "Error condition : %d '%s'\n",
|
||||||
errno, strerror(errno));
|
ret, strerror(ret));
|
||||||
exit(2);
|
exit(2);
|
||||||
}
|
}
|
||||||
fd = lck->fd;
|
fd = lck->fd;
|
||||||
|
@ -3,28 +3,14 @@
|
|||||||
Implementation of Delicate Device Locking Protocol level A.
|
Implementation of Delicate Device Locking Protocol level A.
|
||||||
Copyright (C) 2007 Thomas Schmitt <scdbackup@gmx.net>
|
Copyright (C) 2007 Thomas Schmitt <scdbackup@gmx.net>
|
||||||
Provided under any of the following licenses: GPL, LGPL, BSD. Choose one.
|
Provided under any of the following licenses: GPL, LGPL, BSD. Choose one.
|
||||||
|
|
||||||
|
See ../doc/ddlp.txt for a description of the protocol.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef DDLPA_H_INCLUDED
|
#ifndef DDLPA_H_INCLUDED
|
||||||
#define DDLPA_H_INCLUDED 1
|
#define DDLPA_H_INCLUDED 1
|
||||||
|
|
||||||
|
|
||||||
/* >>> For now : do not encapsulate the details of struct ddlpa_lock */
|
|
||||||
#ifndef DDLPA_H_NOT_ENCAPSULATED
|
|
||||||
#define DDLPA_H_NOT_ENCAPSULATED 1
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DDLPA_H_NOT_ENCAPSULATED
|
|
||||||
|
|
||||||
/** Container for locking state and parameters.
|
|
||||||
*/
|
|
||||||
struct ddlpa_lock;
|
|
||||||
|
|
||||||
|
|
||||||
#else /* ! DDLPA_H_NOT_ENCAPSULATED */
|
|
||||||
|
|
||||||
|
|
||||||
/* An upper limit for the length of standard paths and sibling paths */
|
/* An upper limit for the length of standard paths and sibling paths */
|
||||||
#define DDLPA_MAX_STD_LEN 15
|
#define DDLPA_MAX_STD_LEN 15
|
||||||
|
|
||||||
@ -60,8 +46,6 @@ struct ddlpa_lock {
|
|||||||
char *errmsg;
|
char *errmsg;
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif /* DDLPA_H_NOT_ENCAPSULATED */
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
/** Lock a recorder by naming a device file path. Allocate a new container.
|
/** Lock a recorder by naming a device file path. Allocate a new container.
|
||||||
@ -71,12 +55,11 @@ struct ddlpa_lock {
|
|||||||
@param ddlpa_flags 0 = default behavior: the standard path will be opened
|
@param ddlpa_flags 0 = default behavior: the standard path will be opened
|
||||||
and treated by fcntl(F_SETLK)
|
and treated by fcntl(F_SETLK)
|
||||||
DDLPA_OPEN_GIVEN_PATH causes the input parameter "path"
|
DDLPA_OPEN_GIVEN_PATH causes the input parameter "path"
|
||||||
to be used with open(2) and fcntl(2). Caution: This
|
to be used with open(2) and fcntl(2).
|
||||||
weakens the fcntl part of DDLP-A.
|
|
||||||
DDLPA_ALLOW_MISSING_SGRCD allows to grant a lock
|
DDLPA_ALLOW_MISSING_SGRCD allows to grant a lock
|
||||||
although not both, a sg and a sr|scd device, have been
|
although not all three, a sg, a sr and a scd device
|
||||||
found during sibling search. Normally this is counted
|
file have been found during sibling search. Normally
|
||||||
as failure due to EBUSY.
|
this is counted as failure due to EBUSY.
|
||||||
@param lockbundle gets allocated and then represents the locking state
|
@param lockbundle gets allocated and then represents the locking state
|
||||||
@param errmsg if *errmsg is not NULL after the call, it contains an
|
@param errmsg if *errmsg is not NULL after the call, it contains an
|
||||||
error message. Then to be released by free(3).
|
error message. Then to be released by free(3).
|
||||||
@ -113,42 +96,6 @@ int ddlpa_destroy(struct ddlpa_lock **lockbundle);
|
|||||||
|
|
||||||
|
|
||||||
|
|
||||||
#ifndef DDLPA_H_NOT_ENCAPSULATED
|
|
||||||
|
|
||||||
/** Obtain the file descriptor for doing serious work on the recorder.
|
|
||||||
@param lockbundle the lock which has been activated either by
|
|
||||||
ddlpa_lock_path() or ddlpa_lock_btl()
|
|
||||||
@return the file descriptor
|
|
||||||
*/
|
|
||||||
int ddlpa_get_fd(struct ddlpa_lock *lockbundle);
|
|
||||||
|
|
||||||
/** Obtain the path which was used to open the file descriptor.
|
|
||||||
@param lockbundle the lock
|
|
||||||
@return a pointer to the path string.
|
|
||||||
Do not alter that string ! Do not free(3) it !
|
|
||||||
*/
|
|
||||||
char *ddlpa_get_fd_path(struct ddlpa_lock *lockbundle);
|
|
||||||
|
|
||||||
|
|
||||||
/* Obtain info about the standard path and eventual locked siblings.
|
|
||||||
@param lockbundle the lock to inquire
|
|
||||||
@param std_path a pointer to the string with the standard path.
|
|
||||||
Do not alter that string ! Do not free(3) it !
|
|
||||||
@param num_siblings Tells the number of elements in sibling_*[].
|
|
||||||
0 and 1 will be the most frequent values.
|
|
||||||
@param sibling_paths Tells the device file paths of the opened sibling
|
|
||||||
device representations
|
|
||||||
Do not alter those strings ! Do not free(3) them !
|
|
||||||
@param sibling_fds Contains the opened file descriptors on sibling_paths
|
|
||||||
@return 0=success , 1=failure (will hardly happen)
|
|
||||||
*/
|
|
||||||
int ddlpa_get_siblings(struct ddlpa_lock *lockbundle,
|
|
||||||
char **std_path, int *num_siblings,
|
|
||||||
char ***sibling_paths, int **sibling_fds);
|
|
||||||
|
|
||||||
#endif /* ! DDLPA_H_NOT_ENCAPSULATED */
|
|
||||||
|
|
||||||
|
|
||||||
/** Definitions of macros used in above functions */
|
/** Definitions of macros used in above functions */
|
||||||
|
|
||||||
#define DDLPA_OPEN_GIVEN_PATH 1
|
#define DDLPA_OPEN_GIVEN_PATH 1
|
||||||
|
Loading…
Reference in New Issue
Block a user